]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
discover-image: restore compatibility with C9S and overlayfs directories
authorLuca Boccassi <luca.boccassi@gmail.com>
Mon, 9 Feb 2026 19:19:27 +0000 (19:19 +0000)
committerLuca Boccassi <luca.boccassi@gmail.com>
Mon, 9 Feb 2026 19:39:51 +0000 (19:39 +0000)
5817c73391b5f3599c50df2c0873b26ea426f848 broke compatibility with
CentOS 9 and overlayfs directories, the following fails with -EOPTNOTSUPP:

mount -t overlay overlay -o lowerdir=/tmp/app1:/tmp/rootdir /tmp/overlay
portablectl attach --copy=symlink --now --runtime /tmp/overlay app1

name_to_handle_at() fails both with and without AT_HANDLE_MNT_ID_UNIQUE.

Restore the fallback to path_get_mnt_id_at() that was removed.
Fixes TEST-29-PORTABLE.directory

Follow-up for 5817c73391b5f3599c50df2c0873b26ea426f848

src/shared/discover-image.c

index 885b896de4abd4f4319f11542497a5e4ee4c087b..5bb547460894b9e39982ce80cf64bb59a14a73ef 100644 (file)
@@ -455,10 +455,26 @@ static int image_make(
         uint64_t on_mount_id;
         int _mnt_id;
 
+        /* The fallback is required for CentOS 9 compatibility when working on a directory located on an
+         * overlayfs. */
         r = name_to_handle_at_try_fid(fd, /* path= */ NULL, &fh, &_mnt_id, &on_mount_id, AT_EMPTY_PATH);
-        if (r < 0)
-                return r;
-        if (r == 0)
+        if (r < 0) {
+                if (is_name_to_handle_at_fatal_error(r))
+                        return r;
+
+                r = path_get_unique_mnt_id_at(fd, /* path= */ NULL, &on_mount_id);
+                if (r < 0) {
+                        if (!ERRNO_IS_NEG_NOT_SUPPORTED(r) && r != -EUNATCH)
+                                return r;
+
+                        int on_mount_id_fallback = -1;
+                        r = path_get_mnt_id_at(fd, /* path= */ NULL, &on_mount_id_fallback);
+                        if (r < 0)
+                                return r;
+
+                        on_mount_id = on_mount_id_fallback;
+                }
+        } else if (r == 0)
                 on_mount_id = _mnt_id;
 
         if (S_ISDIR(st->st_mode)) {