lkml.org 
[lkml]   [2022]   [May]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 031/135] s390/dasd: Fix read inconsistency for ESE DASD devices
    Date
    From: Jan Höppner <hoeppner@linux.ibm.com>

    commit b9c10f68e23c13f56685559a0d6fdaca9f838324 upstream.

    Read requests that return with NRF error are partially completed in
    dasd_eckd_ese_read(). The function keeps track of the amount of
    processed bytes and the driver will eventually return this information
    back to the block layer for further processing via __dasd_cleanup_cqr()
    when the request is in the final stage of processing (from the driver's
    perspective).

    For this, blk_update_request() is used which requires the number of
    bytes to complete the request. As per documentation the nr_bytes
    parameter is described as follows:
    "number of bytes to complete for @req".

    This was mistakenly interpreted as "number of bytes _left_ for @req"
    leading to new requests with incorrect data length. The consequence are
    inconsistent and completely wrong read requests as data from random
    memory areas are read back.

    Fix this by correctly specifying the amount of bytes that should be used
    to complete the request.

    Fixes: 5e6bdd37c552 ("s390/dasd: fix data corruption for thin provisioned devices")
    Cc: stable@vger.kernel.org # 5.3+
    Signed-off-by: Jan Höppner <hoeppner@linux.ibm.com>
    Reviewed-by: Stefan Haberland <sth@linux.ibm.com>
    Link: https://lore.kernel.org/r/20220505141733.1989450-5-sth@linux.ibm.com
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/s390/block/dasd.c | 3 +--
    1 file changed, 1 insertion(+), 2 deletions(-)

    --- a/drivers/s390/block/dasd.c
    +++ b/drivers/s390/block/dasd.c
    @@ -2775,8 +2775,7 @@ static void __dasd_cleanup_cqr(struct da
    * complete a request partially.
    */
    if (proc_bytes) {
    - blk_update_request(req, BLK_STS_OK,
    - blk_rq_bytes(req) - proc_bytes);
    + blk_update_request(req, BLK_STS_OK, proc_bytes);
    blk_mq_requeue_request(req, true);
    } else if (likely(!blk_should_fake_timeout(req->q))) {
    blk_mq_complete_request(req);

    \
     
     \ /
      Last update: 2022-05-10 16:04    [W:7.611 / U:0.124 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site