| From a68753aa46dad44915db20f715d9bfbc5815fb8d Mon Sep 17 00:00:00 2001 |
| From: Greg Kroah-Hartman <gregkh@suse.de> |
| Date: Tue, 2 Aug 2011 14:45:26 -0700 |
| Subject: Revert "block: rescan partitions on invalidated devices on -ENOMEDIA |
| too" |
| |
| This reverts commit 5b2745db12a3f97a9ec9efd4ffa077da707d3e4c (commit |
| 02e352287a40bd456eb78df705bf888bc3161d3f upstream) |
| |
| This should have only been commited on .38 and newer, not older kernels |
| like this one, sorry. |
| |
| Cc: Tejun Heo <tj@kernel.org> |
| Cc: David Zeuthen <zeuthen@gmail.com> |
| Cc: Martin Pitt <martin.pitt@ubuntu.com> |
| Cc: Kay Sievers <kay.sievers@vrfy.org> |
| Cc: Alan Cox <alan@lxorguk.ukuu.org.uk> |
| Cc: Jens Axboe <jaxboe@fusionio.com> |
| Cc: Andi Kleen <ak@linux.intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| --- |
| fs/block_dev.c | 27 +++++++++------------------ |
| 1 file changed, 9 insertions(+), 18 deletions(-) |
| |
| --- a/fs/block_dev.c |
| +++ b/fs/block_dev.c |
| @@ -1203,7 +1203,6 @@ static int __blkdev_get(struct block_dev |
| if (!bdev->bd_part) |
| goto out_clear; |
| |
| - ret = 0; |
| if (disk->fops->open) { |
| ret = disk->fops->open(bdev, mode); |
| if (ret == -ERESTARTSYS) { |
| @@ -1219,18 +1218,9 @@ static int __blkdev_get(struct block_dev |
| mutex_unlock(&bdev->bd_mutex); |
| goto restart; |
| } |
| + if (ret) |
| + goto out_clear; |
| } |
| - /* |
| - * If the device is invalidated, rescan partition |
| - * if open succeeded or failed with -ENOMEDIUM. |
| - * The latter is necessary to prevent ghost |
| - * partitions on a removed medium. |
| - */ |
| - if (bdev->bd_invalidated && (!ret || ret == -ENOMEDIUM)) |
| - rescan_partitions(disk, bdev); |
| - if (ret) |
| - goto out_clear; |
| - |
| if (!bdev->bd_openers) { |
| bd_set_size(bdev,(loff_t)get_capacity(disk)<<9); |
| bdi = blk_get_backing_dev_info(bdev); |
| @@ -1238,6 +1228,8 @@ static int __blkdev_get(struct block_dev |
| bdi = &default_backing_dev_info; |
| bdev->bd_inode->i_data.backing_dev_info = bdi; |
| } |
| + if (bdev->bd_invalidated) |
| + rescan_partitions(disk, bdev); |
| } else { |
| struct block_device *whole; |
| whole = bdget_disk(disk, 0); |
| @@ -1264,14 +1256,13 @@ static int __blkdev_get(struct block_dev |
| put_disk(disk); |
| disk = NULL; |
| if (bdev->bd_contains == bdev) { |
| - ret = 0; |
| - if (bdev->bd_disk->fops->open) |
| + 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)) |
| + if (ret) |
| + goto out_unlock_bdev; |
| + } |
| + if (bdev->bd_invalidated) |
| rescan_partitions(bdev->bd_disk, bdev); |
| - if (ret) |
| - goto out_unlock_bdev; |
| } |
| } |
| bdev->bd_openers++; |