diff options
author | Dmitry Monakhov <dmonakhov@openvz.org> | 2014-10-13 03:36:16 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2014-10-13 03:36:16 -0400 |
commit | 9aa5d32ba269bec0e7eaba2697a986a7b0bc8528 (patch) | |
tree | 3702c0a5ff64152ecd33d7469164832a7811f28f /fs/ext4/super.c | |
parent | 65dd8327eb055a393a413a2214f70a9a10ff7ad6 (diff) |
ext4: Replace open coded mdata csum feature to helper function
Besides the fact that this replacement improves code readability
it also protects from errors caused direct EXT4_S(sb)->s_es manipulation
which may result attempt to use uninitialized csum machinery.
#Testcase_BEGIN
IMG=/dev/ram0
MNT=/mnt
mkfs.ext4 $IMG
mount $IMG $MNT
#Enable feature directly on disk, on mounted fs
tune2fs -O metadata_csum $IMG
# Provoke metadata update, likey result in OOPS
touch $MNT/test
umount $MNT
#Testcase_END
# Replacement script
@@
expression E;
@@
- EXT4_HAS_RO_COMPAT_FEATURE(E, EXT4_FEATURE_RO_COMPAT_METADATA_CSUM)
+ ext4_has_metadata_csum(E)
https://bugzilla.kernel.org/show_bug.cgi?id=82201
Signed-off-by: Dmitry Monakhov <dmonakhov@openvz.org>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Cc: stable@vger.kernel.org
Diffstat (limited to 'fs/ext4/super.c')
-rw-r--r-- | fs/ext4/super.c | 15 |
1 files changed, 5 insertions, 10 deletions
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index a0811cc00c91..5afe42db303c 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c | |||
@@ -140,8 +140,7 @@ static __le32 ext4_superblock_csum(struct super_block *sb, | |||
140 | static int ext4_superblock_csum_verify(struct super_block *sb, | 140 | static int ext4_superblock_csum_verify(struct super_block *sb, |
141 | struct ext4_super_block *es) | 141 | struct ext4_super_block *es) |
142 | { | 142 | { |
143 | if (!EXT4_HAS_RO_COMPAT_FEATURE(sb, | 143 | if (!ext4_has_metadata_csum(sb)) |
144 | EXT4_FEATURE_RO_COMPAT_METADATA_CSUM)) | ||
145 | return 1; | 144 | return 1; |
146 | 145 | ||
147 | return es->s_checksum == ext4_superblock_csum(sb, es); | 146 | return es->s_checksum == ext4_superblock_csum(sb, es); |
@@ -151,8 +150,7 @@ void ext4_superblock_csum_set(struct super_block *sb) | |||
151 | { | 150 | { |
152 | struct ext4_super_block *es = EXT4_SB(sb)->s_es; | 151 | struct ext4_super_block *es = EXT4_SB(sb)->s_es; |
153 | 152 | ||
154 | if (!EXT4_HAS_RO_COMPAT_FEATURE(sb, | 153 | if (!ext4_has_metadata_csum(sb)) |
155 | EXT4_FEATURE_RO_COMPAT_METADATA_CSUM)) | ||
156 | return; | 154 | return; |
157 | 155 | ||
158 | es->s_checksum = ext4_superblock_csum(sb, es); | 156 | es->s_checksum = ext4_superblock_csum(sb, es); |
@@ -1989,8 +1987,7 @@ static __le16 ext4_group_desc_csum(struct ext4_sb_info *sbi, __u32 block_group, | |||
1989 | __u16 crc = 0; | 1987 | __u16 crc = 0; |
1990 | __le32 le_group = cpu_to_le32(block_group); | 1988 | __le32 le_group = cpu_to_le32(block_group); |
1991 | 1989 | ||
1992 | if ((sbi->s_es->s_feature_ro_compat & | 1990 | if (ext4_has_metadata_csum(sbi->s_sb)) { |
1993 | cpu_to_le32(EXT4_FEATURE_RO_COMPAT_METADATA_CSUM))) { | ||
1994 | /* Use new metadata_csum algorithm */ | 1991 | /* Use new metadata_csum algorithm */ |
1995 | __le16 save_csum; | 1992 | __le16 save_csum; |
1996 | __u32 csum32; | 1993 | __u32 csum32; |
@@ -3199,8 +3196,7 @@ static int set_journal_csum_feature_set(struct super_block *sb) | |||
3199 | int compat, incompat; | 3196 | int compat, incompat; |
3200 | struct ext4_sb_info *sbi = EXT4_SB(sb); | 3197 | struct ext4_sb_info *sbi = EXT4_SB(sb); |
3201 | 3198 | ||
3202 | if (EXT4_HAS_RO_COMPAT_FEATURE(sb, | 3199 | if (ext4_has_metadata_csum(sb)) { |
3203 | EXT4_FEATURE_RO_COMPAT_METADATA_CSUM)) { | ||
3204 | /* journal checksum v3 */ | 3200 | /* journal checksum v3 */ |
3205 | compat = 0; | 3201 | compat = 0; |
3206 | incompat = JBD2_FEATURE_INCOMPAT_CSUM_V3; | 3202 | incompat = JBD2_FEATURE_INCOMPAT_CSUM_V3; |
@@ -3508,8 +3504,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | |||
3508 | } | 3504 | } |
3509 | 3505 | ||
3510 | /* Precompute checksum seed for all metadata */ | 3506 | /* Precompute checksum seed for all metadata */ |
3511 | if (EXT4_HAS_RO_COMPAT_FEATURE(sb, | 3507 | if (ext4_has_metadata_csum(sb)) |
3512 | EXT4_FEATURE_RO_COMPAT_METADATA_CSUM)) | ||
3513 | sbi->s_csum_seed = ext4_chksum(sbi, ~0, es->s_uuid, | 3508 | sbi->s_csum_seed = ext4_chksum(sbi, ~0, es->s_uuid, |
3514 | sizeof(es->s_uuid)); | 3509 | sizeof(es->s_uuid)); |
3515 | 3510 | ||