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.
This commit is contained in:
Luca Boccassi 2023-12-07 23:19:36 +00:00 committed by Yu Watanabe
parent fe6e0cfa19
commit 6c75eff6af
3 changed files with 39 additions and 1 deletions

View file

@ -538,7 +538,11 @@
<term><varname>Type=</varname></term>
<listitem><para>Takes a string for the file system type. See
<citerefentry project='man-pages'><refentrytitle>mount</refentrytitle><manvolnum>8</manvolnum></citerefentry>
for details. This setting is optional.</para></listitem>
for details. This setting is optional.</para>
<para>If the type is <literal>overlay</literal>, and <literal>upperdir=</literal> or
<literal>workdir=</literal> are specified as options and they don't exist, they will be created.
</para></listitem>
</varlistentry>
<varlistentry>

View file

@ -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);

View file

@ -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"