diff options
Diffstat (limited to 'fs/block_dev.c')
-rw-r--r-- | fs/block_dev.c | 50 |
1 files changed, 12 insertions, 38 deletions
diff --git a/fs/block_dev.c b/fs/block_dev.c index 84fe0162ff13..34644ce4b502 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -1417,8 +1417,8 @@ static void flush_disk(struct block_device *bdev, bool kill_dirty) * and adjusts it if it differs. When shrinking the bdev size, its all caches * are freed. */ -static void check_disk_size_change(struct gendisk *disk, - struct block_device *bdev, bool verbose) +void check_disk_size_change(struct gendisk *disk, struct block_device *bdev, + bool verbose) { loff_t disk_size, bdev_size; @@ -1434,7 +1434,6 @@ static void check_disk_size_change(struct gendisk *disk, if (bdev_size > disk_size) flush_disk(bdev, false); } - bdev->bd_invalidated = 0; } /** @@ -1464,6 +1463,7 @@ int revalidate_disk(struct gendisk *disk) mutex_lock(&bdev->bd_mutex); check_disk_size_change(disk, bdev, ret == 0); + bdev->bd_invalidated = 0; mutex_unlock(&bdev->bd_mutex); bdput(bdev); } @@ -1509,44 +1509,18 @@ EXPORT_SYMBOL(bd_set_size); static void __blkdev_put(struct block_device *bdev, fmode_t mode, int for_part); -int bdev_disk_changed(struct block_device *bdev, bool invalidate) +static void 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) - return ret; - - if (invalidate) - set_capacity(disk, 0); - else if (disk->fops->revalidate_disk) - disk->fops->revalidate_disk(disk); - - check_disk_size_change(disk, bdev, !invalidate); - - if (get_capacity(disk)) { - ret = blk_add_partitions(disk, bdev); - if (ret == -EAGAIN) - goto rescan; - } else if (invalidate) { - /* - * Tell userspace that the media / partition table may have - * changed. - */ - kobject_uevent(&disk_to_dev(disk)->kobj, KOBJ_CHANGE); + if (disk_part_scan_enabled(bdev->bd_disk)) { + if (invalidate) + invalidate_partitions(bdev->bd_disk, bdev); + else + rescan_partitions(bdev->bd_disk, bdev); + } else { + check_disk_size_change(bdev->bd_disk, bdev, !invalidate); + bdev->bd_invalidated = 0; } - - 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: |