--- /dev/null
+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, "