Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ fs/block_dev.c | 16 ++++++++++++----
+ fs/partitions/check.c | 48 ++++++++++++++++++++++++++++++++++++++++--------
+ include/linux/genhd.h | 1 +
+ 3 files changed, 53 insertions(+), 12 deletions(-)
+
+--- a/fs/block_dev.c
++++ b/fs/block_dev.c
+@@ -1149,8 +1149,12 @@ static int __blkdev_get(struct block_dev
+ * The latter is necessary to prevent ghost
+ * partitions on a removed medium.
+ */
+- if (bdev->bd_invalidated && (!ret || ret == -ENOMEDIUM))
+- rescan_partitions(disk, bdev);
++ if (bdev->bd_invalidated) {
++ if (!ret)
++ rescan_partitions(disk, bdev);
++ else if (ret == -ENOMEDIUM)
++ invalidate_partitions(disk, bdev);
++ }
+ if (ret)
+ goto out_clear;
+ } else {
+@@ -1180,8 +1184,12 @@ static int __blkdev_get(struct block_dev
+ if (bdev->bd_disk->fops->open)
+ ret = bdev->bd_disk->fops->open(bdev, mode);
+ /* the same as first opener case, read comment there */
+- if (bdev->bd_invalidated && (!ret || ret == -ENOMEDIUM))
+- rescan_partitions(bdev->bd_disk, bdev);
++ if (bdev->bd_invalidated) {
++ if (!ret)
++ rescan_partitions(bdev->bd_disk, bdev);
++ else if (ret == -ENOMEDIUM)
++ invalidate_partitions(bdev->bd_disk, bdev);
++ }
+ if (ret)
+ goto out_unlock_bdev;
+ }
--- a/fs/partitions/check.c
+++ b/fs/partitions/check.c
-@@ -389,17 +389,11 @@ static bool disk_unlock_native_capacity(struct gendisk *disk)
+@@ -539,17 +539,11 @@ static bool disk_unlock_native_capacity(
}
}
if (bdev->bd_part_count)
return -EBUSY;
-@@ -412,6 +406,24 @@ rescan:
+@@ -562,6 +556,24 @@ rescan:
delete_partition(disk, part->partno);
disk_part_iter_exit(&piter);
if (disk->fops->revalidate_disk)
disk->fops->revalidate_disk(disk);
check_disk_size_change(disk, bdev);
-@@ -515,6 +527,26 @@ rescan:
+@@ -665,6 +677,26 @@ rescan:
return 0;
}
unsigned char *read_dev_sector(struct block_device *bdev, sector_t n, Sector *p)
{
struct address_space *mapping = bdev->bd_inode->i_mapping;
-diff --git a/fs/block_dev.c b/fs/block_dev.c
-index 0e575d1..5e9f198 100644
---- a/fs/block_dev.c
-+++ b/fs/block_dev.c
-@@ -1183,8 +1183,12 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part)
- * The latter is necessary to prevent ghost
- * partitions on a removed medium.
- */
-- if (bdev->bd_invalidated && (!ret || ret == -ENOMEDIUM))
-- rescan_partitions(disk, bdev);
-+ if (bdev->bd_invalidated) {
-+ if (!ret)
-+ rescan_partitions(disk, bdev);
-+ else if (ret == -ENOMEDIUM)
-+ invalidate_partitions(disk, bdev);
-+ }
- if (ret)
- goto out_clear;
- } else {
-@@ -1214,8 +1218,12 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part)
- if (bdev->bd_disk->fops->open)
- ret = bdev->bd_disk->fops->open(bdev, mode);
- /* the same as first opener case, read comment there */
-- if (bdev->bd_invalidated && (!ret || ret == -ENOMEDIUM))
-- rescan_partitions(bdev->bd_disk, bdev);
-+ if (bdev->bd_invalidated) {
-+ if (!ret)
-+ rescan_partitions(bdev->bd_disk, bdev);
-+ else if (ret == -ENOMEDIUM)
-+ invalidate_partitions(bdev->bd_disk, bdev);
-+ }
- if (ret)
- goto out_unlock_bdev;
- }
-diff --git a/include/linux/genhd.h b/include/linux/genhd.h
-index fe23ee7..e61d319 100644
--- a/include/linux/genhd.h
+++ b/include/linux/genhd.h
-@@ -596,6 +596,7 @@ extern char *disk_name (struct gendisk *hd, int partno, char *buf);
+@@ -594,6 +594,7 @@ extern char *disk_name (struct gendisk *
extern int disk_expand_part_tbl(struct gendisk *disk, int target);
extern int rescan_partitions(struct gendisk *disk, struct block_device *bdev);