aboutsummaryrefslogtreecommitdiffstats
path: root/fs/block_dev.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/block_dev.c')
-rw-r--r--fs/block_dev.c50
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: