raid5-cache: fix lockdep warning
authorShaohua Li <shli@fb.com>
Thu, 17 Nov 2016 01:20:19 +0000 (17:20 -0800)
committerShaohua Li <shli@fb.com>
Thu, 17 Nov 2016 19:30:27 +0000 (11:30 -0800)
lockdep reports warning of the rcu_dereference usage. Using normal rdev
access pattern to avoid the warning.

Signed-off-by: Shaohua Li <shli@fb.com>
drivers/md/raid5-cache.c

index 2e270e69c550aec8d64bc1c229c3f13b40bf3a08..f73672b0a702e211226c5951c6d2792c09148980 100644 (file)
@@ -970,16 +970,28 @@ static int r5l_recovery_flush_one_stripe(struct r5l_log *log,
                        continue;
 
                /* in case device is broken */
+               rcu_read_lock();
                rdev = rcu_dereference(conf->disks[disk_index].rdev);
-               if (rdev)
+               if (rdev) {
+                       atomic_inc(&rdev->nr_pending);
+                       rcu_read_unlock();
                        sync_page_io(rdev, stripe_sect, PAGE_SIZE,
                                     sh->dev[disk_index].page, REQ_OP_WRITE, 0,
                                     false);
+                       rdev_dec_pending(rdev, rdev->mddev);
+                       rcu_read_lock();
+               }
                rrdev = rcu_dereference(conf->disks[disk_index].replacement);
-               if (rrdev)
+               if (rrdev) {
+                       atomic_inc(&rrdev->nr_pending);
+                       rcu_read_unlock();
                        sync_page_io(rrdev, stripe_sect, PAGE_SIZE,
                                     sh->dev[disk_index].page, REQ_OP_WRITE, 0,
                                     false);
+                       rdev_dec_pending(rrdev, rrdev->mddev);
+                       rcu_read_lock();
+               }
+               rcu_read_unlock();
        }
        raid5_release_stripe(sh);
        return 0;