Преглед на файлове

r5cache: set MD_JOURNAL_CLEAN correctly

Currently, the code sets MD_JOURNAL_CLEAN when the array has
MD_FEATURE_JOURNAL and the recovery_cp is MaxSector. The array
will be MD_JOURNAL_CLEAN even if the journal device is missing.

With this patch, the MD_JOURNAL_CLEAN is only set when the journal
device presents.

Signed-off-by: Song Liu <songliubraving@fb.com>
Signed-off-by: Shaohua Li <shli@fb.com>
Song Liu преди 9 години
родител
ревизия
486b0f7bcd
променени са 2 файла, в които са добавени 9 реда и са изтрити 9 реда
  1. 1 4
      drivers/md/md.c
  2. 8 5
      drivers/md/raid5.c

+ 1 - 4
drivers/md/md.c

@@ -1604,11 +1604,8 @@ static int super_1_validate(struct mddev *mddev, struct md_rdev *rdev)
 			mddev->new_chunk_sectors = mddev->chunk_sectors;
 			mddev->new_chunk_sectors = mddev->chunk_sectors;
 		}
 		}
 
 
-		if (le32_to_cpu(sb->feature_map) & MD_FEATURE_JOURNAL) {
+		if (le32_to_cpu(sb->feature_map) & MD_FEATURE_JOURNAL)
 			set_bit(MD_HAS_JOURNAL, &mddev->flags);
 			set_bit(MD_HAS_JOURNAL, &mddev->flags);
-			if (mddev->recovery_cp == MaxSector)
-				set_bit(MD_JOURNAL_CLEAN, &mddev->flags);
-		}
 	} else if (mddev->pers == NULL) {
 	} else if (mddev->pers == NULL) {
 		/* Insist of good event counter while assembling, except for
 		/* Insist of good event counter while assembling, except for
 		 * spares (which don't need an event count) */
 		 * spares (which don't need an event count) */

+ 8 - 5
drivers/md/raid5.c

@@ -6840,11 +6840,14 @@ static int raid5_run(struct mddev *mddev)
 	if (IS_ERR(conf))
 	if (IS_ERR(conf))
 		return PTR_ERR(conf);
 		return PTR_ERR(conf);
 
 
-	if (test_bit(MD_HAS_JOURNAL, &mddev->flags) && !journal_dev) {
-		printk(KERN_ERR "md/raid:%s: journal disk is missing, force array readonly\n",
-		       mdname(mddev));
-		mddev->ro = 1;
-		set_disk_ro(mddev->gendisk, 1);
+	if (test_bit(MD_HAS_JOURNAL, &mddev->flags)) {
+		if (!journal_dev) {
+			pr_err("md/raid:%s: journal disk is missing, force array readonly\n",
+			       mdname(mddev));
+			mddev->ro = 1;
+			set_disk_ro(mddev->gendisk, 1);
+		} else if (mddev->recovery_cp == MaxSector)
+			set_bit(MD_JOURNAL_CLEAN, &mddev->flags);
 	}
 	}
 
 
 	conf->min_offset_diff = min_offset_diff;
 	conf->min_offset_diff = min_offset_diff;