diff options
Diffstat (limited to 'sys-apps/util-linux/files')
3 files changed, 157 insertions, 0 deletions
diff --git a/sys-apps/util-linux/files/util-linux-2.39-check-for-mount_setattr.patch b/sys-apps/util-linux/files/util-linux-2.39-check-for-mount_setattr.patch new file mode 100644 index 000000000000..c1eb3748f782 --- /dev/null +++ b/sys-apps/util-linux/files/util-linux-2.39-check-for-mount_setattr.patch @@ -0,0 +1,98 @@ +https://bugs.gentoo.org/906797 +https://github.com/util-linux/util-linux/pull/2248 + +From 1bd85b64632280d6bf0e86b4ff29da8b19321c5f Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Thomas=20Wei=C3=9Fschuh?= <thomas@t-8ch.de> +Date: Sat, 20 May 2023 06:38:20 +0200 +Subject: [PATCH] libmount: check for availability of mount_setattr +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +If mount_setattr is not available but needed fall back to the legacy +mount API. + +Fixes #2247 + +Signed-off-by: Thomas Weißschuh <thomas@t-8ch.de> +--- a/libmount/src/hook_mount.c ++++ b/libmount/src/hook_mount.c +@@ -510,6 +510,15 @@ static inline int fsopen_is_supported(void) + return rc; + } + ++static inline int mount_setattr_is_supported(void) ++{ ++ int rc; ++ ++ errno = 0; ++ rc = mount_setattr(-1, NULL, 0, NULL, 0); ++ return !(rc == -1 && errno == ENOSYS); ++} ++ + /* + * open_tree() and fsopen() + */ +@@ -675,9 +684,14 @@ static int hook_prepare(struct libmnt_context *cxt, + /* call mount_setattr() */ + if (!rc + && cxt->helper == NULL +- && (set != 0 || clr != 0 || (flags & MS_REMOUNT))) ++ && (set != 0 || clr != 0 || (flags & MS_REMOUNT))) { ++ if (!mount_setattr_is_supported()) { ++ hookset_deinit(cxt, hs); ++ return 1; ++ } + rc = mnt_context_append_hook(cxt, hs, MNT_STAGE_MOUNT, NULL, + hook_set_vfsflags); ++ } + + /* call move_mount() to attach target */ + if (!rc +@@ -688,9 +702,14 @@ static int hook_prepare(struct libmnt_context *cxt, + hook_attach_target); + + /* set propagation (has to be attached to VFS) */ +- if (!rc && mnt_optlist_get_propagation(ol)) ++ if (!rc && mnt_optlist_get_propagation(ol)) { ++ if (!mount_setattr_is_supported()) { ++ hookset_deinit(cxt, hs); ++ return 1; ++ } + rc = mnt_context_append_hook(cxt, hs, MNT_STAGE_MOUNT_POST, NULL, + hook_set_propagation); ++ } + + DBG(HOOK, ul_debugobj(hs, "prepare mount done [rc=%d]", rc)); + return rc; +diff --git a/tests/expected/mount/fallback-mount_setattr b/tests/expected/mount/fallback-mount_setattr +new file mode 100644 +index 0000000000..3e18ebf09e +--- /dev/null ++++ b/tests/expected/mount/fallback-mount_setattr +@@ -0,0 +1 @@ ++private +--- a/tests/ts/mount/fallback ++++ b/tests/ts/mount/fallback +@@ -68,5 +68,21 @@ $TS_CMD_UMOUNT $MOUNTPOINT + ts_finalize_subtest + + ++ts_init_subtest "mount_setattr" ++"$TS_CMD_MOUNT" "$DEVICE" "$MOUNTPOINT" >> $TS_OUTPUT 2>> $TS_ERRLOG ++ts_is_mounted $DEVICE || ts_log "Cannot find $DEVICE in /proc/mounts" ++$TS_HELPER_ENOSYS -s mount_setattr -- \ ++ "$TS_CMD_MOUNT" -o remount,ro "$MOUNTPOINT" \ ++ >> $TS_OUTPUT 2>> $TS_ERRLOG ++$TS_CMD_FINDMNT --kernel --mountpoint "$MOUNTPOINT" --options "ro" &> /dev/null ++[ "$?" == "0" ] || ts_die "Cannot find read-only in $MOUNTPOINT in /proc/self/mountinfo" ++$TS_HELPER_ENOSYS -s mount_setattr -- \ ++ "$TS_CMD_MOUNT" --make-slave "$MOUNTPOINT" \ ++ >> $TS_OUTPUT 2>> $TS_ERRLOG ++$TS_CMD_FINDMNT -n --kernel --mountpoint "$MOUNTPOINT" -o PROPAGATION >> $TS_OUTPUT ++$TS_CMD_UMOUNT $MOUNTPOINT ++ts_finalize_subtest ++ ++ + ts_finalize + diff --git a/sys-apps/util-linux/files/util-linux-2.39-mount-parse-options-user.patch b/sys-apps/util-linux/files/util-linux-2.39-mount-parse-options-user.patch new file mode 100644 index 000000000000..e02d02c7f503 --- /dev/null +++ b/sys-apps/util-linux/files/util-linux-2.39-mount-parse-options-user.patch @@ -0,0 +1,46 @@ +https://bugs.gentoo.org/906797#c4 +https://bugs.gentoo.org/906859 +https://github.com/util-linux/util-linux/issues/2238 +https://github.com/util-linux/util-linux/commit/c0267687fd7b41b00d523d1985182d7eb574effd + +From c0267687fd7b41b00d523d1985182d7eb574effd Mon Sep 17 00:00:00 2001 +From: Karel Zak <kzak@redhat.com> +Date: Mon, 22 May 2023 15:00:25 +0200 +Subject: [PATCH] libmount: fix options prepend/insert and merging + + * the order of the new options should not be changed + (for example prepend "a,b,c" to list with "d" has to generate "a,b,c,d", not "c,b,a,d") + + * make sure that options map is defined when merging options + +Fixes: https://github.com/util-linux/util-linux/issues/2238 +Signed-off-by: Karel Zak <kzak@redhat.com> +--- a/libmount/src/optlist.c ++++ b/libmount/src/optlist.c +@@ -338,6 +338,7 @@ int mnt_optlist_merge_opts(struct libmnt_optlist *ls) + + /* remove inverted option */ + else if (opt->ent && x->ent ++ && opt->map == x->map + && opt->ent->id == x->ent->id + && (opt->ent->mask & MNT_INVERT + || x->ent->mask & MNT_INVERT)) +@@ -520,6 +521,8 @@ static int optlist_add_optstr(struct libmnt_optlist *ls, const char *optstr, + if (!opt) + return -ENOMEM; + opt->src = MNT_OPTSRC_STRING; ++ if (where) ++ where = &opt->opts; + } + + optlist_cleanup_cache(ls); +@@ -622,6 +625,8 @@ static int optlist_add_flags(struct libmnt_optlist *ls, unsigned long flags, + if (!opt) + return -ENOMEM; + opt->src = MNT_OPTSRC_FLAG; ++ if (where) ++ where = &opt->opts; + } + + optlist_cleanup_cache(ls); + diff --git a/sys-apps/util-linux/files/util-linux-2.39-tests-for-mount_setattr.patch b/sys-apps/util-linux/files/util-linux-2.39-tests-for-mount_setattr.patch new file mode 100644 index 000000000000..0b0ade4e181c --- /dev/null +++ b/sys-apps/util-linux/files/util-linux-2.39-tests-for-mount_setattr.patch @@ -0,0 +1,13 @@ +https://github.com/util-linux/util-linux/pull/2248 +https://bugs.gentoo.org/906797 + +--- a/tests/helpers/test_enosys.c ++++ b/tests/helpers/test_enosys.c +@@ -68,6 +68,7 @@ const struct syscall syscalls[] = { + { "move_mount", __NR_move_mount }, + { "open_tree", __NR_open_tree }, + { "fsopen", __NR_fsopen }, ++ { "mount_setattr", __NR_mount_setattr }, + }; + + int main(int argc, char **argv) |