]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
.38 patches
authorGreg Kroah-Hartman <gregkh@suse.de>
Fri, 25 Mar 2011 19:53:41 +0000 (12:53 -0700)
committerGreg Kroah-Hartman <gregkh@suse.de>
Fri, 25 Mar 2011 19:53:41 +0000 (12:53 -0700)
queue-2.6.38/ext4-skip-orphan-cleanup-if-fs-has-unknown-rocompat-features.patch [new file with mode: 0644]
queue-2.6.38/series

diff --git a/queue-2.6.38/ext4-skip-orphan-cleanup-if-fs-has-unknown-rocompat-features.patch b/queue-2.6.38/ext4-skip-orphan-cleanup-if-fs-has-unknown-rocompat-features.patch
new file mode 100644 (file)
index 0000000..97ddf2b
--- /dev/null
@@ -0,0 +1,50 @@
+From d39195c33bb1b5fdcb0f416e8a0b34bfdb07a027 Mon Sep 17 00:00:00 2001
+From: Amir Goldstein <amir73il@gmail.com>
+Date: Mon, 28 Feb 2011 00:53:45 -0500
+Subject: ext4: skip orphan cleanup if fs has unknown ROCOMPAT features
+
+From: Amir Goldstein <amir73il@gmail.com>
+
+commit d39195c33bb1b5fdcb0f416e8a0b34bfdb07a027 upstream.
+
+Orphan cleanup is currently executed even if the file system has some
+number of unknown ROCOMPAT features, which deletes inodes and frees
+blocks, which could be very bad for some RO_COMPAT features,
+especially the SNAPSHOT feature.
+
+This patch skips the orphan cleanup if it contains readonly compatible
+features not known by this ext4 implementation, which would prevent
+the fs from being mounted (or remounted) readwrite.
+
+Signed-off-by: Amir Goldstein <amir73il@users.sf.net>
+Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ fs/ext4/super.c |    8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+--- a/fs/ext4/super.c
++++ b/fs/ext4/super.c
+@@ -75,6 +75,7 @@ static void ext4_write_super(struct supe
+ static int ext4_freeze(struct super_block *sb);
+ static struct dentry *ext4_mount(struct file_system_type *fs_type, int flags,
+                      const char *dev_name, void *data);
++static int ext4_feature_set_ok(struct super_block *sb, int readonly);
+ static void ext4_destroy_lazyinit_thread(void);
+ static void ext4_unregister_li_request(struct super_block *sb);
+ static void ext4_clear_request_list(void);
+@@ -2120,6 +2121,13 @@ static void ext4_orphan_cleanup(struct s
+               return;
+       }
++      /* Check if feature set would not allow a r/w mount */
++      if (!ext4_feature_set_ok(sb, 0)) {
++              ext4_msg(sb, KERN_INFO, "Skipping orphan cleanup due to "
++                       "unknown ROCOMPAT features");
++              return;
++      }
++
+       if (EXT4_SB(sb)->s_mount_state & EXT4_ERROR_FS) {
+               if (es->s_last_orphan)
+                       jbd_debug(1, "Errors on filesystem, "
index aa31b94db8e4db9366babf520f67c7e649cee391..3dfa345b8e5ee6bfeed3d32f61f4c178bd5baad0 100644 (file)
@@ -60,3 +60,4 @@ nfs-fix-a-hang-infinite-loop-in-nfs_wb_page.patch
 sunrpc-never-reuse-the-socket-port-after-an-xs_close.patch
 fs-call-security_d_instantiate-in-d_obtain_alias-v2.patch
 dcdbas-force-smi-to-happen-when-expected.patch
+ext4-skip-orphan-cleanup-if-fs-has-unknown-rocompat-features.patch