loop: Report EOPNOTSUPP properly
authorEvan Green <evgreen@chromium.org>
Fri, 3 Apr 2020 14:43:03 +0000 (16:43 +0200)
committerJens Axboe <axboe@kernel.dk>
Fri, 3 Apr 2020 19:44:20 +0000 (13:44 -0600)
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>
drivers/block/loop.c

index a42c49e..04cbe95 100644 (file)
@@ -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);
        }
 }