block: pass a gendisk to bdev_disk_changed
authorChristoph Hellwig <hch@lst.de>
Thu, 24 Jun 2021 12:32:40 +0000 (14:32 +0200)
committerJens Axboe <axboe@kernel.dk>
Thu, 24 Jun 2021 18:01:06 +0000 (12:01 -0600)
bdev_disk_changed can only operate on whole devices.  Make that clear
by passing a gendisk instead of the struct block_device.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20210624123240.441814-3-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/partitions/core.c
drivers/block/loop.c
drivers/s390/block/dasd_genhd.c
fs/block_dev.c
include/linux/genhd.h

index b79785f..347c56a 100644 (file)
@@ -120,8 +120,7 @@ static void free_partitions(struct parsed_partitions *state)
        kfree(state);
 }
 
-static struct parsed_partitions *check_partition(struct gendisk *hd,
-               struct block_device *bdev)
+static struct parsed_partitions *check_partition(struct gendisk *hd)
 {
        struct parsed_partitions *state;
        int i, res, err;
@@ -136,7 +135,7 @@ static struct parsed_partitions *check_partition(struct gendisk *hd,
        }
        state->pp_buf[0] = '\0';
 
-       state->bdev = bdev;
+       state->bdev = hd->part0;
        disk_name(hd, 0, state->name);
        snprintf(state->pp_buf, PAGE_SIZE, " %s:", state->name);
        if (isdigit(state->name[strlen(state->name)-1]))
@@ -546,7 +545,7 @@ void blk_drop_partitions(struct gendisk *disk)
        }
 }
 
