]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/md/dm-table.c
block: make blkdev_get/put() handle exclusive access
[mv-sheeva.git] / drivers / md / dm-table.c
index 2c876ffc63df30097c643750f6e2af2af2669c2b..9e88ca0c55e9f75dfed4d407964530cabf47924a 100644 (file)
@@ -325,20 +325,13 @@ static int open_dev(struct dm_dev_internal *d, dev_t dev,
 
        BUG_ON(d->dm_dev.bdev);
 
-       bdev = open_by_devnum(dev, d->dm_dev.mode);
+       bdev = open_by_devnum(dev, d->dm_dev.mode | FMODE_EXCL, _claim_ptr);
        if (IS_ERR(bdev))
                return PTR_ERR(bdev);
 
-       r = bd_claim(bdev, _claim_ptr);
-       if (r) {
-               blkdev_put(bdev, d->dm_dev.mode);
-               return r;
-       }
-
        r = bd_link_disk_holder(bdev, dm_disk(md));
        if (r) {
-               bd_release(bdev);
-               blkdev_put(bdev, d->dm_dev.mode);
+               blkdev_put(bdev, d->dm_dev.mode | FMODE_EXCL);
                return r;
        }
 
@@ -354,9 +347,7 @@ static void close_dev(struct dm_dev_internal *d, struct mapped_device *md)
        if (!d->dm_dev.bdev)
                return;
 
-       bd_unlink_disk_holder(d->dm_dev.bdev);
-       bd_release(d->dm_dev.bdev);
-       blkdev_put(d->dm_dev.bdev, d->dm_dev.mode);
+       blkdev_put(d->dm_dev.bdev, d->dm_dev.mode | FMODE_EXCL);
        d->dm_dev.bdev = NULL;
 }