lkml.org 
[lkml]   [2021]   [Nov]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 868/917] block: Hold invalidate_lock in BLKRESETZONE ioctl
    Date
    From: Shin'ichiro Kawasaki <shinichiro.kawasaki@wdc.com>

    commit 86399ea071099ec8ee0a83ac9ad67f7df96a50ad upstream.

    When BLKRESETZONE ioctl and data read race, the data read leaves stale
    page cache. The commit e5113505904e ("block: Discard page cache of zone
    reset target range") added page cache truncation to avoid stale page
    cache after the ioctl. However, the stale page cache still can be read
    during the reset zone operation for the ioctl. To avoid the stale page
    cache completely, hold invalidate_lock of the block device file mapping.

    Fixes: e5113505904e ("block: Discard page cache of zone reset target range")
    Signed-off-by: Shin'ichiro Kawasaki <shinichiro.kawasaki@wdc.com>
    Cc: stable@vger.kernel.org # v5.15
    Reviewed-by: Jan Kara <jack@suse.cz>
    Reviewed-by: Ming Lei <ming.lei@redhat.com>
    Link: https://lore.kernel.org/r/20211111085238.942492-1-shinichiro.kawasaki@wdc.com
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    block/blk-zoned.c | 15 +++++----------
    1 file changed, 5 insertions(+), 10 deletions(-)

    --- a/block/blk-zoned.c
    +++ b/block/blk-zoned.c
    @@ -429,9 +429,10 @@ int blkdev_zone_mgmt_ioctl(struct block_
    op = REQ_OP_ZONE_RESET;

    /* Invalidate the page cache, including dirty pages. */
    + filemap_invalidate_lock(bdev->bd_inode->i_mapping);
    ret = blkdev_truncate_zone_range(bdev, mode, &zrange);
    if (ret)
    - return ret;
    + goto fail;
    break;
    case BLKOPENZONE:
    op = REQ_OP_ZONE_OPEN;
    @@ -449,15 +450,9 @@ int blkdev_zone_mgmt_ioctl(struct block_
    ret = blkdev_zone_mgmt(bdev, op, zrange.sector, zrange.nr_sectors,
    GFP_KERNEL);

    - /*
    - * Invalidate the page cache again for zone reset: writes can only be
    - * direct for zoned devices so concurrent writes would not add any page
    - * to the page cache after/during reset. The page cache may be filled
    - * again due to concurrent reads though and dropping the pages for
    - * these is fine.
    - */
    - if (!ret && cmd == BLKRESETZONE)
    - ret = blkdev_truncate_zone_range(bdev, mode, &zrange);
    +fail:
    + if (cmd == BLKRESETZONE)
    + filemap_invalidate_unlock(bdev->bd_inode->i_mapping);

    return ret;
    }

    \
     
     \ /
      Last update: 2021-11-16 01:43    [W:2.509 / U:1.468 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site