From: NeilBrown Date: Thu, 2 Jun 2016 06:19:52 +0000 (+1000) Subject: md/raid5: add rcu protection to rdev accesses in want_replace X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=3f232d6a95fc0fe539e0855ee7f3854b03c8104e;p=linux-beck.git md/raid5: add rcu protection to rdev accesses in want_replace Being in the middle of resync is no longer protection against failed rdevs disappearing. So add rcu protection. Signed-off-by: NeilBrown Signed-off-by: Shaohua Li --- diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index e56c7e0627fa..198b2a9eef98 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -3239,15 +3239,16 @@ static int want_replace(struct stripe_head *sh, int disk_idx) { struct md_rdev *rdev; int rv = 0; - /* Doing recovery so rcu locking not required */ - rdev = sh->raid_conf->disks[disk_idx].replacement; + + rcu_read_lock(); + rdev = rcu_dereference(sh->raid_conf->disks[disk_idx].replacement); if (rdev && !test_bit(Faulty, &rdev->flags) && !test_bit(In_sync, &rdev->flags) && (rdev->recovery_offset <= sh->sector || rdev->mddev->recovery_cp <= sh->sector)) rv = 1; - + rcu_read_unlock(); return rv; }