| From 2e864386e62e702a343be2507062ee08d5dfc810 Mon Sep 17 00:00:00 2001 |
| From: Evan Green <evgreen@chromium.org> |
| Date: Thu, 14 Nov 2019 15:50:07 -0800 |
| Subject: 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> |
| --- |
| drivers/block/loop.c | 7 +++++-- |
| 1 file changed, 5 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/block/loop.c |
| +++ b/drivers/block/loop.c |
| @@ -462,7 +462,7 @@ static void lo_complete_rq(struct reques |
| 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; |
| } |
| |
| @@ -1978,7 +1978,10 @@ static void loop_handle_cmd(struct loop_ |
| 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); |
| } |
| } |