mirror of
https://github.com/systemd/systemd.git
synced 2025-03-22 06:50:18 +03:00
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:
parent
72bc8d0056
commit
cb39ed3fde
6
TODO
6
TODO
@ -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:
|
||||
|
140
src/mount.c
140
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(
|
||||
|
Loading…
x
Reference in New Issue
Block a user