MD: set journal disk ->raid_disk
authorShaohua Li <shli@fb.com>
Fri, 9 Oct 2015 04:54:12 +0000 (21:54 -0700)
committerNeilBrown <neilb@suse.com>
Sun, 1 Nov 2015 02:48:29 +0000 (13:48 +1100)
Set journal disk ->raid_disk to >=0, I choose raid_disks + 1 instead of
0, because we already have a disk with ->raid_disk 0 and this causes
sysfs entry creation conflict. A lot of places assumes disk with
->raid_disk >=0 is normal raid disk, so we add check for journal disk.

Signed-off-by: Shaohua Li <shli@fb.com>
Signed-off-by: NeilBrown <neilb@suse.com>
drivers/md/md.c
drivers/md/raid5.c

index f67cd5b687719557c8d758d555077a5d6781a2a3..b5057596b630420dea63b57b07f1a6abc509705d 100644 (file)
@@ -1650,6 +1650,7 @@ static int super_1_validate(struct mddev *mddev, struct md_rdev *rdev)
                        rdev->journal_tail = le64_to_cpu(sb->journal_tail);
                        if (mddev->recovery_cp == MaxSector)
                                set_bit(MD_JOURNAL_CLEAN, &mddev->flags);
+                       rdev->raid_disk = mddev->raid_disks;
                        break;
                default:
                        rdev->saved_raid_disk = role;
@@ -1719,7 +1720,7 @@ static void super_1_sync(struct mddev *mddev, struct md_rdev *rdev)
                sb->feature_map = cpu_to_le32(MD_FEATURE_BITMAP_OFFSET);
        }
 
