In the first loop of function raid10_handle_discard. It already determines which disk need to handle discard request and add the rdev reference count. So the conf->mirrors will not change until all bios come back from underlayer disks. It doesn't need to use rcu_dereference to get rdev. Signed-off-by: Xiao Ni <xni@xxxxxxxxxx> --- drivers/md/raid10.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 16977e8..cef9869 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -1743,9 +1743,8 @@ static int raid10_handle_discard(struct mddev *mddev, struct bio *bio) for (disk = 0; disk < geo->raid_disks; disk++) { sector_t dev_start, dev_end; struct bio *mbio, *rbio = NULL; - struct md_rdev *rdev = rcu_dereference(conf->mirrors[disk].rdev); - struct md_rdev *rrdev = rcu_dereference( - conf->mirrors[disk].replacement); + struct md_rdev *rdev = conf->mirrors[disk].rdev; + struct md_rdev *rrdev = conf->mirrors[disk].replacement; /* * Now start to calculate the start and end address for each disk. -- 2.7.5