block: remove (__)blkdev_reread_part as an exported API
authorChristoph Hellwig <hch@lst.de>
Thu, 14 Nov 2019 14:34:36 +0000 (15:34 +0100)
committerJens Axboe <axboe@kernel.dk>
Thu, 14 Nov 2019 14:43:59 +0000 (07:43 -0700)
In general drivers should never mess with partition tables directly.
Unfortunately s390 and loop do for somewhat historic reasons, but they
can use bdev_disk_changed directly instead when we export it as they
satisfy the sanity checks we have in __blkdev_reread_part.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Stefan Haberland <sth@linux.ibm.com> [dasd]
Reviewed-by: Jan Kara <jack@suse.cz>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/ioctl.c
drivers/block/loop.c
drivers/s390/block/dasd_genhd.c
fs/block_dev.c
include/linux/fs.h

index 5ccd9f016594fc3595b38e42f80505f171f3b7f8..7ac8a66c9787aad39b4e29823a758b7642493d23 100644 (file)
@@ -155,46 +155,21 @@ static int blkpg_ioctl(struct block_device *bdev, struct blkpg_ioctl_arg __user
        }
 }
 
-/*
- * This is an exported API for the block driver, and will not
- * acquire bd_mutex. This API should be used in case that
- * caller has held bd_mutex already.
- */
-int __blkdev_reread_part(struct block_device *bdev)
+static int blkdev_reread_part(struct block_device *bdev)
 {
+       int ret;
+
        if (!disk_part_scan_enabled(bdev->bd_disk) || bdev != bdev->bd_contains)
                return -EINVAL;
        if (!capable(CAP_SYS_ADMIN))
                return -EACCES;
 
-       lockdep_assert_held(&bdev->bd_mutex);
-
-       return bdev_disk_changed(bdev, false);
-}
-EXPORT_SYMBOL(__blkdev_reread_part);
-
-/*
- * This is an exported API for the block driver, and will
- * try to acquire bd_mutex. If bd_mutex has been held already
- * in current context, please call __blkdev_reread_part().
- *
- * Make sure the held locks in current context aren't required
- * in open()/close() handler and I/O path for avoiding ABBA deadlock:
- * - bd_mutex is held before calling block driver's open/close
- *   handler
- * - reading partition table may submit I/O to the block device
- */
-int blkdev_reread_part(struct block_device *bdev)
-{
-       int res;
-
        mutex_lock(&bdev->bd_mutex);
-       res = __blkdev_reread_part(bdev);
+       ret = bdev_disk_changed(bdev, false);
        mutex_unlock(&bdev->bd_mutex);
 
-       return res;
+       return ret;
 }
-EXPORT_SYMBOL(blkdev_reread_part);
 
 static int blk_ioctl_discard(struct block_device *bdev, fmode_t mode,
                unsigned long arg, unsigned long flags)
index ef6e251857c8c5e034bce8f6aea29cec0c61d2e1..739b372a51128be568740ff448ef3c2c1e10f454 100644 (file)
@@ -640,7 +640,9 @@ static void loop_reread_partitions(struct loop_device *lo,
 {
        int rc;
 
-       rc = blkdev_reread_part(bdev);
+       mutex_lock(&bdev->bd_mutex);
+       rc = bdev_disk_changed(bdev, false);
+       mutex_unlock(&bdev->bd_mutex);
        if (rc)
                pr_warn("%s: partition scan of loop%d (%s) failed (rc=%d)\n",
                        __func__, lo->lo_number, lo->lo_file_name, rc);
@@ -1164,10 +1166,11 @@ out_unlock:
                 * must be at least one and it can only become zero when the
                 * current holder is released.
                 */
-               if (release)
-                       err = __blkdev_reread_part(bdev);
-               else
-                       err = blkdev_reread_part(bdev);
+               if (!release)
+                       mutex_lock(&bdev->bd_mutex);
+               err = bdev_disk_changed(bdev, false);
+               if (!release)
+                       mutex_unlock(&bdev->bd_mutex);
                if (err)
                        pr_warn("%s: partition scan of loop%d failed (rc=%d)\n",
                                __func__, lo_number, err);
index 5542d9eadfe0e3b6ccd7f053e8ee0f3dc51a5b11..7d079154f849cdb121b80c33d49b70d075182d13 100644 (file)
@@ -116,7 +116,9 @@ int dasd_scan_partitions(struct dasd_block *block)
                return -ENODEV;
        }
 
-       rc = blkdev_reread_part(bdev);
+       mutex_lock(&bdev->bd_mutex);
+       rc = bdev_disk_changed(bdev, false);
+       mutex_unlock(&bdev->bd_mutex);
        if (rc)
                DBF_DEV_EVENT(DBF_ERR, block->base,
                                "scan partitions error, rc %d", rc);
index ae16466a67f7637ae4852fe218145f9b7ee7cf3e..9558a2f064b1e02bb23a2f88ff72c34ec621b0d5 100644 (file)
@@ -1513,6 +1513,8 @@ int bdev_disk_changed(struct block_device *bdev, bool invalidate)
        struct gendisk *disk = bdev->bd_disk;
        int ret;
 
+       lockdep_assert_held(&bdev->bd_mutex);
+
 rescan:
        ret = blk_drop_partitions(disk, bdev);
        if (ret)
@@ -1540,6 +1542,11 @@ rescan:
 
        return ret;
 }
+/*
+ * Only exported for for loop and dasd for historic reasons.  Don't use in new
+ * code!
+ */
+EXPORT_SYMBOL_GPL(bdev_disk_changed);
 
 /*
  * bd_mutex locking:
index d233dd661df72a60f32d06ea1446dbdaa6418d35..ae6c5c37f3ae2e9f0058bb962455b83dcd22f9e8 100644 (file)
@@ -2632,8 +2632,6 @@ extern void bd_finish_claiming(struct block_device *bdev,
 extern void bd_abort_claiming(struct block_device *bdev,
                              struct block_device *whole, void *holder);
 extern void blkdev_put(struct block_device *bdev, fmode_t mode);
-extern int __blkdev_reread_part(struct block_device *bdev);
-extern int blkdev_reread_part(struct block_device *bdev);
 
 #ifdef CONFIG_SYSFS
 extern int bd_link_disk_holder(struct block_device *bdev, struct gendisk *disk);