summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/basic/mountpoint-util.c17
-rw-r--r--src/basic/mountpoint-util.h1
-rw-r--r--src/shared/dissect-image.c2
-rw-r--r--src/test/test-mountpoint-util.c6
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. */