+++ /dev/null
-From 6dafab6b1383e912cd252fa809570b484eb6e0dc Mon Sep 17 00:00:00 2001
-From: NeilBrown <neilb@suse.de>
-Date: Wed, 19 Sep 2012 12:54:22 +1000
-Subject: md: make sure metadata is updated when spares are activated or removed.
-
-From: NeilBrown <neilb@suse.de>
-
-commit 6dafab6b1383e912cd252fa809570b484eb6e0dc upstream.
-
-It isn't always necessary to update the metadata when spares are
-removed as the presence-or-not of a spare isn't really important to
-the integrity of an array.
-Also activating a spare doesn't always require updating the metadata
-as the update on 'recovery-completed' is usually sufficient.
-
-However the introduction of 'replacement' devices have made these
-transitions sometimes more important. For example the 'Replacement'
-flag isn't cleared until the original device is removed, so we need
-to ensure a metadata update after that 'spare' is removed.
-
-So set MD_CHANGE_DEVS whenever a spare is activated or removed, to
-complement the current situation where it is set when a spare is added
-or a device is failed (or a number of other less common situations).
-
-This is suitable for -stable as out-of-data metadata could lead
-to data corruption.
-This is only relevant for 3.3 and later 9when 'replacement' as
-introduced.
-
-Signed-off-by: NeilBrown <neilb@suse.de>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-
----
- drivers/md/md.c | 8 +++++++-
- 1 file changed, 7 insertions(+), 1 deletion(-)
-
---- a/drivers/md/md.c
-+++ b/drivers/md/md.c
-@@ -7096,6 +7096,7 @@ static int remove_and_add_spares(mddev_t
- {
- mdk_rdev_t *rdev;
- int spares = 0;
-+ int removed = 0;
-
- mddev->curr_resync_completed = 0;
-
-@@ -7111,6 +7112,7 @@ static int remove_and_add_spares(mddev_t
- sprintf(nm,"rd%d", rdev->raid_disk);
- sysfs_remove_link(&mddev->kobj, nm);
- rdev->raid_disk = -1;
-+ removed = 1;
- }
- }
-
-@@ -7139,6 +7141,8 @@ static int remove_and_add_spares(mddev_t
- }
- }
- }
-+ if (removed)
-+ set_bit(MD_CHANGE_DEVS, &mddev->flags);
- return spares;
- }
-
-@@ -7152,9 +7156,11 @@ static void reap_sync_thread(mddev_t *md
- !test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) {
- /* success...*/
- /* activate any spares */
-- if (mddev->pers->spare_active(mddev))
-+ if (mddev->pers->spare_active(mddev)) {
- sysfs_notify(&mddev->kobj, NULL,
- "degraded");
-+ set_bit(MD_CHANGE_DEVS, &mddev->flags);
-+ }
- }
- if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) &&
- mddev->pers->finish_reshape)