aboutsummaryrefslogtreecommitdiffstats
path: root/fs/block_dev.c
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2019-11-14 15:34:35 +0100
committerJens Axboe <axboe@kernel.dk>2019-11-14 07:43:53 -0700
commit142fe8f4bb169e8632024d51c64653a8bf140561 (patch)
tree8869801776302654d3442fd763bcde51afc74a32 /fs/block_dev.c
parentblock: move rescan_partitions to fs/block_dev.c (diff)
downloadlinux-dev-142fe8f4bb169e8632024d51c64653a8bf140561.tar.xz
linux-dev-142fe8f4bb169e8632024d51c64653a8bf140561.zip
block: fix bdev_disk_changed for non-partitioned devices
We still have to set the capacity to 0 if invalidating or call revalidate_disk if not even if the disk has no partitions. Fix that by merging rescan_partitions into bdev_disk_changed and just stubbing out blk_add_partitions and blk_drop_partitions for non-partitioned devices. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Jan Kara <jack@suse.cz> Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'fs/block_dev.c')
-rw-r--r--fs/block_dev.c25
1 files changed, 7 insertions, 18 deletions
diff --git a/fs/block_dev.c b/fs/block_dev.c
index ec10dacd18d0..ae16466a67f7 100644
--- a/fs/block_dev.c
+++ b/fs/block_dev.c
@@ -1508,9 +1508,9 @@ EXPORT_SYMBOL(bd_set_size);
static void __blkdev_put(struct block_device *bdev, fmode_t mode, int for_part);
-static int rescan_partitions(struct gendisk *disk, struct block_device *bdev,
- bool invalidate)
+int bdev_disk_changed(struct block_device *bdev, bool invalidate)
{
+ struct gendisk *disk = bdev->bd_disk;
int ret;
rescan:
@@ -1526,32 +1526,21 @@ rescan:
check_disk_size_change(disk, bdev, !invalidate);
bdev->bd_invalidated = 0;
- if (!get_capacity(disk)) {
+ if (get_capacity(disk)) {
+ ret = blk_add_partitions(disk, bdev);
+ if (ret == -EAGAIN)
+ goto rescan;
+ } else {
/*
* Tell userspace that the media / partition table may have
* changed.
*/
kobject_uevent(&disk_to_dev(disk)->kobj, KOBJ_CHANGE);
- return 0;
}
- ret = blk_add_partitions(disk, bdev);
- if (ret == -EAGAIN)
- goto rescan;
return ret;
}
-
-static void bdev_disk_changed(struct block_device *bdev, bool invalidate)
-{
- if (disk_part_scan_enabled(bdev->bd_disk)) {
- rescan_partitions(bdev->bd_disk, bdev, invalidate);
- } else {
- check_disk_size_change(bdev->bd_disk, bdev, !invalidate);
- bdev->bd_invalidated = 0;
- }
-}
-
/*
* bd_mutex locking:
*