From: Lennart Poettering Date: Tue, 7 Mar 2023 10:24:00 +0000 (+0100) Subject: mountpoint-util: move 'norecovery' detection into its own helper call X-Git-Tag: v254-rc1~1073^2~2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=034ebc47a280e6f0f1f051ee15099b6e7fe20e9a;p=thirdparty%2Fsystemd.git mountpoint-util: move 'norecovery' detection into its own helper call And let's also ask the kernel explicitly for support. --- diff --git a/src/basic/mountpoint-util.c b/src/basic/mountpoint-util.c index 4e0994c881c..27d20f5fe3e 100644 --- a/src/basic/mountpoint-util.c +++ b/src/basic/mountpoint-util.c @@ -478,6 +478,23 @@ bool fstype_can_discard(const char *fstype) { "xfs"); } +bool fstype_can_norecovery(const char *fstype) { + int r; + + assert(fstype); + + /* On new kernels we can just ask the kernel */ + r = mount_option_supported(fstype, "norecovery", NULL); + if (r >= 0) + return r; + + return STR_IN_SET(fstype, + "ext3", + "ext4", + "xfs", + "btrfs"); +} + bool fstype_can_uid_gid(const char *fstype) { /* All file systems that have a uid=/gid= mount option that fixates the owners of all files and directories, diff --git a/src/basic/mountpoint-util.h b/src/basic/mountpoint-util.h index e68fdf66852..e0c8f6b3564 100644 --- a/src/basic/mountpoint-util.h +++ b/src/basic/mountpoint-util.h @@ -49,6 +49,7 @@ bool fstype_is_blockdev_backed(const char *fstype); bool fstype_is_ro(const char *fsype); bool fstype_can_discard(const char *fstype); bool fstype_can_uid_gid(const char *fstype); +bool fstype_can_norecovery(const char *fstype); int dev_is_devtmpfs(void); diff --git a/src/shared/dissect-image.c b/src/shared/dissect-image.c index fc27c50d448..59adb324266 100644 --- a/src/shared/dissect-image.c +++ b/src/shared/dissect-image.c @@ -1567,7 +1567,7 @@ int partition_pick_mount_options( * access that actually modifies stuff work on such image files. Or to say this differently: if * people want their file systems to be fixed up they should just open them in writable mode, where * all these problems don't exist. */ - if (!rw && STRPTR_IN_SET(fstype, "ext3", "ext4", "xfs", "btrfs")) + if (!rw && fstype && fstype_can_norecovery(fstype)) if (!strextend_with_separator(&options, ",", "norecovery")) return -ENOMEM; diff --git a/src/test/test-mountpoint-util.c b/src/test/test-mountpoint-util.c index 8fdfa4d9605..d6aa2c7b949 100644 --- a/src/test/test-mountpoint-util.c +++ b/src/test/test-mountpoint-util.c @@ -355,6 +355,12 @@ TEST(fstype_can_discard) { assert_se(!fstype_can_discard("iso9660")); } +TEST(fstype_can_norecovery) { + assert_se(fstype_can_norecovery("ext4")); + assert_se(!fstype_can_norecovery("vfat")); + assert_se(!fstype_can_norecovery("tmpfs")); +} + static int intro(void) { /* let's move into our own mount namespace with all propagation from the host turned off, so * that /proc/self/mountinfo is static and constant for the whole time our test runs. */