md-cluster: protect md_find_rdev_nr_rcu with rcu lock
authorGuoqing Jiang <gqjiang@suse.com>
Fri, 12 Aug 2016 05:42:39 +0000 (13:42 +0800)
committerShaohua Li <shli@fb.com>
Wed, 21 Sep 2016 16:09:44 +0000 (09:09 -0700)
We need to use rcu_read_lock/unlock to avoid potential
race.

Reported-by: Shaohua Li <shli@fb.com>
Reviewed-by: NeilBrown <neilb@suse.com>
Signed-off-by: Guoqing Jiang <gqjiang@suse.com>
Signed-off-by: Shaohua Li <shli@fb.com>
drivers/md/md-cluster.c

index 67a7358..b4dc211 100644 (file)
@@ -489,9 +489,10 @@ static void process_metadata_update(struct mddev *mddev, struct cluster_msg *msg
 
 static void process_remove_disk(struct mddev *mddev, struct cluster_msg *msg)
 {
-       struct md_rdev *rdev = md_find_rdev_nr_rcu(mddev,
-                                                  le32_to_cpu(msg->raid_slot));
+       struct md_rdev *rdev;
 
+       rcu_read_lock();
+       rdev = md_find_rdev_nr_rcu(mddev, le32_to_cpu(msg->raid_slot));
        if (rdev) {
                set_bit(ClusterRemove, &rdev->flags);
                set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
@@ -500,18 +501,21 @@ static void process_remove_disk(struct mddev *mddev, struct cluster_msg *msg)
        else
                pr_warn("%s: %d Could not find disk(%d) to REMOVE\n",
                        __func__, __LINE__, le32_to_cpu(msg->raid_slot));
+       rcu_read_unlock();
 }
 
 static void process_readd_disk(struct mddev *mddev, struct cluster_msg *msg)
 {
-       struct md_rdev *rdev = md_find_rdev_nr_rcu(mddev,
-                                                  le32_to_cpu(msg->raid_slot));
+       struct md_rdev *rdev;
 
+       rcu_read_lock();
+       rdev = md_find_rdev_nr_rcu(mddev, le32_to_cpu(msg->raid_slot));
        if (rdev && test_bit(Faulty, &rdev->flags))
                clear_bit(Faulty, &rdev->flags);
        else
                pr_warn("%s: %d Could not find disk(%d) which is faulty",
                        __func__, __LINE__, le32_to_cpu(msg->raid_slot));
+       rcu_read_unlock();
 }
 
 static int process_recvd_msg(struct mddev *mddev, struct cluster_msg *msg)