aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ext4/super.c
diff options
context:
space:
mode:
authorDmitry Monakhov <dmonakhov@openvz.org>2014-10-13 03:36:16 -0400
committerTheodore Ts'o <tytso@mit.edu>2014-10-13 03:36:16 -0400
commit9aa5d32ba269bec0e7eaba2697a986a7b0bc8528 (patch)
tree3702c0a5ff64152ecd33d7469164832a7811f28f /fs/ext4/super.c
parent65dd8327eb055a393a413a2214f70a9a10ff7ad6 (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.c15
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,
140static int ext4_superblock_csum_verify(struct super_block *sb, 140static 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