diff options
author | Evan Green <evgreen@chromium.org> | 2020-04-03 17:43:03 +0300 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2020-04-03 22:44:20 +0300 |
commit | 8cd55087dc45b2e1a73ed2a197cbf405f32deb08 (patch) | |
tree | 3863fdfa99d97f621a6b3e39576e808e06783a04 /drivers/block/loop.c | |
parent | 4308a434e5e08c78676aa66bc626ef78cbef0883 (diff) | |
download | linux-8cd55087dc45b2e1a73ed2a197cbf405f32deb08.tar.xz |
loop: Report EOPNOTSUPP properly
Properly plumb out EOPNOTSUPP from loop driver operations, which may
get returned when for instance a discard operation is attempted but not
supported by the underlying block device. Before this change, everything
was reported in the log as an I/O error, which is scary and not
helpful in debugging.
Signed-off-by: Evan Green <evgreen@chromium.org>
Reviewed-by: Gwendal Grignou <gwendal@chromium.org>
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Andrzej Pietrasiewicz <andrzej.p@collabora.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'drivers/block/loop.c')
-rw-r--r-- | drivers/block/loop.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/drivers/block/loop.c b/drivers/block/loop.c index a42c49e04954..04cbe951862d 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -463,7 +463,7 @@ static void lo_complete_rq(struct request *rq) if (!cmd->use_aio || cmd->ret < 0 || cmd->ret == blk_rq_bytes(rq) || req_op(rq) != REQ_OP_READ) { if (cmd->ret < 0) - ret = BLK_STS_IOERR; + ret = errno_to_blk_status(cmd->ret); goto end_io; } @@ -1955,7 +1955,10 @@ static void loop_handle_cmd(struct loop_cmd *cmd) failed: /* complete non-aio request */ if (!cmd->use_aio || ret) { - cmd->ret = ret ? -EIO : 0; + if (ret == -EOPNOTSUPP) + cmd->ret = ret; + else + cmd->ret = ret ? -EIO : 0; blk_mq_complete_request(rq); } } |