@@ -39,28 +39,36 @@ static void ext4_mmp_csum_set(struct super_block *sb, struct mmp_struct *mmp)
39
39
* Write the MMP block using REQ_SYNC to try to get the block on-disk
40
40
* faster.
41
41
*/
42
- static int write_mmp_block (struct super_block * sb , struct buffer_head * bh )
42
+ static int write_mmp_block_thawed (struct super_block * sb ,
43
+ struct buffer_head * bh )
43
44
{
44
45
struct mmp_struct * mmp = (struct mmp_struct * )(bh -> b_data );
45
46
46
- /*
47
- * We protect against freezing so that we don't create dirty buffers
48
- * on frozen filesystem.
49
- */
50
- sb_start_write (sb );
51
47
ext4_mmp_csum_set (sb , mmp );
52
48
lock_buffer (bh );
53
49
bh -> b_end_io = end_buffer_write_sync ;
54
50
get_bh (bh );
55
51
submit_bh (REQ_OP_WRITE | REQ_SYNC | REQ_META | REQ_PRIO , bh );
56
52
wait_on_buffer (bh );
57
- sb_end_write (sb );
58
53
if (unlikely (!buffer_uptodate (bh )))
59
54
return - EIO ;
60
-
61
55
return 0 ;
62
56
}
63
57
58
+ static int write_mmp_block (struct super_block * sb , struct buffer_head * bh )
59
+ {
60
+ int err ;
61
+
62
+ /*
63
+ * We protect against freezing so that we don't create dirty buffers
64
+ * on frozen filesystem.
65
+ */
66
+ sb_start_write (sb );
67
+ err = write_mmp_block_thawed (sb , bh );
68
+ sb_end_write (sb );
69
+ return err ;
70
+ }
71
+
64
72
/*
65
73
* Read the MMP block. It _must_ be read from disk and hence we clear the
66
74
* uptodate flag on the buffer.
@@ -344,7 +352,11 @@ int ext4_multi_mount_protect(struct super_block *sb,
344
352
seq = mmp_new_seq ();
345
353
mmp -> mmp_seq = cpu_to_le32 (seq );
346
354
347
- retval = write_mmp_block (sb , bh );
355
+ /*
356
+ * On mount / remount we are protected against fs freezing (by s_umount
357
+ * semaphore) and grabbing freeze protection upsets lockdep
358
+ */
359
+ retval = write_mmp_block_thawed (sb , bh );
348
360
if (retval )
349
361
goto failed ;
350
362
0 commit comments