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@xxxxxxxxxxxxxxx> > 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 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.