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@xxxxxxxxxx> > --- > 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@xxxxxxxxxx> -- Ming