summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Höppner <hoeppner@linux.ibm.com>2022-05-05 16:17:32 +0200
committerJens Axboe <axboe@kernel.dk>2022-05-05 20:08:27 -0600
commitb9c10f68e23c13f56685559a0d6fdaca9f838324 (patch)
treec98cf8ef865372a5f5eb6557421522441ec1e3dc
parentcd68c48ea15c85f1577a442dc4c285e112ff1b37 (diff)
downloadlwn-b9c10f68e23c13f56685559a0d6fdaca9f838324.tar.gz
lwn-b9c10f68e23c13f56685559a0d6fdaca9f838324.zip
s390/dasd: Fix read inconsistency for ESE DASD devices
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>
-rw-r--r--drivers/s390/block/dasd.c3
1 files changed, 1 insertions, 2 deletions
diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c
index d62a4c673962..ba6d78789660 100644
--- a/drivers/s390/block/dasd.c
+++ b/drivers/s390/block/dasd.c
@@ -2778,8 +2778,7 @@ static void __dasd_cleanup_cqr(struct dasd_ccw_req *cqr)
* 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);