提交 4878e9eb 编写于 作者: N NeilBrown

md: discard find_rdev_nr in favour of find_rdev_nr_rcu

Having both is a waste - just use the one.
Signed-off-by: NNeilBrown <neilb@suse.de>
上级 1967cd56
...@@ -630,17 +630,6 @@ static void mddev_unlock(struct mddev * mddev) ...@@ -630,17 +630,6 @@ static void mddev_unlock(struct mddev * mddev)
spin_unlock(&pers_lock); 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) static struct md_rdev *find_rdev_nr_rcu(struct mddev *mddev, int nr)
{ {
struct md_rdev *rdev; struct md_rdev *rdev;
...@@ -2060,16 +2049,21 @@ static int bind_rdev_to_array(struct md_rdev * rdev, struct mddev * mddev) ...@@ -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 * If it is -1, assign a free number, else
* check number is not in use * check number is not in use
*/ */
rcu_read_lock();
if (rdev->desc_nr < 0) { if (rdev->desc_nr < 0) {
int choice = 0; int choice = 0;
if (mddev->pers) choice = mddev->raid_disks; if (mddev->pers)
while (find_rdev_nr(mddev, choice)) choice = mddev->raid_disks;
while (find_rdev_nr_rcu(mddev, choice))
choice++; choice++;
rdev->desc_nr = choice; rdev->desc_nr = choice;
} else { } else {
if (find_rdev_nr(mddev, rdev->desc_nr)) if (find_rdev_nr_rcu(mddev, rdev->desc_nr)) {
rcu_read_unlock();
return -EBUSY; return -EBUSY;
}
} }
rcu_read_unlock();
if (mddev->max_disks && rdev->desc_nr >= mddev->max_disks) { if (mddev->max_disks && rdev->desc_nr >= mddev->max_disks) {
printk(KERN_WARNING "md: %s: array is limited to %d devices\n", printk(KERN_WARNING "md: %s: array is limited to %d devices\n",
mdname(mddev), mddev->max_disks); mdname(mddev), mddev->max_disks);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册