1234567891011121314151617181920212223242526272829303132333435363738394041 |
- From 2e864386e62e702a343be2507062ee08d5dfc810 Mon Sep 17 00:00:00 2001
- From: Evan Green <[email protected]>
- 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 <[email protected]>
- Reviewed-by: Gwendal Grignou <[email protected]>
- Reviewed-by: Bart Van Assche <[email protected]>
- ---
- drivers/block/loop.c | 7 +++++--
- 1 file changed, 5 insertions(+), 2 deletions(-)
- --- a/drivers/block/loop.c
- +++ b/drivers/block/loop.c
- @@ -460,7 +460,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;
- }
-
- @@ -1904,7 +1904,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);
- }
- }
|