[PATCH 1/2] block: return errors from blk_execute_rq()

Christoph Hellwig hch at lst.de
Mon Apr 26 15:31:46 BST 2021


On Fri, Apr 23, 2021 at 02:57:59PM -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
> completion status.
> 
> Reported-by: Yuanyuan Zhong <yzhong at purestorage.com>
> Signed-off-by: Keith Busch <kbusch at 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 beae70a0e5e5..3877a2677dd4 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));

I think we should propagate the blk_status_t here as we're entirely inside
the block layer.  I.e. declare a blk_status_t on-stack in blk_execute_rq
and pass a pointer to it in ->end_io_data.

> -extern void blk_execute_rq(struct gendisk *, struct request *, int);
> +extern int blk_execute_rq(struct gendisk *, struct request *, int);

It would be nice to drop the extern here and spell out the argument
names.



More information about the Linux-nvme mailing list