summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeil Brown <neilb@cse.unsw.edu.au>2002-07-18 19:07:44 -0700
committerTrond Myklebust <trond.myklebust@fys.uio.no>2002-07-18 19:07:44 -0700
commit70e96bef8aacd89af3601f63d5d1236071d7d901 (patch)
tree3d7c94fd437c5dec51d7f67615ae921569ee8337
parenta0f86742c04040981e3cb29439ca00179a15da0f (diff)
[PATCH] MD - Get rid of find_rdev_all
Get rid of find_rdev_all find_rdev_all is now only used to check if a device is already used in an md array. We change lock_rdev so that it claims the bdev for the specific rdev rather than for rdevs in general. Now lock_rdev will check if the bdev is inuse by another array or not, so the find_rdev_all check isn't needed and is removed, along with find_rdev_all itself. We also make sure that the error code from lock_rdev is propagated up properly.
-rw-r--r--drivers/md/md.c34
1 files changed, 6 insertions, 28 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 6eb566c0351f..f81091c7a98e 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -603,7 +603,7 @@ static int lock_rdev(mdk_rdev_t *rdev)
err = blkdev_get(bdev, FMODE_READ|FMODE_WRITE, 0, BDEV_RAW);
if (err)
return err;
- err = bd_claim(bdev, lock_rdev);
+ err = bd_claim(bdev, rdev);
if (err) {
blkdev_put(bdev, BDEV_RAW);
return err;
@@ -819,19 +819,6 @@ static int uuid_equal(mdk_rdev_t *rdev1, mdk_rdev_t *rdev2)
return 0;
}
-static mdk_rdev_t * find_rdev_all(kdev_t dev)
-{
- struct list_head *tmp;
- mdk_rdev_t *rdev;
-
- list_for_each(tmp, &all_raid_disks) {
- rdev = list_entry(tmp, mdk_rdev_t, all);
- if (kdev_same(rdev->dev, dev))
- return rdev;
- }
- return NULL;
-}
-
static int write_disk_sb(mdk_rdev_t * rdev)
{
kdev_t dev = rdev->dev;
@@ -1007,9 +994,6 @@ static mdk_rdev_t *md_import_device(kdev_t newdev, int on_disk)
mdk_rdev_t *rdev;
unsigned int size;
- if (find_rdev_all(newdev))
- return ERR_PTR(-EEXIST);
-
rdev = (mdk_rdev_t *) kmalloc(sizeof(*rdev), GFP_KERNEL);
if (!rdev) {
printk(KERN_ERR "md: could not alloc mem for %s!\n", partition_name(newdev));
@@ -1021,10 +1005,10 @@ static mdk_rdev_t *md_import_device(kdev_t newdev, int on_disk)
goto abort_free;
rdev->dev = newdev;
- if (lock_rdev(rdev)) {
- printk(KERN_ERR "md: could not lock %s, zero-size? Marking faulty.\n",
+ err = lock_rdev(rdev);
+ if (err) {
+ printk(KERN_ERR "md: could not lock %s.\n",
partition_name(newdev));
- err = -EINVAL;
goto abort_free;
}
rdev->desc_nr = -1;
@@ -2103,18 +2087,12 @@ static int add_new_disk(mddev_t * mddev, mdu_disk_info_t *info)
unsigned int nr;
kdev_t dev;
dev = mk_kdev(info->major,info->minor);
-
- if (find_rdev_all(dev)) {
- printk(KERN_WARNING "md: device %s already used in a RAID array!\n",
- partition_name(dev));
- return -EBUSY;
- }
if (!mddev->sb) {
/* expecting a device which has a superblock */
rdev = md_import_device(dev, 1);
if (IS_ERR(rdev)) {
printk(KERN_WARNING "md: md_import_device returned %ld\n", PTR_ERR(rdev));
- return -EINVAL;
+ return PTR_ERR(rdev);
}
if (!list_empty(&mddev->disks)) {
mdk_rdev_t *rdev0 = list_entry(mddev->disks.next,
@@ -2153,7 +2131,7 @@ static int add_new_disk(mddev_t * mddev, mdu_disk_info_t *info)
rdev = md_import_device (dev, 0);
if (IS_ERR(rdev)) {
printk(KERN_WARNING "md: error, md_import_device() returned %ld\n", PTR_ERR(rdev));
- return -EINVAL;
+ return PTR_ERR(rdev);
}
rdev->old_dev = dev;
rdev->desc_nr = info->number;