Loading drivers/md/md.c +39 −3 Original line number Diff line number Diff line Loading @@ -1932,7 +1932,7 @@ slot_store(mdk_rdev_t *rdev, const char *buf, size_t len) slot = -1; else if (e==buf || (*e && *e!= '\n')) return -EINVAL; if (rdev->mddev->pers) { if (rdev->mddev->pers && slot == -1) { /* Setting 'slot' on an active array requires also * updating the 'rd%d' link, and communicating * with the personality with ->hot_*_disk. Loading @@ -1940,8 +1940,6 @@ slot_store(mdk_rdev_t *rdev, const char *buf, size_t len) * failed/spare devices. This normally happens automatically, * but not when the metadata is externally managed. */ if (slot != -1) return -EBUSY; if (rdev->raid_disk == -1) return -EEXIST; /* personality does all needed checks */ Loading @@ -1955,6 +1953,44 @@ slot_store(mdk_rdev_t *rdev, const char *buf, size_t len) sysfs_remove_link(&rdev->mddev->kobj, nm); set_bit(MD_RECOVERY_NEEDED, &rdev->mddev->recovery); md_wakeup_thread(rdev->mddev->thread); } else if (rdev->mddev->pers) { mdk_rdev_t *rdev2; struct list_head *tmp; /* Activating a spare .. or possibly reactivating * if we every get bitmaps working here. */ if (rdev->raid_disk != -1) return -EBUSY; if (rdev->mddev->pers->hot_add_disk == NULL) return -EINVAL; rdev_for_each(rdev2, tmp, rdev->mddev) if (rdev2->raid_disk == slot) return -EEXIST; rdev->raid_disk = slot; if (test_bit(In_sync, &rdev->flags)) rdev->saved_raid_disk = slot; else rdev->saved_raid_disk = -1; err = rdev->mddev->pers-> hot_add_disk(rdev->mddev, rdev); if (err != 1) { rdev->raid_disk = -1; if (err == 0) return -EEXIST; return err; } sprintf(nm, "rd%d", rdev->raid_disk); if (sysfs_create_link(&rdev->mddev->kobj, &rdev->kobj, nm)) printk(KERN_WARNING "md: cannot register " "%s for %s\n", nm, mdname(rdev->mddev)); /* don't wakeup anyone, leave that to userspace. */ } else { if (slot >= rdev->mddev->raid_disks) return -ENOSPC; Loading drivers/md/multipath.c +6 −1 Original line number Diff line number Diff line Loading @@ -284,10 +284,15 @@ static int multipath_add_disk(mddev_t *mddev, mdk_rdev_t *rdev) int found = 0; int path; struct multipath_info *p; int first = 0; int last = mddev->raid_disks - 1; if (rdev->raid_disk >= 0) first = last = rdev->raid_disk; print_multipath_conf(conf); for (path=0; path<mddev->raid_disks; path++) for (path = first; path <= last; path++) if ((p=conf->multipaths+path)->rdev == NULL) { q = rdev->bdev->bd_disk->queue; blk_queue_stack_limits(mddev->queue, q); Loading drivers/md/raid1.c +6 −1 Original line number Diff line number Diff line Loading @@ -1103,8 +1103,13 @@ static int raid1_add_disk(mddev_t *mddev, mdk_rdev_t *rdev) int found = 0; int mirror = 0; mirror_info_t *p; int first = 0; int last = mddev->raid_disks - 1; for (mirror=0; mirror < mddev->raid_disks; mirror++) if (rdev->raid_disk >= 0) first = last = rdev->raid_disk; for (mirror = first; mirror <= last; mirror++) if ( !(p=conf->mirrors+mirror)->rdev) { blk_queue_stack_limits(mddev->queue, Loading drivers/md/raid10.c +8 −2 Original line number Diff line number Diff line Loading @@ -1116,6 +1116,8 @@ static int raid10_add_disk(mddev_t *mddev, mdk_rdev_t *rdev) int found = 0; int mirror; mirror_info_t *p; int first = 0; int last = mddev->raid_disks - 1; if (mddev->recovery_cp < MaxSector) /* only hot-add to in-sync arrays, as recovery is Loading @@ -1125,12 +1127,16 @@ static int raid10_add_disk(mddev_t *mddev, mdk_rdev_t *rdev) if (!enough(conf)) return 0; if (rdev->raid_disk) first = last = rdev->raid_disk; if (rdev->saved_raid_disk >= 0 && rdev->saved_raid_disk >= first && conf->mirrors[rdev->saved_raid_disk].rdev == NULL) mirror = rdev->saved_raid_disk; else mirror = 0; for ( ; mirror < mddev->raid_disks; mirror++) mirror = first; for ( ; mirror <= last ; mirror++) if ( !(p=conf->mirrors+mirror)->rdev) { blk_queue_stack_limits(mddev->queue, Loading drivers/md/raid5.c +8 −2 Original line number Diff line number Diff line Loading @@ -4607,21 +4607,27 @@ static int raid5_add_disk(mddev_t *mddev, mdk_rdev_t *rdev) int found = 0; int disk; struct disk_info *p; int first = 0; int last = conf->raid_disks - 1; if (mddev->degraded > conf->max_degraded) /* no point adding a device */ return 0; if (rdev->raid_disk >= 0) first = last = rdev->raid_disk; /* * find the disk ... but prefer rdev->saved_raid_disk * if possible. */ if (rdev->saved_raid_disk >= 0 && rdev->saved_raid_disk >= first && conf->disks[rdev->saved_raid_disk].rdev == NULL) disk = rdev->saved_raid_disk; else disk = 0; for ( ; disk < conf->raid_disks; disk++) disk = first; for ( ; disk <= last ; disk++) if ((p=conf->disks + disk)->rdev == NULL) { clear_bit(In_sync, &rdev->flags); rdev->raid_disk = disk; Loading Loading
drivers/md/md.c +39 −3 Original line number Diff line number Diff line Loading @@ -1932,7 +1932,7 @@ slot_store(mdk_rdev_t *rdev, const char *buf, size_t len) slot = -1; else if (e==buf || (*e && *e!= '\n')) return -EINVAL; if (rdev->mddev->pers) { if (rdev->mddev->pers && slot == -1) { /* Setting 'slot' on an active array requires also * updating the 'rd%d' link, and communicating * with the personality with ->hot_*_disk. Loading @@ -1940,8 +1940,6 @@ slot_store(mdk_rdev_t *rdev, const char *buf, size_t len) * failed/spare devices. This normally happens automatically, * but not when the metadata is externally managed. */ if (slot != -1) return -EBUSY; if (rdev->raid_disk == -1) return -EEXIST; /* personality does all needed checks */ Loading @@ -1955,6 +1953,44 @@ slot_store(mdk_rdev_t *rdev, const char *buf, size_t len) sysfs_remove_link(&rdev->mddev->kobj, nm); set_bit(MD_RECOVERY_NEEDED, &rdev->mddev->recovery); md_wakeup_thread(rdev->mddev->thread); } else if (rdev->mddev->pers) { mdk_rdev_t *rdev2; struct list_head *tmp; /* Activating a spare .. or possibly reactivating * if we every get bitmaps working here. */ if (rdev->raid_disk != -1) return -EBUSY; if (rdev->mddev->pers->hot_add_disk == NULL) return -EINVAL; rdev_for_each(rdev2, tmp, rdev->mddev) if (rdev2->raid_disk == slot) return -EEXIST; rdev->raid_disk = slot; if (test_bit(In_sync, &rdev->flags)) rdev->saved_raid_disk = slot; else rdev->saved_raid_disk = -1; err = rdev->mddev->pers-> hot_add_disk(rdev->mddev, rdev); if (err != 1) { rdev->raid_disk = -1; if (err == 0) return -EEXIST; return err; } sprintf(nm, "rd%d", rdev->raid_disk); if (sysfs_create_link(&rdev->mddev->kobj, &rdev->kobj, nm)) printk(KERN_WARNING "md: cannot register " "%s for %s\n", nm, mdname(rdev->mddev)); /* don't wakeup anyone, leave that to userspace. */ } else { if (slot >= rdev->mddev->raid_disks) return -ENOSPC; Loading
drivers/md/multipath.c +6 −1 Original line number Diff line number Diff line Loading @@ -284,10 +284,15 @@ static int multipath_add_disk(mddev_t *mddev, mdk_rdev_t *rdev) int found = 0; int path; struct multipath_info *p; int first = 0; int last = mddev->raid_disks - 1; if (rdev->raid_disk >= 0) first = last = rdev->raid_disk; print_multipath_conf(conf); for (path=0; path<mddev->raid_disks; path++) for (path = first; path <= last; path++) if ((p=conf->multipaths+path)->rdev == NULL) { q = rdev->bdev->bd_disk->queue; blk_queue_stack_limits(mddev->queue, q); Loading
drivers/md/raid1.c +6 −1 Original line number Diff line number Diff line Loading @@ -1103,8 +1103,13 @@ static int raid1_add_disk(mddev_t *mddev, mdk_rdev_t *rdev) int found = 0; int mirror = 0; mirror_info_t *p; int first = 0; int last = mddev->raid_disks - 1; for (mirror=0; mirror < mddev->raid_disks; mirror++) if (rdev->raid_disk >= 0) first = last = rdev->raid_disk; for (mirror = first; mirror <= last; mirror++) if ( !(p=conf->mirrors+mirror)->rdev) { blk_queue_stack_limits(mddev->queue, Loading
drivers/md/raid10.c +8 −2 Original line number Diff line number Diff line Loading @@ -1116,6 +1116,8 @@ static int raid10_add_disk(mddev_t *mddev, mdk_rdev_t *rdev) int found = 0; int mirror; mirror_info_t *p; int first = 0; int last = mddev->raid_disks - 1; if (mddev->recovery_cp < MaxSector) /* only hot-add to in-sync arrays, as recovery is Loading @@ -1125,12 +1127,16 @@ static int raid10_add_disk(mddev_t *mddev, mdk_rdev_t *rdev) if (!enough(conf)) return 0; if (rdev->raid_disk) first = last = rdev->raid_disk; if (rdev->saved_raid_disk >= 0 && rdev->saved_raid_disk >= first && conf->mirrors[rdev->saved_raid_disk].rdev == NULL) mirror = rdev->saved_raid_disk; else mirror = 0; for ( ; mirror < mddev->raid_disks; mirror++) mirror = first; for ( ; mirror <= last ; mirror++) if ( !(p=conf->mirrors+mirror)->rdev) { blk_queue_stack_limits(mddev->queue, Loading
drivers/md/raid5.c +8 −2 Original line number Diff line number Diff line Loading @@ -4607,21 +4607,27 @@ static int raid5_add_disk(mddev_t *mddev, mdk_rdev_t *rdev) int found = 0; int disk; struct disk_info *p; int first = 0; int last = conf->raid_disks - 1; if (mddev->degraded > conf->max_degraded) /* no point adding a device */ return 0; if (rdev->raid_disk >= 0) first = last = rdev->raid_disk; /* * find the disk ... but prefer rdev->saved_raid_disk * if possible. */ if (rdev->saved_raid_disk >= 0 && rdev->saved_raid_disk >= first && conf->disks[rdev->saved_raid_disk].rdev == NULL) disk = rdev->saved_raid_disk; else disk = 0; for ( ; disk < conf->raid_disks; disk++) disk = first; for ( ; disk <= last ; disk++) if ((p=conf->disks + disk)->rdev == NULL) { clear_bit(In_sync, &rdev->flags); rdev->raid_disk = disk; Loading