Re: [PATCHv2 3/5] block: return errors from blk_execute_rq()

Ming Lei
2021-04-26T06:42:43Z

On Fri, Apr 23, 2021 at 03:05:56PM -0700, Keith Busch wrote:
> The synchronous blk_execute_rq() had not provided a way for its callers
> to know if its request was successful or not. Return the errno from the
> dispatch status.
>
> Signed-off-by: Keith Busch <kbusch@kernel.org>
> ---
> block/blk-exec.c | 6 ++++--
> include/linux/blkdev.h | 2 +-
> 2 files changed, 5 insertions(+), 3 deletions(-)
>
> diff --git a/block/blk-exec.c b/block/blk-exec.c
> index b960ad187ba5..4e8e6fe20956 100644
> --- a/block/blk-exec.c
> +++ b/block/blk-exec.c
> @@ -21,7 +21,7 @@ static void blk_end_sync_rq(struct request *rq, blk_status_t error)
> {
> struct completion *waiting = rq->end_io_data;
>
> - rq->end_io_data = NULL;
> + rq->end_io_data = ERR_PTR(blk_status_to_errno(error));
>
> /*
> * complete last, if this is a stack request the process (and thus
> @@ -77,8 +77,9 @@ static bool blk_rq_is_poll(struct request *rq)
> * Description:
> * Insert a fully prepared request at the back of the I/O scheduler queue
> * for execution and wait for completion.
> + * Return: The errno value of the blk_status_t provided to blk_mq_end_request().
> */
> -void blk_execute_rq(struct gendisk *bd_disk, struct request *rq, int at_head)
> +int blk_execute_rq(struct gendisk *bd_disk, struct request *rq, int at_head)
> {
> DECLARE_COMPLETION_ONSTACK(wait);
> unsigned long hang_check;
> @@ -97,5 +98,6 @@ void blk_execute_rq(struct gendisk *bd_disk, struct request *rq, int at_head)
> while (!wait_for_completion_io_timeout(&wait, hang_check * (HZ/2)));
> else
> wait_for_completion_io(&wait);
> + return PTR_ERR_OR_ZERO(rq->end_io_data);

Reviewed-by: Ming Lei <ming.lei@redhat.com>

--
Ming