lkml.org 
[lkml]   [2021]   [Mar]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 476/663] block: reopen the device in blkdev_reread_part
    Date
    From: Christoph Hellwig <hch@lst.de>

    [ Upstream commit 4601b4b130de2329fe06df80ed5d77265f2058e5 ]

    Historically the BLKRRPART ioctls called into the now defunct ->revalidate
    method, which caused the sd driver to check if any media is present.
    When the ->revalidate method was removed this revalidation was lost,
    leading to lots of I/O errors when using the eject command. Fix this by
    reopening the device to rescan the partitions, and thus calling the
    revalidation logic in the sd driver.

    Fixes: 471bd0af544b ("sd: use bdev_check_media_change")
    Reported--by: Tom Seewald <tseewald@gmail.com>
    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Tested-by: Tom Seewald <tseewald@gmail.com>
    Reviewed-by: Ming Lei <ming.lei@redhat.com>
    Reviewed-by: Minwoo Im <minwoo.im.dev@gmail.com>
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    block/ioctl.c | 21 ++++++++++++++-------
    1 file changed, 14 insertions(+), 7 deletions(-)

    diff --git a/block/ioctl.c b/block/ioctl.c
    index 3fbc382eb926d..3be4d0e2a96c3 100644
    --- a/block/ioctl.c
    +++ b/block/ioctl.c
    @@ -90,20 +90,27 @@ static int compat_blkpg_ioctl(struct block_device *bdev,
    }
    #endif

    -static int blkdev_reread_part(struct block_device *bdev)
    +static int blkdev_reread_part(struct block_device *bdev, fmode_t mode)
    {
    - int ret;
    + struct block_device *tmp;

    if (!disk_part_scan_enabled(bdev->bd_disk) || bdev_is_partition(bdev))
    return -EINVAL;
    if (!capable(CAP_SYS_ADMIN))
    return -EACCES;

    - mutex_lock(&bdev->bd_mutex);
    - ret = bdev_disk_changed(bdev, false);
    - mutex_unlock(&bdev->bd_mutex);
    + /*
    + * Reopen the device to revalidate the driver state and force a
    + * partition rescan.
    + */
    + mode &= ~FMODE_EXCL;
    + set_bit(GD_NEED_PART_SCAN, &bdev->bd_disk->state);

    - return ret;
    + tmp = blkdev_get_by_dev(bdev->bd_dev, mode, NULL);
    + if (IS_ERR(tmp))
    + return PTR_ERR(tmp);
    + blkdev_put(tmp, mode);
    + return 0;
    }

    static int blk_ioctl_discard(struct block_device *bdev, fmode_t mode,
    @@ -549,7 +556,7 @@ static int blkdev_common_ioctl(struct block_device *bdev, fmode_t mode,
    bdev->bd_bdi->ra_pages = (arg * 512) / PAGE_SIZE;
    return 0;
    case BLKRRPART:
    - return blkdev_reread_part(bdev);
    + return blkdev_reread_part(bdev, mode);
    case BLKTRACESTART:
    case BLKTRACESTOP:
    case BLKTRACETEARDOWN:
    --
    2.27.0


    \
     
     \ /
      Last update: 2021-03-02 01:40    [W:4.031 / U:0.200 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site