summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mount.c140
1 files changed, 77 insertions, 63 deletions
diff --git a/src/mount.c b/src/mount.c
index 8528d17a80..209e19c175 100644
--- a/src/mount.c
+++ b/src/mount.c
@@ -128,6 +128,26 @@ static void mount_done(Unit *u) {
unit_unwatch_timer(u, &m->timer_watch);
}
+static MountParameters* get_mount_parameters_configured(Mount *m) {
+ assert(m);
+
+ if (m->from_fragment)
+ return &m->parameters_fragment;
+ else if (m->from_etc_fstab)
+ return &m->parameters_etc_fstab;
+
+ return NULL;
+}
+
+static MountParameters* get_mount_parameters(Mount *m) {
+ assert(m);
+
+ if (m->from_proc_self_mountinfo)
+ return &m->parameters_proc_self_mountinfo;
+
+ return get_mount_parameters_configured(m);
+}
+
static int mount_add_mount_links(Mount *m) {
Meta *other;
int r;
@@ -135,12 +155,7 @@ static int mount_add_mount_links(Mount *m) {
assert(m);
- if (m->from_fragment)
- pm = &m->parameters_fragment;
- else if (m->from_etc_fstab)
- pm = &m->parameters_etc_fstab;
- else
- pm = NULL;
+ pm = get_mount_parameters_configured(m);
/* Adds in links to other mount points that might lie below or
* above us in the hierarchy */
@@ -155,19 +170,14 @@ static int mount_add_mount_links(Mount *m) {
if (n->meta.load_state != UNIT_LOADED)
continue;
- if (n->from_fragment)
- pn = &n->parameters_fragment;
- else if (n->from_etc_fstab)
- pn = &n->parameters_etc_fstab;
- else
- pn = NULL;
+ pn = get_mount_parameters_configured(n);
if (path_startswith(m->where, n->where)) {
if ((r = unit_add_dependency(UNIT(m), UNIT_AFTER, UNIT(n), true)) < 0)
return r;
- if (n->from_etc_fstab || n->from_fragment)
+ if (pn)
if ((r = unit_add_dependency(UNIT(m), UNIT_REQUIRES, UNIT(n), true)) < 0)
return r;
@@ -176,7 +186,7 @@ static int mount_add_mount_links(Mount *m) {
if ((r = unit_add_dependency(UNIT(n), UNIT_AFTER, UNIT(m), true)) < 0)
return r;
- if (m->from_etc_fstab || m->from_fragment)
+ if (pm)
if ((r = unit_add_dependency(UNIT(n), UNIT_REQUIRES, UNIT(m), true)) < 0)
return r;
@@ -185,18 +195,16 @@ static int mount_add_mount_links(Mount *m) {
if ((r = unit_add_dependency(UNIT(m), UNIT_AFTER, UNIT(n), true)) < 0)
return r;
- if (m->from_etc_fstab || m->from_fragment)
- if ((r = unit_add_dependency(UNIT(m), UNIT_REQUIRES, UNIT(n), true)) < 0)
- return r;
+ if ((r = unit_add_dependency(UNIT(m), UNIT_REQUIRES, UNIT(n), true)) < 0)
+ return r;
} else if (pn && path_startswith(pn->what, m->where)) {
if ((r = unit_add_dependency(UNIT(n), UNIT_AFTER, UNIT(m), true)) < 0)
return r;
- if (n->from_etc_fstab || n->from_fragment)
- if ((r = unit_add_dependency(UNIT(n), UNIT_REQUIRES, UNIT(m), true)) < 0)
- return r;
+ if ((r = unit_add_dependency(UNIT(n), UNIT_REQUIRES, UNIT(m), true)) < 0)
+ return r;
}
}
@@ -272,6 +280,43 @@ static char* mount_test_option(const char *haystack, const char *needle) {
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;
+
+ return false;
+}
+
+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");
+}
+
static int mount_add_target_links(Mount *m) {
const char *target, *after = NULL;
MountParameters *p;
@@ -281,11 +326,7 @@ static int mount_add_target_links(Mount *m) {
assert(m);
- if (m->from_fragment)
- p = &m->parameters_fragment;
- else if (m->from_etc_fstab)
- p = &m->parameters_etc_fstab;
- else
+ if (!(p = get_mount_parameters_configured(m)))
return 0;
noauto = !!mount_test_option(p->options, MNTOPT_NOAUTO);
@@ -298,8 +339,7 @@ static int mount_add_target_links(Mount *m) {
mount_test_option(p->options, "comment=systemd.automount") ||
mount_test_option(p->options, "x-systemd-automount");
- if (mount_test_option(p->options, "_netdev") ||
- (p->fstype && fstype_is_network(p->fstype))) {
+ if (mount_is_network(p)) {
target = SPECIAL_REMOTE_FS_TARGET;
if (m->meta.manager->running_as == MANAGER_SYSTEM)
@@ -337,29 +377,13 @@ static int mount_add_target_links(Mount *m) {
}
}
-static bool mount_is_bind(MountParameters *p) {
- assert(p);
-
- if (p->fstype && streq(p->fstype, "bind"))
- return true;
-
- if (mount_test_option(p->options, "bind"))
- return true;
-
- return false;
-}
-
static int mount_add_device_links(Mount *m) {
MountParameters *p;
int r;
assert(m);
- if (m->from_fragment)
- p = &m->parameters_fragment;
- else if (m->from_etc_fstab)
- p = &m->parameters_etc_fstab;
- else
+ if (!(p = get_mount_parameters_configured(m)))
return 0;
if (!p->what)
@@ -415,20 +439,13 @@ static int mount_add_default_dependencies(Mount *m) {
!path_equal(m->where, "/")) {
MountParameters *p;
- if (m->from_fragment)
- p = &m->parameters_fragment;
- else if (m->from_etc_fstab)
- p = &m->parameters_etc_fstab;
- else
- p = NULL;
+ p = get_mount_parameters_configured(m);
- if (!p ||
- (!mount_test_option(p->options, "_netdev") &&
- !(p->fstype && fstype_is_network(p->fstype)) &&
- (mount_test_option(p->options, "usrquota") || mount_test_option(p->options, "grpquota"))))
+ if (p && needs_quota(p)) {
if ((r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_BEFORE, UNIT_WANTS, SPECIAL_QUOTACHECK_SERVICE, NULL, true)) < 0 ||
(r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_BEFORE, UNIT_WANTS, SPECIAL_QUOTAON_SERVICE, NULL, true)) < 0)
return r;
+ }
if ((r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_UMOUNT_TARGET, NULL, true)) < 0)
return r;
@@ -640,12 +657,7 @@ static void mount_dump(Unit *u, FILE *f, const char *prefix) {
assert(m);
assert(f);
- if (m->from_proc_self_mountinfo)
- p = &m->parameters_proc_self_mountinfo;
- else if (m->from_fragment)
- p = &m->parameters_fragment;
- else
- p = &m->parameters_etc_fstab;
+ p = get_mount_parameters(m);
fprintf(f,
"%sMount State: %s\n"
@@ -834,6 +846,7 @@ fail:
static void mount_enter_mounting(Mount *m) {
int r;
+ MountParameters *p;
assert(m);
@@ -842,9 +855,10 @@ static void mount_enter_mounting(Mount *m) {
mkdir_p(m->where, m->directory_mode);
- /* create the source directory for bind-mounts if needed */
- if (m->parameters_fragment.fstype && strcmp(m->parameters_fragment.fstype, "bind") == 0)
- mkdir_p(m->parameters_fragment.what, m->directory_mode);
+ /* Create the source directory for bind-mounts if needed */
+ p = get_mount_parameters_configured(m);
+ if (p && mount_is_bind(p))
+ mkdir_p(p->what, m->directory_mode);
if (m->from_fragment)
r = exec_command_set(