hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/fs/ext4/mmp.c
....@@ -39,26 +39,34 @@
3939 * Write the MMP block using REQ_SYNC to try to get the block on-disk
4040 * faster.
4141 */
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)
4344 {
4445 struct mmp_struct *mmp = (struct mmp_struct *)(bh->b_data);
4546
46
- /*
47
- * We protect against freezing so that we don't create dirty buffers
48
- * on frozen filesystem.
49
- */
50
- sb_start_write(sb);
5147 ext4_mmp_csum_set(sb, mmp);
5248 lock_buffer(bh);
5349 bh->b_end_io = end_buffer_write_sync;
5450 get_bh(bh);
5551 submit_bh(REQ_OP_WRITE, REQ_SYNC | REQ_META | REQ_PRIO, bh);
5652 wait_on_buffer(bh);
57
- sb_end_write(sb);
5853 if (unlikely(!buffer_uptodate(bh)))
5954 return -EIO;
60
-
6155 return 0;
56
+}
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;
6270 }
6371
6472 /*
....@@ -290,6 +298,7 @@
290298 if (mmp_block < le32_to_cpu(es->s_first_data_block) ||
291299 mmp_block >= ext4_blocks_count(es)) {
292300 ext4_warning(sb, "Invalid MMP block in superblock");
301
+ retval = -EINVAL;
293302 goto failed;
294303 }
295304
....@@ -315,6 +324,7 @@
315324
316325 if (seq == EXT4_MMP_SEQ_FSCK) {
317326 dump_mmp_msg(sb, mmp, "fsck is running on the filesystem");
327
+ retval = -EBUSY;
318328 goto failed;
319329 }
320330
....@@ -328,6 +338,7 @@
328338
329339 if (schedule_timeout_interruptible(HZ * wait_time) != 0) {
330340 ext4_warning(sb, "MMP startup interrupted, failing mount\n");
341
+ retval = -ETIMEDOUT;
331342 goto failed;
332343 }
333344
....@@ -338,6 +349,7 @@
338349 if (seq != le32_to_cpu(mmp->mmp_seq)) {
339350 dump_mmp_msg(sb, mmp,
340351 "Device is already active on another node.");
352
+ retval = -EBUSY;
341353 goto failed;
342354 }
343355
....@@ -348,7 +360,11 @@
348360 seq = mmp_new_seq();
349361 mmp->mmp_seq = cpu_to_le32(seq);
350362
351
- retval = write_mmp_block(sb, bh);
363
+ /*
364
+ * On mount / remount we are protected against fs freezing (by s_umount
365
+ * semaphore) and grabbing freeze protection upsets lockdep
366
+ */
367
+ retval = write_mmp_block_thawed(sb, bh);
352368 if (retval)
353369 goto failed;
354370
....@@ -357,6 +373,7 @@
357373 */
358374 if (schedule_timeout_interruptible(HZ * wait_time) != 0) {
359375 ext4_warning(sb, "MMP startup interrupted, failing mount");
376
+ retval = -ETIMEDOUT;
360377 goto failed;
361378 }
362379
....@@ -367,6 +384,7 @@
367384 if (seq != le32_to_cpu(mmp->mmp_seq)) {
368385 dump_mmp_msg(sb, mmp,
369386 "Device is already active on another node.");
387
+ retval = -EBUSY;
370388 goto failed;
371389 }
372390
....@@ -383,6 +401,7 @@
383401 EXT4_SB(sb)->s_mmp_tsk = NULL;
384402 ext4_warning(sb, "Unable to create kmmpd thread for %s.",
385403 sb->s_id);
404
+ retval = -ENOMEM;
386405 goto failed;
387406 }
388407
....@@ -390,5 +409,5 @@
390409
391410 failed:
392411 brelse(bh);
393
- return 1;
412
+ return retval;
394413 }