]> www.infradead.org Git - users/hch/block.git/commitdiff
block: merge disk_scan_partitions and blkdev_reread_part part-scan
authorChristoph Hellwig <hch@lst.de>
Wed, 3 Mar 2021 16:51:29 +0000 (17:51 +0100)
committerChristoph Hellwig <hch@lst.de>
Mon, 29 Mar 2021 06:03:23 +0000 (08:03 +0200)
Reuse disk_scan_partitions in the ioctl path instead of duplicating
the functionality.

Signed-off-by: Christoph Hellwig <hch@lst.de>
block/genhd.c
block/ioctl.c
include/linux/genhd.h

index 8c8f543572e64edc09147b4c6f833bc96dfdca9c..39acb56bad5fedd7a5734b35068ffdb38eb140b3 100644 (file)
@@ -482,17 +482,25 @@ void disk_uevent(struct gendisk *disk, enum kobject_action action)
 }
 EXPORT_SYMBOL_GPL(disk_uevent);
 
-static void disk_scan_partitions(struct gendisk *disk)
+/*
+ * Partitions are scanned on open when the GD_NEED_PART_SCAN flag is set, so
+ * force a scan by setting the flag and (re-)opening the device.
+ */
+int disk_scan_partitions(struct gendisk *disk)
 {
        struct block_device *bdev;
 
-       if (!get_capacity(disk) || !disk_part_scan_enabled(disk))
-               return;
+       if (!disk_part_scan_enabled(disk))
+               return -EINVAL;
+       if (!get_capacity(disk))
+               return 0;
 
        set_bit(GD_NEED_PART_SCAN, &disk->state);
        bdev = blkdev_get_by_dev(disk_devt(disk), FMODE_READ, NULL);
-       if (!IS_ERR(bdev))
-               blkdev_put(bdev, FMODE_READ);
+       if (IS_ERR(bdev))
+               return PTR_ERR(bdev);
+       blkdev_put(bdev, FMODE_READ);
+       return 0;
 }
 
 static void register_disk(struct device *parent, struct gendisk *disk,
index ff241e663c018feae6f102065dbcce475eb3ae29..b5e87bd8ac47390bd1a80360a10c85ea91e7d7e1 100644 (file)
@@ -81,29 +81,6 @@ static int compat_blkpg_ioctl(struct block_device *bdev,
 }
 #endif
 
-static int blkdev_reread_part(struct block_device *bdev, fmode_t mode)
-{
-       struct block_device *tmp;
-
-       if (!disk_part_scan_enabled(bdev->bd_disk) || bdev_is_partition(bdev))
-               return -EINVAL;
-       if (!capable(CAP_SYS_ADMIN))
-               return -EACCES;
-
-       /*
-        * Reopen the device to revalidate the driver state and force a
-        * partition rescan.
-        */
-       mode &= ~FMODE_EXCL;
-       set_bit(GD_NEED_PART_SCAN, &bdev->bd_disk->state);
-
-       tmp = blkdev_get_by_dev(bdev->bd_dev, mode, NULL);
-       if (IS_ERR(tmp))
-               return PTR_ERR(tmp);
-       blkdev_put(tmp, mode);
-       return 0;
-}
-
 static int blk_ioctl_discard(struct block_device *bdev, fmode_t mode,
                unsigned long arg, unsigned long flags)
 {
@@ -505,7 +482,11 @@ static int blkdev_common_ioctl(struct block_device *bdev, fmode_t mode,
                bdev->bd_bdi->ra_pages = (arg * 512) / PAGE_SIZE;
                return 0;
        case BLKRRPART:
-               return blkdev_reread_part(bdev, mode);
+               if (!capable(CAP_SYS_ADMIN))
+                       return -EACCES;
+               if (bdev_is_partition(bdev))
+                       return -EINVAL;
+               return disk_scan_partitions(bdev->bd_disk);
        case BLKTRACESTART:
        case BLKTRACESTOP:
        case BLKTRACETEARDOWN:
index f364619092cca0dfeddfebc4bbdde97b37c34674..f30c8e83311e5241f35ce611be7df4285242c1b9 100644 (file)
@@ -271,6 +271,7 @@ static inline sector_t get_capacity(struct gendisk *disk)
        return bdev_nr_sectors(disk->part0);
 }
 
+int disk_scan_partitions(struct gendisk *disk);
 int bdev_disk_changed(struct block_device *bdev, bool invalidate);
 int blk_add_partitions(struct gendisk *disk, struct block_device *bdev);
 int blk_drop_partitions(struct block_device *bdev);