History

block: use bd_prepare_to_claim directly in the loop driver

The arcane magic in bd_start_claiming is only needed to be able to claim a block_device that hasn't been fully set up. Switch the loop driver that claims from the ioctl path with a fully set up struct block_device to just use the much simpler bd_prepare_to_claim directly.

Christoph Hellwig committed 6 years ago

Commit ecbe6bc1 parent 58e46ed3 files · +10 −9Browse files

Unified · Split

3 files
  1. drivers/block/loop.c +3 −4
  2. fs/block_dev.c +5 −4
  3. include/linux/blkdev.h +2 −1
drivers/block/loop.c+3−4
@@ -1090,11 +1090,10 @@ static int loop_configure(struct loop_device *lo, fmode_t mode, · 1089 unmodified lines
1090 * here to avoid changing device under exclusive owner.1090 * here to avoid changing device under exclusive owner.
1091 */1091 */
1092 if (!(mode & FMODE_EXCL)) {1092 if (!(mode & FMODE_EXCL)) {
1093 claimed_bdev = bd_start_claiming(bdev, loop_configure);1093 claimed_bdev = bdev->bd_contains;
1094 if (IS_ERR(claimed_bdev)) {1094 error = bd_prepare_to_claim(bdev, claimed_bdev, loop_configure);
1095 error = PTR_ERR(claimed_bdev);1095 if (error)
1096 goto out_putf;1096 goto out_putf;
1097 }
1098 }1097 }
1099 1098
1100 error = mutex_lock_killable(&loop_ctl_mutex);1099 error = mutex_lock_killable(&loop_ctl_mutex);
fs/block_dev.c+5−4
@@ -1027,8 +1027,8 @@ static bool bd_may_claim(struct block_device *bdev, struct block_device *whole, · 1026 unmodified lines
1027 * RETURNS:1027 * RETURNS:
1028 * 0 if @bdev can be claimed, -EBUSY otherwise.1028 * 0 if @bdev can be claimed, -EBUSY otherwise.
1029 */1029 */
1030static int bd_prepare_to_claim(struct block_device *bdev,1030int bd_prepare_to_claim(struct block_device *bdev, struct block_device *whole,
1031 struct block_device *whole, void *holder)1031 void *holder)
1032{1032{
1033retry:1033retry:
1034 spin_lock(&bdev_lock);1034 spin_lock(&bdev_lock);
@@ -1055,6 +1055,7 @@ retry: · 20 unmodified lines
1055 spin_unlock(&bdev_lock);1055 spin_unlock(&bdev_lock);
1056 return 0;1056 return 0;
1057}1057}
1058EXPORT_SYMBOL_GPL(bd_prepare_to_claim); /* only for the loop driver */
1058 1059
1059static struct gendisk *bdev_get_gendisk(struct block_device *bdev, int *partno)1060static struct gendisk *bdev_get_gendisk(struct block_device *bdev, int *partno)
1060{1061{
@@ -1100,7 +1101,8 @@ static struct gendisk *bdev_get_gendisk(struct block_device *bdev, int *partno) · 39 unmodified lines
1100 * Pointer to the block device containing @bdev on success, ERR_PTR()1101 * Pointer to the block device containing @bdev on success, ERR_PTR()
1101 * value on failure.1102 * value on failure.
1102 */1103 */
1103struct block_device *bd_start_claiming(struct block_device *bdev, void *holder)1104static struct block_device *bd_start_claiming(struct block_device *bdev,
1105 void *holder)
1104{1106{
1105 struct gendisk *disk;1107 struct gendisk *disk;
1106 struct block_device *whole;1108 struct block_device *whole;
@@ -1141,7 +1143,6 @@ struct block_device *bd_start_claiming(struct block_device *bdev, void *holder) · 34 unmodified lines
1141 1143
1142 return whole;1144 return whole;
1143}1145}
1144EXPORT_SYMBOL(bd_start_claiming);
1145 1146
1146static void bd_clear_claiming(struct block_device *whole, void *holder)1147static void bd_clear_claiming(struct block_device *whole, void *holder)
1147{1148{
include/linux/blkdev.h+2−1
@@ -1919,7 +1919,8 @@ int blkdev_get(struct block_device *bdev, fmode_t mode, void *holder); · 1918 unmodified lines
1919struct block_device *blkdev_get_by_path(const char *path, fmode_t mode,1919struct block_device *blkdev_get_by_path(const char *path, fmode_t mode,
1920 void *holder);1920 void *holder);
1921struct block_device *blkdev_get_by_dev(dev_t dev, fmode_t mode, void *holder);1921struct block_device *blkdev_get_by_dev(dev_t dev, fmode_t mode, void *holder);
1922struct block_device *bd_start_claiming(struct block_device *bdev, void *holder);1922int bd_prepare_to_claim(struct block_device *bdev, struct block_device *whole,
1923 void *holder);
1923void bd_abort_claiming(struct block_device *bdev, struct block_device *whole,1924void bd_abort_claiming(struct block_device *bdev, struct block_device *whole,
1924 void *holder);1925 void *holder);
1925void blkdev_put(struct block_device *bdev, fmode_t mode);1926void blkdev_put(struct block_device *bdev, fmode_t mode);