-       if (rdev->raid_disk >= 0 &&
+       if (rdev->raid_disk >= 0 && !test_bit(Journal, &rdev->flags) &&
            !test_bit(In_sync, &rdev->flags)) {
                sb->feature_map |=
                        cpu_to_le32(MD_FEATURE_RECOVERY_OFFSET);
@@ -2304,6 +2305,7 @@ repeat:
        rdev_for_each(rdev, mddev) {
                if (rdev->raid_disk >= 0 &&
                    mddev->delta_disks >= 0 &&
+                   !test_bit(Journal, &rdev->flags) &&
                    !test_bit(In_sync, &rdev->flags) &&
                    mddev->curr_resync_completed > rdev->recovery_offset)
                                rdev->recovery_offset = mddev->curr_resync_completed;
@@ -2540,6 +2542,7 @@ state_show(struct md_rdev *rdev, char *page)
                sep = ",";
        }
        if (!test_bit(Faulty, &flags) &&
+           !test_bit(Journal, &flags) &&
            !test_bit(In_sync, &flags)) {
                len += sprintf(page+len, "%sspare", sep);
                sep = ",";
@@ -2626,7 +2629,8 @@ state_store(struct md_rdev *rdev, const char *buf, size_t len)
        } else if (cmd_match(buf, "insync") && rdev->raid_disk == -1) {
                set_bit(In_sync, &rdev->flags);
                err = 0;
-       } else if (cmd_match(buf, "-insync") && rdev->raid_disk >= 0) {
+       } else if (cmd_match(buf, "-insync") && rdev->raid_disk >= 0 &&
+                  !test_bit(Journal, &rdev->flags)) {
                if (rdev->mddev->pers == NULL) {
                        clear_bit(In_sync, &rdev->flags);
                        rdev->saved_raid_disk = rdev->raid_disk;
@@ -2645,6 +2649,7 @@ state_store(struct md_rdev *rdev, const char *buf, size_t len)
                 * check if recovery is needed.
                 */
                if (rdev->raid_disk >= 0 &&
+                   !test_bit(Journal, &rdev->flags) &&
                    !test_bit(Replacement, &rdev->flags))
                        set_bit(WantReplacement, &rdev->flags);
                set_bit(MD_RECOVERY_NEEDED, &rdev->mddev->recovery);
@@ -2722,7 +2727,9 @@ __ATTR(errors, S_IRUGO|S_IWUSR, errors_show, errors_store);
 static ssize_t
 slot_show(struct md_rdev *rdev, char *page)
 {
-       if (rdev->raid_disk < 0)
+       if (test_bit(Journal, &rdev->flags))
+               return sprintf(page, "journal\n");
+       else if (rdev->raid_disk < 0)
                return sprintf(page, "none\n");
        else
                return sprintf(page, "%d\n", rdev->raid_disk);
@@ -2734,6 +2741,8 @@ slot_store(struct md_rdev *rdev, const char *buf, size_t len)
        int slot;
        int err;
 
+       if (test_bit(Journal, &rdev->flags))
+               return -EBUSY;
        if (strncmp(buf, "none", 4)==0)
                slot = -1;
        else {
@@ -2932,6 +2941,8 @@ rdev_size_store(struct md_rdev *rdev, const char *buf, size_t len)
        sector_t oldsectors = rdev->sectors;
        sector_t sectors;
 
+       if (test_bit(Journal, &rdev->flags))
+               return -EBUSY;
        if (strict_blocks_to_sectors(buf, &sectors) < 0)
                return -EINVAL;
        if (rdev->data_offset != rdev->new_data_offset)
@@ -3294,7 +3305,9 @@ static void analyze_sbs(struct mddev *mddev)
                        rdev->desc_nr = i++;
                        rdev->raid_disk = rdev->desc_nr;
                        set_bit(In_sync, &rdev->flags);
-               } else if (rdev->raid_disk >= (mddev->raid_disks - min(0, mddev->delta_disks))) {
+               } else if (rdev->raid_disk >=
+                           (mddev->raid_disks - min(0, mddev->delta_disks)) &&
+                          !test_bit(Journal, &rdev->flags)) {
                        rdev->raid_disk = -1;
                        clear_bit(In_sync, &rdev->flags);
                }
@@ -7825,6 +7838,7 @@ void md_do_sync(struct md_thread *thread)
                rcu_read_lock();
                rdev_for_each_rcu(rdev, mddev)
                        if (rdev->raid_disk >= 0 &&
+                           !test_bit(Journal, &rdev->flags) &&
                            !test_bit(Faulty, &rdev->flags) &&
                            !test_bit(In_sync, &rdev->flags) &&
                            rdev->recovery_offset < j)
@@ -8050,6 +8064,7 @@ void md_do_sync(struct md_thread *thread)
                        rdev_for_each_rcu(rdev, mddev)
                                if (rdev->raid_disk >= 0 &&
                                    mddev->delta_disks >= 0 &&
+                                   !test_bit(Journal, &rdev->flags) &&
                                    !test_bit(Faulty, &rdev->flags) &&
                                    !test_bit(In_sync, &rdev->flags) &&
                                    rdev->recovery_offset < mddev->curr_resync)
@@ -8095,7 +8110,8 @@ static int remove_and_add_spares(struct mddev *mddev,
                    rdev->raid_disk >= 0 &&
                    !test_bit(Blocked, &rdev->flags) &&
                    (test_bit(Faulty, &rdev->flags) ||
-                    ! test_bit(In_sync, &rdev->flags)) &&
+                    (!test_bit(In_sync, &rdev->flags) &&
+                     !test_bit(Journal, &rdev->flags))) &&
                    atomic_read(&rdev->nr_pending)==0) {
                        if (mddev->pers->hot_remove_disk(
                                    mddev, rdev) == 0) {
@@ -8117,6 +8133,7 @@ static int remove_and_add_spares(struct mddev *mddev,
                        continue;
                if (rdev->raid_disk >= 0 &&
                    !test_bit(In_sync, &rdev->flags) &&
+                   !test_bit(Journal, &rdev->flags) &&
                    !test_bit(Faulty, &rdev->flags))
                        spares++;
                if (rdev->raid_disk >= 0)
index e1d18be67243a682193747805258abf3a09146cb..e5befa356dbefa49341052cd34ec6f872ab658d4 100644 (file)
@@ -6560,7 +6560,7 @@ static struct r5conf *setup_conf(struct mddev *mddev)
        rdev_for_each(rdev, mddev) {
                raid_disk = rdev->raid_disk;
                if (raid_disk >= max_disks
-                   || raid_disk < 0)
+                   || raid_disk < 0 || test_bit(Journal, &rdev->flags))
                        continue;
                disk = conf->disks + raid_disk;
 
@@ -6694,8 +6694,10 @@ static int run(struct mddev *mddev)
        rdev_for_each(rdev, mddev) {
                long long diff;
 
-               if (test_bit(Journal, &rdev->flags))
+               if (test_bit(Journal, &rdev->flags)) {
                        journal_dev = rdev;
+                       continue;
+               }
                if (rdev->raid_disk < 0)
                        continue;
                diff = (rdev->new_data_offset - rdev->data_offset);