| 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); |
| @@ -2107,6 +2108,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, " |