X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fmount.c;h=5aa51dec5399352c69fd1867305882ffcce6d4f5;hb=b65a25f256505165660ab388d53446be17021d55;hp=28ed8c3ddcbd1558025010dc22836d4bd99e3c56;hpb=60b912f6b1c6bce67ec4a979594981f6a3b13987;p=elogind.git diff --git a/src/mount.c b/src/mount.c index 28ed8c3dd..5aa51dec5 100644 --- a/src/mount.c +++ b/src/mount.c @@ -333,7 +333,7 @@ static bool mount_is_bind(MountParameters *p) { static int mount_add_device_links(Mount *m) { MountParameters *p; - bool nofail, noauto; + int r; assert(m); @@ -344,18 +344,47 @@ static int mount_add_device_links(Mount *m) { else return 0; - if (!p->what || path_equal(m->where, "/")) + if (!p->what) return 0; - if (mount_is_bind(p)) - return 0; + if (!mount_is_bind(p) && !path_equal(m->where, "/")) { + bool nofail, noauto; - noauto = !!mount_test_option(p->options, MNTOPT_NOAUTO); - nofail = !!mount_test_option(p->options, "nofail"); + noauto = !!mount_test_option(p->options, MNTOPT_NOAUTO); + nofail = !!mount_test_option(p->options, "nofail"); + + if ((r = unit_add_node_link(UNIT(m), p->what, + !noauto && nofail && + UNIT(m)->meta.manager->running_as == MANAGER_SYSTEM)) < 0) + return r; + } + + if (p->passno > 0 && + UNIT(m)->meta.manager->running_as == MANAGER_SYSTEM && + !path_equal(m->where, "/")) { + char *name; + Unit *fsck; + /* Let's add in the fsck service */ + + /* aka SPECIAL_FSCK_SERVICE */ + if (!(name = unit_name_from_path_instance("fsck", p->what, ".service"))) + return -ENOMEM; - return unit_add_node_link(UNIT(m), p->what, - !noauto && nofail && - UNIT(m)->meta.manager->running_as == MANAGER_SYSTEM); + if ((r = manager_load_unit_prepare(m->meta.manager, name, NULL, NULL, &fsck)) < 0) { + log_warning("Failed to prepare unit %s: %s", name, strerror(-r)); + free(name); + return r; + } + + free(name); + + SERVICE(fsck)->fsck_passno = p->passno; + + if ((r = unit_add_two_dependencies(UNIT(m), UNIT_AFTER, UNIT_WANTS, fsck, true)) < 0) + return r; + } + + return 0; } static int mount_add_default_dependencies(Mount *m) { @@ -366,7 +395,7 @@ static int mount_add_default_dependencies(Mount *m) { if (m->meta.manager->running_as == MANAGER_SYSTEM && !path_equal(m->where, "/")) { - if ((r = unit_add_dependency_by_name(UNIT(m), UNIT_AFTER, SPECIAL_FSCK_TARGET, NULL, true)) < 0) + if ((r = unit_add_dependency_by_name(UNIT(m), UNIT_BEFORE, SPECIAL_QUOTACHECK_TARGET, NULL, true)) < 0) return r; if ((r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_BEFORE, UNIT_CONFLICTED_BY, SPECIAL_UMOUNT_TARGET, NULL, true)) < 0) @@ -1161,6 +1190,7 @@ static int mount_add_one( const char *where, const char *options, const char *fstype, + int passno, bool from_proc_self_mountinfo, bool set_flags) { int r; @@ -1248,6 +1278,8 @@ static int mount_add_one( free(p->fstype); p->fstype = f; + p->passno = passno; + unit_add_to_dbus_queue(u); return 0; @@ -1381,7 +1413,7 @@ static int mount_load_etc_fstab(Manager *m) { !!mount_test_option(me->mnt_opts, "comment=systemd.swapon"), false); } else - k = mount_add_one(m, what, where, me->mnt_opts, me->mnt_type, false, false); + k = mount_add_one(m, what, where, me->mnt_opts, me->mnt_type, me->mnt_passno, false, false); free(what); free(where); @@ -1447,7 +1479,7 @@ static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) { goto finish; } - if ((k = mount_add_one(m, d, p, o, fstype, true, set_flags)) < 0) + if ((k = mount_add_one(m, d, p, o, fstype, 0, true, set_flags)) < 0) r = k; clean_up: @@ -1496,7 +1528,7 @@ static int mount_enumerate(Manager *m) { m->mount_watch.fd = fileno(m->proc_self_mountinfo); zero(ev); - ev.events = EPOLLERR; + ev.events = EPOLLPRI; ev.data.ptr = &m->mount_watch; if (epoll_ctl(m->epoll_fd, EPOLL_CTL_ADD, m->mount_watch.fd, &ev) < 0) @@ -1521,7 +1553,7 @@ void mount_fd_event(Manager *m, int events) { int r; assert(m); - assert(events == EPOLLERR); + assert(events & EPOLLPRI); /* The manager calls this for every fd event happening on the * /proc/self/mountinfo file, which informs us about mounting