diff options
-rw-r--r-- | src/basic/mountpoint-util.c | 17 | ||||
-rw-r--r-- | src/basic/mountpoint-util.h | 1 | ||||
-rw-r--r-- | src/shared/dissect-image.c | 2 | ||||
-rw-r--r-- | src/test/test-mountpoint-util.c | 6 |
4 files changed, 25 insertions, 1 deletions
diff --git a/src/basic/mountpoint-util.c b/src/basic/mountpoint-util.c index 4e0994c881..27d20f5fe3 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 e68fdf6685..e0c8f6b356 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 fc27c50d44..59adb32426 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 8fdfa4d960..d6aa2c7b94 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. */ |