Browse Source

raid5: journal disk can't be removed

raid5-cache uses journal disk rdev->bdev, rdev->mddev in several places.
Don't allow journal disk disappear magically. On the other hand, we do
need to update superblock for other disks to bump up ->events, so next
time journal disk will be identified as stale.

Signed-off-by: Shaohua Li <shli@fb.com>
Signed-off-by: NeilBrown <neilb@suse.com>
Shaohua Li 9 years ago
parent
commit
c2bb6242ec
1 changed files with 11 additions and 0 deletions
  1. 11 0
      drivers/md/raid5.c

+ 11 - 0
drivers/md/raid5.c

@@ -7128,6 +7128,15 @@ static int raid5_remove_disk(struct mddev *mddev, struct md_rdev *rdev)
 	struct disk_info *p = conf->disks + number;
 	struct disk_info *p = conf->disks + number;
 
 
 	print_raid5_conf(conf);
 	print_raid5_conf(conf);
+	if (test_bit(Journal, &rdev->flags)) {
+		/*
+		 * journal disk is not removable, but we need give a chance to
+		 * update superblock of other disks. Otherwise journal disk
+		 * will be considered as 'fresh'
+		 */
+		set_bit(MD_CHANGE_DEVS, &mddev->flags);
+		return -EINVAL;
+	}
 	if (rdev == p->rdev)
 	if (rdev == p->rdev)
 		rdevp = &p->rdev;
 		rdevp = &p->rdev;
 	else if (rdev == p->replacement)
 	else if (rdev == p->replacement)
@@ -7190,6 +7199,8 @@ static int raid5_add_disk(struct mddev *mddev, struct md_rdev *rdev)
 	int first = 0;
 	int first = 0;
 	int last = conf->raid_disks - 1;
 	int last = conf->raid_disks - 1;
 
 
+	if (test_bit(Journal, &rdev->flags))
+		return -EINVAL;
 	if (mddev->recovery_disabled == conf->recovery_disabled)
 	if (mddev->recovery_disabled == conf->recovery_disabled)
 		return -EBUSY;
 		return -EBUSY;