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 * disable /dev/console status messages after plymouth went down
* quotacheck pulled in too often
Features: Features:
* when key file cannot be found, read it from kbd in cryptsetup * when key file cannot be found, read it from kbd in cryptsetup
@ -168,10 +166,6 @@ Features:
* add separate man page for [Install] settings * 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 * allow runtime changing of log level and target
External: External:

View File

@ -128,6 +128,26 @@ static void mount_done(Unit *u) {
unit_unwatch_timer(u, &m->timer_watch); 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) { static int mount_add_mount_links(Mount *m) {
Meta *other; Meta *other;
int r; int r;
@ -135,12 +155,7 @@ static int mount_add_mount_links(Mount *m) {
assert(m); assert(m);
if (m->from_fragment) pm = get_mount_parameters_configured(m);
pm = &m->parameters_fragment;
else if (m->from_etc_fstab)
pm = &m->parameters_etc_fstab;
else
pm = NULL;
/* Adds in links to other mount points that might lie below or /* Adds in links to other mount points that might lie below or
* above us in the hierarchy */ * above us in the hierarchy */
@ -155,19 +170,14 @@ static int mount_add_mount_links(Mount *m) {
if (n->meta.load_state != UNIT_LOADED) if (n->meta.load_state != UNIT_LOADED)
continue; continue;
if (n->from_fragment) pn = get_mount_parameters_configured(n);
pn = &n->parameters_fragment;
else if (n->from_etc_fstab)
pn = &n->parameters_etc_fstab;
else
pn = NULL;
if (path_startswith(m->where, n->where)) { if (path_startswith(m->where, n->where)) {
if ((r = unit_add_dependency(UNIT(m), UNIT_AFTER, UNIT(n), true)) < 0) if ((r = unit_add_dependency(UNIT(m), UNIT_AFTER, UNIT(n), true)) < 0)
return r; 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) if ((r = unit_add_dependency(UNIT(m), UNIT_REQUIRES, UNIT(n), true)) < 0)
return r; 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) if ((r = unit_add_dependency(UNIT(n), UNIT_AFTER, UNIT(m), true)) < 0)
return r; 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) if ((r = unit_add_dependency(UNIT(n), UNIT_REQUIRES, UNIT(m), true)) < 0)
return r; 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) if ((r = unit_add_dependency(UNIT(m), UNIT_AFTER, UNIT(n), true)) < 0)
return r; return r;
if (m->from_etc_fstab || m->from_fragment) if ((r = unit_add_dependency(UNIT(m), UNIT_REQUIRES, UNIT(n), true)) < 0)
if ((r = unit_add_dependency(UNIT(m), UNIT_REQUIRES, UNIT(n), true)) < 0) return r;
return r;
} else if (pn && path_startswith(pn->what, m->where)) { } else if (pn && path_startswith(pn->what, m->where)) {
if ((r = unit_add_dependency(UNIT(n), UNIT_AFTER, UNIT(m), true)) < 0) if ((r = unit_add_dependency(UNIT(n), UNIT_AFTER, UNIT(m), true)) < 0)
return r; return r;
if (n->from_etc_fstab || n->from_fragment) if ((r = unit_add_dependency(UNIT(n), UNIT_REQUIRES, UNIT(m), true)) < 0)
if ((r = unit_add_dependency(UNIT(n), UNIT_REQUIRES, UNIT(m), true)) < 0) return r;
return r;
} }
} }
@ -272,6 +280,43 @@ static char* mount_test_option(const char *haystack, const char *needle) {
return hasmntopt(&me, 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) { static int mount_add_target_links(Mount *m) {
const char *target, *after = NULL; const char *target, *after = NULL;
MountParameters *p; MountParameters *p;
@ -281,11 +326,7 @@ static int mount_add_target_links(Mount *m) {
assert(m); assert(m);
if (m->from_fragment) if (!(p = get_mount_parameters_configured(m)))
p = &m->parameters_fragment;
else if (m->from_etc_fstab)
p = &m->parameters_etc_fstab;
else
return 0; return 0;
noauto = !!mount_test_option(p->options, MNTOPT_NOAUTO); 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, "comment=systemd.automount") ||
mount_test_option(p->options, "x-systemd-automount"); mount_test_option(p->options, "x-systemd-automount");
if (mount_test_option(p->options, "_netdev") || if (mount_is_network(p)) {
(p->fstype && fstype_is_network(p->fstype))) {
target = SPECIAL_REMOTE_FS_TARGET; target = SPECIAL_REMOTE_FS_TARGET;
if (m->meta.manager->running_as == MANAGER_SYSTEM) 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) { static int mount_add_device_links(Mount *m) {
MountParameters *p; MountParameters *p;
int r; int r;
assert(m); assert(m);
if (m->from_fragment) if (!(p = get_mount_parameters_configured(m)))
p = &m->parameters_fragment;
else if (m->from_etc_fstab)
p = &m->parameters_etc_fstab;
else
return 0; return 0;
if (!p->what) if (!p->what)
@ -415,20 +439,13 @@ static int mount_add_default_dependencies(Mount *m) {
!path_equal(m->where, "/")) { !path_equal(m->where, "/")) {
MountParameters *p; MountParameters *p;
if (m->from_fragment) p = get_mount_parameters_configured(m);
p = &m->parameters_fragment;
else if (m->from_etc_fstab)
p = &m->parameters_etc_fstab;
else
p = NULL;
if (!p || if (p && needs_quota(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 ((r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_BEFORE, UNIT_WANTS, SPECIAL_QUOTACHECK_SERVICE, NULL, true)) < 0 || 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) (r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_BEFORE, UNIT_WANTS, SPECIAL_QUOTAON_SERVICE, NULL, true)) < 0)
return r; return r;
}
if ((r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_UMOUNT_TARGET, NULL, true)) < 0) if ((r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_UMOUNT_TARGET, NULL, true)) < 0)
return r; return r;
@ -640,12 +657,7 @@ static void mount_dump(Unit *u, FILE *f, const char *prefix) {
assert(m); assert(m);
assert(f); assert(f);
if (m->from_proc_self_mountinfo) p = get_mount_parameters(m);
p = &m->parameters_proc_self_mountinfo;
else if (m->from_fragment)
p = &m->parameters_fragment;
else
p = &m->parameters_etc_fstab;
fprintf(f, fprintf(f,
"%sMount State: %s\n" "%sMount State: %s\n"
@ -834,6 +846,7 @@ fail:
static void mount_enter_mounting(Mount *m) { static void mount_enter_mounting(Mount *m) {
int r; int r;
MountParameters *p;
assert(m); assert(m);
@ -842,9 +855,10 @@ static void mount_enter_mounting(Mount *m) {
mkdir_p(m->where, m->directory_mode); mkdir_p(m->where, m->directory_mode);
/* create the source directory for bind-mounts if needed */ /* Create the source directory for bind-mounts if needed */
if (m->parameters_fragment.fstype && strcmp(m->parameters_fragment.fstype, "bind") == 0) p = get_mount_parameters_configured(m);
mkdir_p(m->parameters_fragment.what, m->directory_mode); if (p && mount_is_bind(p))
mkdir_p(p->what, m->directory_mode);
if (m->from_fragment) if (m->from_fragment)
r = exec_command_set( r = exec_command_set(