Skip to content

Commit

Permalink
md: HOT_DISK_REMOVE shouldn't make a read-auto device active.
Browse files Browse the repository at this point in the history
If a fail device or a spare is removed from an array, there is
not need to make the array 'active'.  If/when the array does become
active for some other reason the metadata will be update to reflect
the removal.
If that never happens and the array is stopped while still read-auto,
then there is no loss in forgetting the that the device had 'failed'.

A read-only array will leave failed devices attached to
the array personality, so we need to explicitly call
remove_and_add_spares() to free it (clearing Blocked just
like we do in store_slot()).

Signed-off-by: NeilBrown <neilb@suse.de>
  • Loading branch information
NeilBrown committed Apr 24, 2013
1 parent 746d320 commit 3ea8929
Showing 1 changed file with 7 additions and 4 deletions.
11 changes: 7 additions & 4 deletions drivers/md/md.c
Original file line number Diff line number Diff line change
Expand Up @@ -5883,6 +5883,9 @@ static int hot_remove_disk(struct mddev * mddev, dev_t dev)
if (!rdev)
return -ENXIO;

clear_bit(Blocked, &rdev->flags);
remove_and_add_spares(mddev, rdev);

if (rdev->raid_disk >= 0)
goto busy;

Expand Down Expand Up @@ -6496,6 +6499,10 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode,
err = md_set_readonly(mddev, bdev);
goto done_unlock;

case HOT_REMOVE_DISK:
err = hot_remove_disk(mddev, new_decode_dev(arg));
goto done_unlock;

case BLKROSET:
if (get_user(ro, (int __user *)(arg))) {
err = -EFAULT;
Expand Down Expand Up @@ -6566,10 +6573,6 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode,
goto done_unlock;
}

case HOT_REMOVE_DISK:
err = hot_remove_disk(mddev, new_decode_dev(arg));
goto done_unlock;

case HOT_ADD_DISK:
err = hot_add_disk(mddev, new_decode_dev(arg));
goto done_unlock;
Expand Down

0 comments on commit 3ea8929

Please sign in to comment.