diff options
Diffstat (limited to 'drivers/md')
-rw-r--r-- | drivers/md/dm-table.c | 15 | ||||
-rw-r--r-- | drivers/md/md.c | 14 |
2 files changed, 6 insertions, 23 deletions
diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c index 2c876ffc63df..9e88ca0c55e9 100644 --- a/drivers/md/dm-table.c +++ b/drivers/md/dm-table.c | |||
@@ -325,20 +325,13 @@ static int open_dev(struct dm_dev_internal *d, dev_t dev, | |||
325 | 325 | ||
326 | BUG_ON(d->dm_dev.bdev); | 326 | BUG_ON(d->dm_dev.bdev); |
327 | 327 | ||
328 | bdev = open_by_devnum(dev, d->dm_dev.mode); | 328 | bdev = open_by_devnum(dev, d->dm_dev.mode | FMODE_EXCL, _claim_ptr); |
329 | if (IS_ERR(bdev)) | 329 | if (IS_ERR(bdev)) |
330 | return PTR_ERR(bdev); | 330 | return PTR_ERR(bdev); |
331 | 331 | ||
332 | r = bd_claim(bdev, _claim_ptr); | ||
333 | if (r) { | ||
334 | blkdev_put(bdev, d->dm_dev.mode); | ||
335 | return r; | ||
336 | } | ||
337 | |||
338 | r = bd_link_disk_holder(bdev, dm_disk(md)); | 332 | r = bd_link_disk_holder(bdev, dm_disk(md)); |
339 | if (r) { | 333 | if (r) { |
340 | bd_release(bdev); | 334 | blkdev_put(bdev, d->dm_dev.mode | FMODE_EXCL); |
341 | blkdev_put(bdev, d->dm_dev.mode); | ||
342 | return r; | 335 | return r; |
343 | } | 336 | } |
344 | 337 | ||
@@ -354,9 +347,7 @@ static void close_dev(struct dm_dev_internal *d, struct mapped_device *md) | |||
354 | if (!d->dm_dev.bdev) | 347 | if (!d->dm_dev.bdev) |
355 | return; | 348 | return; |
356 | 349 | ||
357 | bd_unlink_disk_holder(d->dm_dev.bdev); | 350 | blkdev_put(d->dm_dev.bdev, d->dm_dev.mode | FMODE_EXCL); |
358 | bd_release(d->dm_dev.bdev); | ||
359 | blkdev_put(d->dm_dev.bdev, d->dm_dev.mode); | ||
360 | d->dm_dev.bdev = NULL; | 351 | d->dm_dev.bdev = NULL; |
361 | } | 352 | } |
362 | 353 | ||
diff --git a/drivers/md/md.c b/drivers/md/md.c index c47644fca1a1..6af951ffe0bb 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
@@ -1907,7 +1907,6 @@ static void unbind_rdev_from_array(mdk_rdev_t * rdev) | |||
1907 | MD_BUG(); | 1907 | MD_BUG(); |
1908 | return; | 1908 | return; |
1909 | } | 1909 | } |
1910 | bd_unlink_disk_holder(rdev->bdev); | ||
1911 | list_del_rcu(&rdev->same_set); | 1910 | list_del_rcu(&rdev->same_set); |
1912 | printk(KERN_INFO "md: unbind<%s>\n", bdevname(rdev->bdev,b)); | 1911 | printk(KERN_INFO "md: unbind<%s>\n", bdevname(rdev->bdev,b)); |
1913 | rdev->mddev = NULL; | 1912 | rdev->mddev = NULL; |
@@ -1935,19 +1934,13 @@ static int lock_rdev(mdk_rdev_t *rdev, dev_t dev, int shared) | |||
1935 | struct block_device *bdev; | 1934 | struct block_device *bdev; |
1936 | char b[BDEVNAME_SIZE]; | 1935 | char b[BDEVNAME_SIZE]; |
1937 | 1936 | ||
1938 | bdev = open_by_devnum(dev, FMODE_READ|FMODE_WRITE); | 1937 | bdev = open_by_devnum(dev, FMODE_READ|FMODE_WRITE|FMODE_EXCL, |
1938 | shared ? (mdk_rdev_t *)lock_rdev : rdev); | ||
1939 | if (IS_ERR(bdev)) { | 1939 | if (IS_ERR(bdev)) { |
1940 | printk(KERN_ERR "md: could not open %s.\n", | 1940 | printk(KERN_ERR "md: could not open %s.\n", |
1941 | __bdevname(dev, b)); | 1941 | __bdevname(dev, b)); |
1942 | return PTR_ERR(bdev); | 1942 | return PTR_ERR(bdev); |
1943 | } | 1943 | } |
1944 | err = bd_claim(bdev, shared ? (mdk_rdev_t *)lock_rdev : rdev); | ||
1945 | if (err) { | ||
1946 | printk(KERN_ERR "md: could not bd_claim %s.\n", | ||
1947 | bdevname(bdev, b)); | ||
1948 | blkdev_put(bdev, FMODE_READ|FMODE_WRITE); | ||
1949 | return err; | ||
1950 | } | ||
1951 | if (!shared) | 1944 | if (!shared) |
1952 | set_bit(AllReserved, &rdev->flags); | 1945 | set_bit(AllReserved, &rdev->flags); |
1953 | rdev->bdev = bdev; | 1946 | rdev->bdev = bdev; |
@@ -1960,8 +1953,7 @@ static void unlock_rdev(mdk_rdev_t *rdev) | |||
1960 | rdev->bdev = NULL; | 1953 | rdev->bdev = NULL; |
1961 | if (!bdev) | 1954 | if (!bdev) |
1962 | MD_BUG(); | 1955 | MD_BUG(); |
1963 | bd_release(bdev); | 1956 | blkdev_put(bdev, FMODE_READ|FMODE_WRITE|FMODE_EXCL); |
1964 | blkdev_put(bdev, FMODE_READ|FMODE_WRITE); | ||
1965 | } | 1957 | } |
1966 | 1958 | ||
1967 | void md_autodetect_dev(dev_t dev); | 1959 | void md_autodetect_dev(dev_t dev); |