On 2019/10/21 17:38, Jan Kara wrote:
> Factor out code handling revalidation of bdev on disk change into a
> common helper.
>
> Signed-off-by: Jan Kara <[email protected]>
> ---
> fs/block_dev.c | 26 ++++++++++++++------------
> 1 file changed, 14 insertions(+), 12 deletions(-)
>
> diff --git a/fs/block_dev.c b/fs/block_dev.c
> index 9c073dbdc1b0..88c6d35ec71d 100644
> --- a/fs/block_dev.c
> +++ b/fs/block_dev.c
> @@ -1512,6 +1512,14 @@ EXPORT_SYMBOL(bd_set_size);
>
> static void __blkdev_put(struct block_device *bdev, fmode_t mode, int
> for_part);
>
> +static void bdev_disk_changed(struct block_device *bdev, bool invalidate)
> +{
> + if (invalidate)
> + invalidate_partitions(bdev->bd_disk, bdev);
> + else
> + rescan_partitions(bdev->bd_disk, bdev);
> +}
> +
> /*
> * bd_mutex locking:
> *
> @@ -1594,12 +1602,9 @@ 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) {
> - if (!ret)
> - rescan_partitions(disk, bdev);
> - else if (ret == -ENOMEDIUM)
> - invalidate_partitions(disk, bdev);
> - }
> + if (bdev->bd_invalidated &&
> + (!ret || ret == -ENOMEDIUM))
> + bdev_disk_changed(bdev, ret == -ENOMEDIUM);
This is a little confusing since from its name, bdev_disk_changed() seem
to imply that a new disk is present but this is called only if bdev is
invalidated... What about calling this simply bdev_revalidate_disk(),
since rescan_partitions() will call the disk revalidate method.
Also, it seems to me that this function could be used without the
complex "if ()" condition by slightly modifying it:
static void bdev_revalidate_disk(struct block_device *bdev,
bool invalidate)
{
if (bdev->bd_invalidated && invalidate)
invalidate_partitions(bdev->bd_disk, bdev);
else
rescan_partitions(bdev->bd_disk, bdev);
}
Otherwise, this all looks fine to me.
>
> if (ret)
> goto out_clear;
> @@ -1632,12 +1637,9 @@ 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) {
> - if (!ret)
> - rescan_partitions(bdev->bd_disk, bdev);
> - else if (ret == -ENOMEDIUM)
> - invalidate_partitions(bdev->bd_disk,
> bdev);
> - }
> + if (bdev->bd_invalidated &&
> + (!ret || ret == -ENOMEDIUM))
> + bdev_disk_changed(bdev, ret == -ENOMEDIUM);
> if (ret)
> goto out_unlock_bdev;
> }
>
--
Damien Le Moal
Western Digital Research