chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
systemctl: fix parsing of cgroup contents
[elogind.git]
/
src
/
mount.c
diff --git
a/src/mount.c
b/src/mount.c
index c95581fd1ed541b2428f681fb0bd281858c317f1..6da880eb8ff1fcf0c15f34b3d7ce0016ce95a8c9 100644
(file)
--- a/
src/mount.c
+++ b/
src/mount.c
@@
-42,15
+42,15
@@
static const UnitActiveState state_translation_table[_MOUNT_STATE_MAX] = {
[MOUNT_MOUNTING] = UNIT_ACTIVATING,
[MOUNT_MOUNTING_DONE] = UNIT_ACTIVE,
[MOUNT_MOUNTED] = UNIT_ACTIVE,
[MOUNT_MOUNTING] = UNIT_ACTIVATING,
[MOUNT_MOUNTING_DONE] = UNIT_ACTIVE,
[MOUNT_MOUNTED] = UNIT_ACTIVE,
- [MOUNT_REMOUNTING] = UNIT_
ACTIVE_
RELOADING,
+ [MOUNT_REMOUNTING] = UNIT_RELOADING,
[MOUNT_UNMOUNTING] = UNIT_DEACTIVATING,
[MOUNT_MOUNTING_SIGTERM] = UNIT_DEACTIVATING,
[MOUNT_MOUNTING_SIGKILL] = UNIT_DEACTIVATING,
[MOUNT_UNMOUNTING] = UNIT_DEACTIVATING,
[MOUNT_MOUNTING_SIGTERM] = UNIT_DEACTIVATING,
[MOUNT_MOUNTING_SIGKILL] = UNIT_DEACTIVATING,
- [MOUNT_REMOUNTING_SIGTERM] = UNIT_
ACTIVE_
RELOADING,
- [MOUNT_REMOUNTING_SIGKILL] = UNIT_
ACTIVE_
RELOADING,
+ [MOUNT_REMOUNTING_SIGTERM] = UNIT_RELOADING,
+ [MOUNT_REMOUNTING_SIGKILL] = UNIT_RELOADING,
[MOUNT_UNMOUNTING_SIGTERM] = UNIT_DEACTIVATING,
[MOUNT_UNMOUNTING_SIGKILL] = UNIT_DEACTIVATING,
[MOUNT_UNMOUNTING_SIGTERM] = UNIT_DEACTIVATING,
[MOUNT_UNMOUNTING_SIGKILL] = UNIT_DEACTIVATING,
- [MOUNT_MAINTENANCE] = UNIT_
INACTIVE,
+ [MOUNT_MAINTENANCE] = UNIT_
MAINTENANCE
};
static void mount_init(Unit *u) {
};
static void mount_init(Unit *u) {
@@
-62,11
+62,13
@@
static void mount_init(Unit *u) {
m->timeout_usec = DEFAULT_TIMEOUT_USEC;
exec_context_init(&m->exec_context);
m->timeout_usec = DEFAULT_TIMEOUT_USEC;
exec_context_init(&m->exec_context);
+ m->directory_mode = 0755;
+
/* We need to make sure that /bin/mount is always called in
* the same process group as us, so that the autofs kernel
* side doesn't send us another mount request while we are
* already trying to comply its last one. */
/* We need to make sure that /bin/mount is always called in
* the same process group as us, so that the autofs kernel
* side doesn't send us another mount request while we are
* already trying to comply its last one. */
- m->exec_context.
no_setsid
= true;
+ m->exec_context.
same_pgrp
= true;
m->timer_watch.type = WATCH_INVALID;
m->timer_watch.type = WATCH_INVALID;
@@
-251,7
+253,7
@@
static int mount_add_target_links(Mount *m) {
else
target = SPECIAL_LOCAL_FS_TARGET;
else
target = SPECIAL_LOCAL_FS_TARGET;
- if ((r = manager_load_unit(
UNIT(m)
->meta.manager, target, NULL, &tu)) < 0)
+ if ((r = manager_load_unit(
m
->meta.manager, target, NULL, &tu)) < 0)
return r;
if (automount && m->meta.manager->running_as == MANAGER_SYSTEM) {
return r;
if (automount && m->meta.manager->running_as == MANAGER_SYSTEM) {
@@
-260,11
+262,7
@@
static int mount_add_target_links(Mount *m) {
if ((r = unit_load_related_unit(UNIT(m), ".automount", &am)) < 0)
return r;
if ((r = unit_load_related_unit(UNIT(m), ".automount", &am)) < 0)
return r;
- if ((r = unit_add_dependency(tu, UNIT_WANTS, UNIT(am), true)) < 0)
- return r;
-
- return unit_add_dependency(UNIT(am), UNIT_BEFORE, tu, true);
-
+ return unit_add_two_dependencies(tu, UNIT_AFTER, UNIT_WANTS, UNIT(am), true);
} else {
if (!noauto && handle)
} else {
if (!noauto && handle)
@@
-294,15
+292,20
@@
static int mount_verify(Mount *m) {
free(e);
if (!b) {
free(e);
if (!b) {
- log_error("%s's Where setting doesn't match unit name. Refusing.",
UNIT(m)
->meta.id);
+ log_error("%s's Where setting doesn't match unit name. Refusing.",
m
->meta.id);
return -EINVAL;
}
if (m->meta.fragment_path && !m->parameters_fragment.what) {
return -EINVAL;
}
if (m->meta.fragment_path && !m->parameters_fragment.what) {
- log_error("%s's What setting is missing. Refusing.",
UNIT(m)
->meta.id);
+ log_error("%s's What setting is missing. Refusing.",
m
->meta.id);
return -EBADMSG;
}
return -EBADMSG;
}
+ if (m->exec_context.pam_name && m->kill_mode != KILL_CONTROL_GROUP) {
+ log_error("%s has PAM enabled. Kill mode must be set to 'control-group'. Refusing.", m->meta.id);
+ return -EINVAL;
+ }
+
return 0;
}
return 0;
}
@@
-420,7
+423,7
@@
static void mount_set_state(Mount *m, MountState state) {
if (state != old_state)
log_debug("%s changed %s -> %s",
if (state != old_state)
log_debug("%s changed %s -> %s",
-
UNIT(m)
->meta.id,
+
m
->meta.id,
mount_state_to_string(old_state),
mount_state_to_string(state));
mount_state_to_string(old_state),
mount_state_to_string(state));
@@
-492,7
+495,8
@@
static void mount_dump(Unit *u, FILE *f, const char *prefix) {
"%sFrom /etc/fstab: %s\n"
"%sFrom /proc/self/mountinfo: %s\n"
"%sFrom fragment: %s\n"
"%sFrom /etc/fstab: %s\n"
"%sFrom /proc/self/mountinfo: %s\n"
"%sFrom fragment: %s\n"
- "%sKillMode: %s\n",
+ "%sKillMode: %s\n"
+ "%sDirectoryMode: %04o\n",
prefix, mount_state_to_string(m->state),
prefix, m->where,
prefix, strna(p->what),
prefix, mount_state_to_string(m->state),
prefix, m->where,
prefix, strna(p->what),
@@
-501,12
+505,13
@@
static void mount_dump(Unit *u, FILE *f, const char *prefix) {
prefix, yes_no(m->from_etc_fstab),
prefix, yes_no(m->from_proc_self_mountinfo),
prefix, yes_no(m->from_fragment),
prefix, yes_no(m->from_etc_fstab),
prefix, yes_no(m->from_proc_self_mountinfo),
prefix, yes_no(m->from_fragment),
- prefix, kill_mode_to_string(m->kill_mode));
+ prefix, kill_mode_to_string(m->kill_mode),
+ prefix, m->directory_mode);
if (m->control_pid > 0)
fprintf(f,
if (m->control_pid > 0)
fprintf(f,
- "%sControl PID: %l
l
u\n",
- prefix, (unsigned long
long
) m->control_pid);
+ "%sControl PID: %lu\n",
+ prefix, (unsigned long) m->control_pid);
exec_context_dump(&m->exec_context, f, prefix);
}
exec_context_dump(&m->exec_context, f, prefix);
}
@@
-529,8
+534,8
@@
static int mount_spawn(Mount *m, ExecCommand *c, pid_t *_pid) {
m->meta.manager->environment,
true,
true,
m->meta.manager->environment,
true,
true,
-
UNIT(m)
->meta.manager->confirm_spawn,
-
UNIT(m)
->meta.cgroup_bondings,
+
m
->meta.manager->confirm_spawn,
+
m
->meta.cgroup_bondings,
&pid)) < 0)
goto fail;
&pid)) < 0)
goto fail;
@@
-582,7
+587,7
@@
static void mount_enter_signal(Mount *m, MountState state, bool success) {
if (m->kill_mode == KILL_CONTROL_GROUP) {
if (m->kill_mode == KILL_CONTROL_GROUP) {
- if ((r = cgroup_bonding_kill_list(
UNIT(m)
->meta.cgroup_bondings, sig)) < 0) {
+ if ((r = cgroup_bonding_kill_list(
m
->meta.cgroup_bondings, sig)) < 0) {
if (r != -EAGAIN && r != -ESRCH)
goto fail;
} else
if (r != -EAGAIN && r != -ESRCH)
goto fail;
} else
@@
-609,7
+614,7
@@
static void mount_enter_signal(Mount *m, MountState state, bool success) {
return;
fail:
return;
fail:
- log_warning("%s failed to kill processes: %s",
UNIT(m)
->meta.id, strerror(-r));
+ log_warning("%s failed to kill processes: %s",
m
->meta.id, strerror(-r));
if (state == MOUNT_REMOUNTING_SIGTERM || state == MOUNT_REMOUNTING_SIGKILL)
mount_enter_mounted(m, false);
if (state == MOUNT_REMOUNTING_SIGTERM || state == MOUNT_REMOUNTING_SIGKILL)
mount_enter_mounted(m, false);
@@
-645,7
+650,7
@@
static void mount_enter_unmounting(Mount *m, bool success) {
return;
fail:
return;
fail:
- log_warning("%s failed to run
umount exectuable: %s", UNIT(m)
->meta.id, strerror(-r));
+ log_warning("%s failed to run
'umount' task: %s", m
->meta.id, strerror(-r));
mount_enter_mounted(m, false);
}
mount_enter_mounted(m, false);
}
@@
-657,6
+662,8
@@
static void mount_enter_mounting(Mount *m) {
m->control_command_id = MOUNT_EXEC_MOUNT;
m->control_command = m->exec_command + MOUNT_EXEC_MOUNT;
m->control_command_id = MOUNT_EXEC_MOUNT;
m->control_command = m->exec_command + MOUNT_EXEC_MOUNT;
+ mkdir_p(m->where, m->directory_mode);
+
if (m->from_fragment)
r = exec_command_set(
m->control_command,
if (m->from_fragment)
r = exec_command_set(
m->control_command,
@@
-688,7
+695,7
@@
static void mount_enter_mounting(Mount *m) {
return;
fail:
return;
fail:
- log_warning("%s failed to run
mount exectuable: %s", UNIT(m)
->meta.id, strerror(-r));
+ log_warning("%s failed to run
'mount' task: %s", m
->meta.id, strerror(-r));
mount_enter_dead(m, false);
}
mount_enter_dead(m, false);
}
@@
-929,7
+936,7
@@
static void mount_sigchld_event(Unit *u, pid_t pid, int code, int status) {
m->failure = m->failure || !success;
if (m->control_command) {
m->failure = m->failure || !success;
if (m->control_command) {
- exec_status_
fill
(&m->control_command->exec_status, pid, code, status);
+ exec_status_
exit
(&m->control_command->exec_status, pid, code, status);
m->control_command = NULL;
m->control_command_id = _MOUNT_EXEC_COMMAND_INVALID;
}
m->control_command = NULL;
m->control_command_id = _MOUNT_EXEC_COMMAND_INVALID;
}