|
@@ -458,9 +458,11 @@ static int dm_blk_getgeo(struct block_device *bdev, struct hd_geometry *geo)
|
|
|
return dm_get_geometry(md, geo);
|
|
|
}
|
|
|
|
|
|
-static int dm_grab_bdev_for_ioctl(struct mapped_device *md,
|
|
|
- struct block_device **bdev,
|
|
|
- fmode_t *mode)
|
|
|
+static char *_dm_claim_ptr = "I belong to device-mapper";
|
|
|
+
|
|
|
+static int dm_get_bdev_for_ioctl(struct mapped_device *md,
|
|
|
+ struct block_device **bdev,
|
|
|
+ fmode_t *mode)
|
|
|
{
|
|
|
struct dm_target *tgt;
|
|
|
struct dm_table *map;
|
|
@@ -490,6 +492,10 @@ retry:
|
|
|
goto out;
|
|
|
|
|
|
bdgrab(*bdev);
|
|
|
+ r = blkdev_get(*bdev, *mode, _dm_claim_ptr);
|
|
|
+ if (r < 0)
|
|
|
+ goto out;
|
|
|
+
|
|
|
dm_put_live_table(md, srcu_idx);
|
|
|
return r;
|
|
|
|
|
@@ -508,7 +514,7 @@ static int dm_blk_ioctl(struct block_device *bdev, fmode_t mode,
|
|
|
struct mapped_device *md = bdev->bd_disk->private_data;
|
|
|
int r;
|
|
|
|
|
|
- r = dm_grab_bdev_for_ioctl(md, &bdev, &mode);
|
|
|
+ r = dm_get_bdev_for_ioctl(md, &bdev, &mode);
|
|
|
if (r < 0)
|
|
|
return r;
|
|
|
|
|
@@ -528,7 +534,7 @@ static int dm_blk_ioctl(struct block_device *bdev, fmode_t mode,
|
|
|
|
|
|
r = __blkdev_driver_ioctl(bdev, mode, cmd, arg);
|
|
|
out:
|
|
|
- bdput(bdev);
|
|
|
+ blkdev_put(bdev, mode);
|
|
|
return r;
|
|
|
}
|
|
|
|
|
@@ -708,14 +714,13 @@ static void dm_put_live_table_fast(struct mapped_device *md) __releases(RCU)
|
|
|
static int open_table_device(struct table_device *td, dev_t dev,
|
|
|
struct mapped_device *md)
|
|
|
{
|
|
|
- static char *_claim_ptr = "I belong to device-mapper";
|
|
|
struct block_device *bdev;
|
|
|
|
|
|
int r;
|
|
|
|
|
|
BUG_ON(td->dm_dev.bdev);
|
|
|
|
|
|
- bdev = blkdev_get_by_dev(dev, td->dm_dev.mode | FMODE_EXCL, _claim_ptr);
|
|
|
+ bdev = blkdev_get_by_dev(dev, td->dm_dev.mode | FMODE_EXCL, _dm_claim_ptr);
|
|
|
if (IS_ERR(bdev))
|
|
|
return PTR_ERR(bdev);
|
|
|
|
|
@@ -3011,7 +3016,7 @@ static int dm_pr_reserve(struct block_device *bdev, u64 key, enum pr_type type,
|
|
|
fmode_t mode;
|
|
|
int r;
|
|
|
|
|
|
- r = dm_grab_bdev_for_ioctl(md, &bdev, &mode);
|
|
|
+ r = dm_get_bdev_for_ioctl(md, &bdev, &mode);
|
|
|
if (r < 0)
|
|
|
return r;
|
|
|
|
|
@@ -3021,7 +3026,7 @@ static int dm_pr_reserve(struct block_device *bdev, u64 key, enum pr_type type,
|
|
|
else
|
|
|
r = -EOPNOTSUPP;
|
|
|
|
|
|
- bdput(bdev);
|
|
|
+ blkdev_put(bdev, mode);
|
|
|
return r;
|
|
|
}
|
|
|
|
|
@@ -3032,7 +3037,7 @@ static int dm_pr_release(struct block_device *bdev, u64 key, enum pr_type type)
|
|
|
fmode_t mode;
|
|
|
int r;
|
|
|
|
|
|
- r = dm_grab_bdev_for_ioctl(md, &bdev, &mode);
|
|
|
+ r = dm_get_bdev_for_ioctl(md, &bdev, &mode);
|
|
|
if (r < 0)
|
|
|
return r;
|
|
|
|
|
@@ -3042,7 +3047,7 @@ static int dm_pr_release(struct block_device *bdev, u64 key, enum pr_type type)
|
|
|
else
|
|
|
r = -EOPNOTSUPP;
|
|
|
|
|
|
- bdput(bdev);
|
|
|
+ blkdev_put(bdev, mode);
|
|
|
return r;
|
|
|
}
|
|
|
|
|
@@ -3054,7 +3059,7 @@ static int dm_pr_preempt(struct block_device *bdev, u64 old_key, u64 new_key,
|
|
|
fmode_t mode;
|
|
|
int r;
|
|
|
|
|
|
- r = dm_grab_bdev_for_ioctl(md, &bdev, &mode);
|
|
|
+ r = dm_get_bdev_for_ioctl(md, &bdev, &mode);
|
|
|
if (r < 0)
|
|
|
return r;
|
|
|
|
|
@@ -3064,7 +3069,7 @@ static int dm_pr_preempt(struct block_device *bdev, u64 old_key, u64 new_key,
|
|
|
else
|
|
|
r = -EOPNOTSUPP;
|
|
|
|
|
|
- bdput(bdev);
|
|
|
+ blkdev_put(bdev, mode);
|
|
|
return r;
|
|
|
}
|
|
|
|
|
@@ -3075,7 +3080,7 @@ static int dm_pr_clear(struct block_device *bdev, u64 key)
|
|
|
fmode_t mode;
|
|
|
int r;
|
|
|
|
|
|
- r = dm_grab_bdev_for_ioctl(md, &bdev, &mode);
|
|
|
+ r = dm_get_bdev_for_ioctl(md, &bdev, &mode);
|
|
|
if (r < 0)
|
|
|
return r;
|
|
|
|
|
@@ -3085,7 +3090,7 @@ static int dm_pr_clear(struct block_device *bdev, u64 key)
|
|
|
else
|
|
|
r = -EOPNOTSUPP;
|
|
|
|
|
|
- bdput(bdev);
|
|
|
+ blkdev_put(bdev, mode);
|
|
|
return r;
|
|
|
}
|
|
|
|