md: discard find_rdev_nr in favour of find_rdev_nr_rcu
authorNeilBrown <neilb@suse.de>
Thu, 25 Sep 2014 07:00:11 +0000 (17:00 +1000)
committerNeilBrown <neilb@suse.de>
Tue, 14 Oct 2014 02:08:28 +0000 (13:08 +1100)
Having both is a waste - just use the one.

Signed-off-by: NeilBrown <neilb@suse.de>
drivers/md/md.c

index 6be7146..73451f3 100644 (file)
@@ -630,17 +630,6 @@ static void mddev_unlock(struct mddev * mddev)
        spin_unlock(&pers_lock);
 }
 
-static struct md_rdev * find_rdev_nr(struct mddev *mddev, int nr)
-{
-       struct md_rdev *rdev;
-
-       rdev_for_each(rdev, mddev)
-               if (rdev->desc_nr == nr)
-                       return rdev;
-
-       return NULL;
-}
-
 static struct md_rdev *find_rdev_nr_rcu(struct mddev *mddev, int nr)
 {
        struct md_rdev *rdev;
@@ -2060,16 +2049,21 @@ static int bind_rdev_to_array(struct md_rdev * rdev, struct mddev * mddev)
         * If it is -1, assign a free number, else
         * check number is not in use
         */
+       rcu_read_lock();
        if (rdev->desc_nr < 0) {
                int choice = 0;
-               if (mddev->pers) choice = mddev->raid_disks;
-               while (find_rdev_nr(mddev, choice))
+               if (mddev->pers)
+                       choice = mddev->raid_disks;
+               while (find_rdev_nr_rcu(mddev, choice))
                        choice++;
                rdev->desc_nr = choice;
        } else {
-               if (find_rdev_nr(mddev, rdev->desc_nr))
+               if (find_rdev_nr_rcu(mddev, rdev->desc_nr)) {
+                       rcu_read_unlock();
                        return -EBUSY;
+               }
        }
+       rcu_read_unlock();
        if (mddev->max_disks && rdev->desc_nr >= mddev->max_disks) {
                printk(KERN_WARNING "md: %s: array is limited to %d devices\n",
                       mdname(mddev), mddev->max_disks);