Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c89a8eee authored by NeilBrown's avatar NeilBrown
Browse files

Allow faulty devices to be removed from a readonly array.



Removing faulty devices from an array is a two stage process.
First the device is moved from being a part of the active array
to being similar to a spare device.  Then it can be removed
by a request from user space.

The first step is currently not performed for read-only arrays,
so the second step can never succeed.

So allow readonly arrays to remove failed devices (which aren't
blocked).

Signed-off-by: default avatarNeilBrown <neilb@suse.de>
parent ac4090d2
Loading
Loading
Loading
Loading
+12 −1
Original line number Diff line number Diff line
@@ -6003,7 +6003,7 @@ static int remove_and_add_spares(mddev_t *mddev)
			}
		}

	if (mddev->degraded) {
	if (mddev->degraded && ! mddev->ro) {
		rdev_for_each(rdev, rtmp, mddev) {
			if (rdev->raid_disk >= 0 &&
			    !test_bit(In_sync, &rdev->flags) &&
@@ -6077,6 +6077,8 @@ void md_check_recovery(mddev_t *mddev)
		flush_signals(current);
	}

	if (mddev->ro && !test_bit(MD_RECOVERY_NEEDED, &mddev->recovery))
		return;
	if ( ! (
		(mddev->flags && !mddev->external) ||
		test_bit(MD_RECOVERY_NEEDED, &mddev->recovery) ||
@@ -6090,6 +6092,15 @@ void md_check_recovery(mddev_t *mddev)
	if (mddev_trylock(mddev)) {
		int spares = 0;

		if (mddev->ro) {
			/* Only thing we do on a ro array is remove
			 * failed devices.
			 */
			remove_and_add_spares(mddev);
			clear_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
			goto unlock;
		}

		if (!mddev->external) {
			int did_change = 0;
			spin_lock_irq(&mddev->write_lock);