quota: do not pull in quota tools for mounts that do not originate in neither /etc/fstab nor fragment files

This commit is contained in:
Lennart Poettering 2011-03-30 01:53:34 +02:00
parent 72bc8d0056
commit cb39ed3fde
2 changed files with 77 additions and 69 deletions

6
TODO
View File

@ -29,8 +29,6 @@ F15:
* disable /dev/console status messages after plymouth went down
* quotacheck pulled in too often
Features:
* when key file cannot be found, read it from kbd in cryptsetup
@ -168,10 +166,6 @@ Features:
* add separate man page for [Install] settings
* only add quotacheck deps to .mount units which mention grpquota/usrquota in the mount flags
* systemctl condrestart should return 0 if service isn't running
* allow runtime changing of log level and target
External:

View File

@ -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(