X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcore%2Fmount.c;h=70cd372e1053f6775dd110d3def5ff53173502c2;hb=da7e457c5b9339721454ae8401a03ffdd781e6a9;hp=3d46557fb1d42864fcfac04006fb21f8ba7f1d3e;hpb=a57f7e2c828b852eb32fd810dcea041bb2975501;p=elogind.git diff --git a/src/core/mount.c b/src/core/mount.c index 3d46557fb..70cd372e1 100644 --- a/src/core/mount.c +++ b/src/core/mount.c @@ -59,6 +59,72 @@ static const UnitActiveState state_translation_table[_MOUNT_STATE_MAX] = { [MOUNT_FAILED] = UNIT_FAILED }; +static char* mount_test_option(const char *haystack, const char *needle) { + struct mntent me = { .mnt_opts = (char*) haystack }; + + assert(needle); + + /* Like glibc's hasmntopt(), but works on a string, not a + * struct mntent */ + + if (!haystack) + return NULL; + + return hasmntopt(&me, needle); +} + +static bool mount_is_network(MountParameters *p) { + assert(p); + + if (mount_test_option(p->options, "_netdev")) + return true; + + if (p->fstype && fstype_is_network(p->fstype)) + return true; + + return false; +} + +static bool mount_is_bind(MountParameters *p) { + assert(p); + + if (mount_test_option(p->options, "bind")) + return true; + + if (p->fstype && streq(p->fstype, "bind")) + return true; + + if (mount_test_option(p->options, "rbind")) + return true; + + if (p->fstype && streq(p->fstype, "rbind")) + return true; + + return false; +} + +static bool mount_is_auto(MountParameters *p) { + assert(p); + + return !mount_test_option(p->options, "noauto"); +} + +static bool needs_quota(MountParameters *p) { + assert(p); + + if (mount_is_network(p)) + return false; + + if (mount_is_bind(p)) + return false; + + return mount_test_option(p->options, "usrquota") || + mount_test_option(p->options, "grpquota") || + mount_test_option(p->options, "quota") || + mount_test_option(p->options, "usrjquota") || + mount_test_option(p->options, "grpjquota"); +} + static void mount_init(Unit *u) { Mount *m = MOUNT(u); @@ -182,7 +248,10 @@ static int mount_add_mount_links(Mount *m) { * for the source path (if this is a bind mount) to be * available. */ pm = get_mount_parameters_fragment(m); - if (pm && path_is_absolute(pm->what)) { + if (pm && pm->what && + path_is_absolute(pm->what) && + !mount_is_network(pm)) { + r = unit_require_mounts_for(UNIT(m), pm->what); if (r < 0) return r; @@ -214,72 +283,6 @@ static int mount_add_mount_links(Mount *m) { return 0; } -static char* mount_test_option(const char *haystack, const char *needle) { - struct mntent me = { .mnt_opts = (char*) haystack }; - - assert(needle); - - /* Like glibc's hasmntopt(), but works on a string, not a - * struct mntent */ - - if (!haystack) - return NULL; - - return hasmntopt(&me, needle); -} - -static bool mount_is_network(MountParameters *p) { - assert(p); - - if (mount_test_option(p->options, "_netdev")) - return true; - - if (p->fstype && fstype_is_network(p->fstype)) - return true; - - return false; -} - -static bool mount_is_bind(MountParameters *p) { - assert(p); - - if (mount_test_option(p->options, "bind")) - return true; - - if (p->fstype && streq(p->fstype, "bind")) - return true; - - if (mount_test_option(p->options, "rbind")) - return true; - - if (p->fstype && streq(p->fstype, "rbind")) - return true; - - return false; -} - -static bool mount_is_auto(MountParameters *p) { - assert(p); - - return !mount_test_option(p->options, "noauto"); -} - -static bool needs_quota(MountParameters *p) { - assert(p); - - if (mount_is_network(p)) - return false; - - if (mount_is_bind(p)) - return false; - - return mount_test_option(p->options, "usrquota") || - mount_test_option(p->options, "grpquota") || - mount_test_option(p->options, "quota") || - mount_test_option(p->options, "usrjquota") || - mount_test_option(p->options, "grpjquota"); -} - static int mount_add_device_links(Mount *m) { MountParameters *p; bool device_wants_mount = false; @@ -1440,6 +1443,9 @@ static int mount_add_one( u = manager_get_unit(m, e); if (!u) { + const char* const target = + fstype_is_network(fstype) ? SPECIAL_REMOTE_FS_TARGET : SPECIAL_LOCAL_FS_TARGET; + delete = true; u = unit_new(m, sizeof(Mount)); @@ -1466,7 +1472,7 @@ static int mount_add_one( goto fail; } - r = unit_add_dependency_by_name(u, UNIT_BEFORE, SPECIAL_LOCAL_FS_TARGET, NULL, true); + r = unit_add_dependency_by_name(u, UNIT_BEFORE, target, NULL, true); if (r < 0) goto fail;