From 6c75eff6afd90596d09a33a9275be292db4e3380 Mon Sep 17 00:00:00 2001 From: Luca Boccassi Date: Thu, 7 Dec 2023 23:19:36 +0000 Subject: [PATCH] core: create workdir/upperdir when mounting a Type=overlay mount unit So far we created the target directory, and the source for bind mounts, but not workdir/upperdir for overlays, so it has to be done separately and strictly before the unit is started, which is annoying. Check the options when creating directories, and if upper/work directories are specified, create them. --- man/systemd.mount.xml | 6 +++++- src/core/mount.c | 28 ++++++++++++++++++++++++++++ test/units/testsuite-74.mount.sh | 6 ++++++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/man/systemd.mount.xml b/man/systemd.mount.xml index 79002219356..e11b9ffed42 100644 --- a/man/systemd.mount.xml +++ b/man/systemd.mount.xml @@ -538,7 +538,11 @@ Type= Takes a string for the file system type. See mount8 - for details. This setting is optional. + for details. This setting is optional. + + If the type is overlay, and upperdir= or + workdir= are specified as options and they don't exist, they will be created. + diff --git a/src/core/mount.c b/src/core/mount.c index f364b2ab0b7..654be17c473 100644 --- a/src/core/mount.c +++ b/src/core/mount.c @@ -1200,6 +1200,34 @@ static void mount_enter_mounting(Mount *m) { if (r < 0 && r != -EEXIST) log_unit_warning_errno(UNIT(m), r, "Failed to create mount point '%s', ignoring: %m", m->where); + /* If we are asked to create an OverlayFS, create the upper/work directories if they are missing */ + if (streq_ptr(p->fstype, "overlay")) { + _cleanup_strv_free_ char **dirs = NULL; + + r = fstab_filter_options( + p->options, + "upperdir\0workdir\0", + /* ret_namefound= */ NULL, + /* ret_value= */ NULL, + &dirs, + /* ret_filtered= */ NULL); + if (r < 0) + log_unit_warning_errno( + UNIT(m), + r, + "Failed to determine upper directory for OverlayFS, ignoring: %m"); + else + STRV_FOREACH(d, dirs) { + r = mkdir_p_label(*d, m->directory_mode); + if (r < 0 && r != -EEXIST) + log_unit_warning_errno( + UNIT(m), + r, + "Failed to create overlay directory '%s', ignoring: %m", + *d); + } + } + if (source_is_dir) unit_warn_if_dir_nonempty(UNIT(m), m->where); unit_warn_leftover_processes(UNIT(m), unit_log_leftover_process_start); diff --git a/test/units/testsuite-74.mount.sh b/test/units/testsuite-74.mount.sh index 41c5c8652a2..594c123e1ba 100755 --- a/test/units/testsuite-74.mount.sh +++ b/test/units/testsuite-74.mount.sh @@ -149,3 +149,9 @@ touch "$WORK_DIR/mnt/foo/baz" systemd-umount "$WORK_DIR/mnt/foo" test -d "$WORK_DIR/mnt/foo/bar" test ! -e "$WORK_DIR/mnt/foo/baz" + +# overlay +systemd-mount --type=overlay --options="lowerdir=/etc,upperdir=$WORK_DIR/upper,workdir=$WORK_DIR/work" /etc "$WORK_DIR/overlay" +touch "$WORK_DIR/overlay/foo" +test -e "$WORK_DIR/upper/foo" +systemd-umount "$WORK_DIR/overlay" -- 2.47.3