From 3e5235b0d95020e8260d8deb6d7b070b0e0c60be Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 2 Jul 2010 00:28:44 +0200 Subject: [PATCH] mount: automatically create non-existing mount point dirs prior to mounting --- src/load-fragment.c | 1 + src/mount.c | 10 ++++++++-- src/mount.h | 2 ++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/load-fragment.c b/src/load-fragment.c index ce468734a..43a4027c3 100644 --- a/src/load-fragment.c +++ b/src/load-fragment.c @@ -1562,6 +1562,7 @@ static int load_from_path(Unit *u, const char *path) { { "Type", config_parse_string, &u->mount.parameters_fragment.fstype, "Mount" }, { "TimeoutSec", config_parse_usec, &u->mount.timeout_usec, "Mount" }, { "KillMode", config_parse_kill_mode, &u->mount.kill_mode, "Mount" }, + { "DirectoryMode", config_parse_mode, &u->mount.directory_mode, "Mount" }, EXEC_CONTEXT_CONFIG_ITEMS(u->mount.exec_context, "Mount"), { "Where", config_parse_path, &u->automount.where, "Automount" }, diff --git a/src/mount.c b/src/mount.c index 86c5b0a8c..db8551e85 100644 --- a/src/mount.c +++ b/src/mount.c @@ -62,6 +62,8 @@ static void mount_init(Unit *u) { 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 @@ -497,7 +499,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" - "%sKillMode: %s\n", + "%sKillMode: %s\n" + "%sDirectoryMode: %04o\n", prefix, mount_state_to_string(m->state), prefix, m->where, prefix, strna(p->what), @@ -506,7 +509,8 @@ 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, 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, @@ -662,6 +666,8 @@ static void mount_enter_mounting(Mount *m) { 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, diff --git a/src/mount.h b/src/mount.h index 30da1368f..4732902ef 100644 --- a/src/mount.h +++ b/src/mount.h @@ -81,6 +81,8 @@ struct Mount { usec_t timeout_usec; + mode_t directory_mode; + ExecCommand exec_command[_MOUNT_EXEC_COMMAND_MAX]; ExecContext exec_context; -- 2.30.2