9
/* Checksumming functions */
10
static __u32 ext4_mmp_csum(struct super_block *sb, struct mmp_struct *mmp)
12
struct ext4_sb_info *sbi = EXT4_SB(sb);
13
int offset = offsetof(struct mmp_struct, mmp_checksum);
16
csum = ext4_chksum(sbi, sbi->s_csum_seed, (char *)mmp, offset);
18
return cpu_to_le32(csum);
21
int ext4_mmp_csum_verify(struct super_block *sb, struct mmp_struct *mmp)
23
if (!EXT4_HAS_RO_COMPAT_FEATURE(sb,
24
EXT4_FEATURE_RO_COMPAT_METADATA_CSUM))
27
return mmp->mmp_checksum == ext4_mmp_csum(sb, mmp);
30
void ext4_mmp_csum_set(struct super_block *sb, struct mmp_struct *mmp)
32
if (!EXT4_HAS_RO_COMPAT_FEATURE(sb,
33
EXT4_FEATURE_RO_COMPAT_METADATA_CSUM))
36
mmp->mmp_checksum = ext4_mmp_csum(sb, mmp);
10
40
* Write the MMP block using WRITE_SYNC to try to get the block on-disk
13
static int write_mmp_block(struct buffer_head *bh)
43
static int write_mmp_block(struct super_block *sb, struct buffer_head *bh)
45
struct mmp_struct *mmp = (struct mmp_struct *)(bh->b_data);
47
ext4_mmp_csum_set(sb, mmp);
15
48
mark_buffer_dirty(bh);
17
50
bh->b_end_io = end_buffer_write_sync;
61
94
mmp = (struct mmp_struct *)((*bh)->b_data);
62
if (le32_to_cpu(mmp->mmp_magic) != EXT4_MMP_MAGIC)
95
if (le32_to_cpu(mmp->mmp_magic) != EXT4_MMP_MAGIC ||
96
!ext4_mmp_csum_verify(sb, mmp))
120
154
mmp->mmp_time = cpu_to_le64(get_seconds());
121
155
last_update_time = jiffies;
123
retval = write_mmp_block(bh);
157
retval = write_mmp_block(sb, bh);
125
159
* Don't spew too many error messages. Print one every
126
160
* (s_mmp_update_interval * 60) seconds.
200
234
mmp->mmp_seq = cpu_to_le32(EXT4_MMP_SEQ_CLEAN);
201
235
mmp->mmp_time = cpu_to_le64(get_seconds());
203
retval = write_mmp_block(bh);
237
retval = write_mmp_block(sb, bh);