-static bool blk_add_partition(struct gendisk *disk, struct block_device *bdev,
+static bool blk_add_partition(struct gendisk *disk,
                struct parsed_partitions *state, int p)
 {
        sector_t size = state->parts[p].size;
@@ -596,7 +595,7 @@ static bool blk_add_partition(struct gendisk *disk, struct block_device *bdev,
        return true;
 }
 
-static int blk_add_partitions(struct gendisk *disk, struct block_device *bdev)
+static int blk_add_partitions(struct gendisk *disk)
 {
        struct parsed_partitions *state;
        int ret = -EAGAIN, p;
@@ -604,7 +603,7 @@ static int blk_add_partitions(struct gendisk *disk, struct block_device *bdev)
        if (!disk_part_scan_enabled(disk))
                return 0;
 
-       state = check_partition(disk, bdev);
+       state = check_partition(disk);
        if (!state)
                return 0;
        if (IS_ERR(state)) {
@@ -648,7 +647,7 @@ static int blk_add_partitions(struct gendisk *disk, struct block_device *bdev)
        kobject_uevent(&disk_to_dev(disk)->kobj, KOBJ_CHANGE);
 
        for (p = 1; p < state->limit; p++)
-               if (!blk_add_partition(disk, bdev, state, p))
+               if (!blk_add_partition(disk, state, p))
                        goto out_free_state;
 
        ret = 0;
@@ -657,9 +656,8 @@ out_free_state:
        return ret;
 }
 
-int bdev_disk_changed(struct block_device *bdev, bool invalidate)
+int bdev_disk_changed(struct gendisk *disk, bool invalidate)
 {
-       struct gendisk *disk = bdev->bd_disk;
        int ret = 0;
 
        lockdep_assert_held(&disk->open_mutex);
@@ -670,8 +668,8 @@ int bdev_disk_changed(struct block_device *bdev, bool invalidate)
 rescan:
        if (disk->open_partitions)
                return -EBUSY;
-       sync_blockdev(bdev);
-       invalidate_bdev(bdev);
+       sync_blockdev(disk->part0);
+       invalidate_bdev(disk->part0);
        blk_drop_partitions(disk);
 
        clear_bit(GD_NEED_PART_SCAN, &disk->state);
@@ -691,7 +689,7 @@ rescan:
        }
 
        if (get_capacity(disk)) {
-               ret = blk_add_partitions(disk, bdev);
+               ret = blk_add_partitions(disk);
                if (ret == -EAGAIN)
                        goto rescan;
        } else if (invalidate) {
index e90f7d3..4fb1f95 100644 (file)
@@ -647,14 +647,13 @@ static inline void loop_update_dio(struct loop_device *lo)
                                lo->use_dio);
 }
 
-static void loop_reread_partitions(struct loop_device *lo,
-                                  struct block_device *bdev)
+static void loop_reread_partitions(struct loop_device *lo)
 {
        int rc;
 
-       mutex_lock(&bdev->bd_disk->open_mutex);
-       rc = bdev_disk_changed(bdev, false);
-       mutex_unlock(&bdev->bd_disk->open_mutex);
+       mutex_lock(&lo->lo_disk->open_mutex);
+       rc = bdev_disk_changed(lo->lo_disk, false);
+       mutex_unlock(&lo->lo_disk->open_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);
@@ -752,7 +751,7 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
         */
        fput(old_file);
        if (partscan)
-               loop_reread_partitions(lo, bdev);
+               loop_reread_partitions(lo);
        return 0;
 
 out_err:
@@ -1174,7 +1173,7 @@ static int loop_configure(struct loop_device *lo, fmode_t mode,
        bdgrab(bdev);
        mutex_unlock(&lo->lo_mutex);
        if (partscan)
-               loop_reread_partitions(lo, bdev);
+               loop_reread_partitions(lo);
        if (!(mode & FMODE_EXCL))
                bd_abort_claiming(bdev, loop_configure);
        return 0;
@@ -1268,10 +1267,10 @@ out_unlock:
                 * current holder is released.
                 */
                if (!release)
-                       mutex_lock(&bdev->bd_disk->open_mutex);
-               err = bdev_disk_changed(bdev, false);
+                       mutex_lock(&lo->lo_disk->open_mutex);
+               err = bdev_disk_changed(lo->lo_disk, false);
                if (!release)
-                       mutex_unlock(&bdev->bd_disk->open_mutex);
+                       mutex_unlock(&lo->lo_disk->open_mutex);
                if (err)
                        pr_warn("%s: partition scan of loop%d failed (rc=%d)\n",
                                __func__, lo_number, err);
@@ -1416,7 +1415,7 @@ out_unfreeze:
 out_unlock:
        mutex_unlock(&lo->lo_mutex);
        if (partscan)
-               loop_reread_partitions(lo, bdev);
+               loop_reread_partitions(lo);
 
        return err;
 }
index bf2082d..493e846 100644 (file)
@@ -110,7 +110,7 @@ int dasd_scan_partitions(struct dasd_block *block)
        }
 
        mutex_lock(&block->gdp->open_mutex);
-       rc = bdev_disk_changed(bdev, false);
+       rc = bdev_disk_changed(block->gdp, false);
        mutex_unlock(&block->gdp->open_mutex);
        if (rc)
                DBF_DEV_EVENT(DBF_ERR, block->base,
@@ -146,7 +146,7 @@ void dasd_destroy_partitions(struct dasd_block *block)
        block->bdev = NULL;
 
        mutex_lock(&bdev->bd_disk->open_mutex);
-       bdev_disk_changed(bdev, true);
+       bdev_disk_changed(bdev->bd_disk, true);
        mutex_unlock(&bdev->bd_disk->open_mutex);
 
        /* Matching blkdev_put to the blkdev_get in dasd_scan_partitions. */
index 5b3a73e..34253d1 100644 (file)
@@ -1253,7 +1253,7 @@ static int blkdev_get_whole(struct block_device *bdev, fmode_t mode)
                        /* avoid ghost partitions on a removed medium */
                        if (ret == -ENOMEDIUM &&
                             test_bit(GD_NEED_PART_SCAN, &disk->state))
-                               bdev_disk_changed(bdev, true);
+                               bdev_disk_changed(disk, true);
                        return ret;
                }
        }
@@ -1264,7 +1264,7 @@ static int blkdev_get_whole(struct block_device *bdev, fmode_t mode)
                        bdev->bd_bdi = bdi_get(disk->queue->backing_dev_info);
        }
        if (test_bit(GD_NEED_PART_SCAN, &disk->state))
-               bdev_disk_changed(bdev, false);
+               bdev_disk_changed(disk, false);
        bdev->bd_openers++;
        return 0;;
 }
index f5f0c9b..13b3417 100644 (file)
@@ -256,7 +256,7 @@ static inline sector_t get_capacity(struct gendisk *disk)
        return bdev_nr_sectors(disk->part0);
 }
 
-int bdev_disk_changed(struct block_device *bdev, bool invalidate);
+int bdev_disk_changed(struct gendisk *disk, bool invalidate);
 void blk_drop_partitions(struct gendisk *disk);
 
 extern struct gendisk *__alloc_disk_node(int minors, int node_id);