| From 69e0927b3774563c19b5fb32e91d75edc147fb62 Mon Sep 17 00:00:00 2001 |
| From: Douglas Gilbert <dgilbert@interlog.com> |
| Date: Sun, 14 Jan 2018 17:00:48 -0500 |
| Subject: blk_rq_map_user_iov: fix error override |
| |
| From: Douglas Gilbert <dgilbert@interlog.com> |
| |
| commit 69e0927b3774563c19b5fb32e91d75edc147fb62 upstream. |
| |
| During stress tests by syzkaller on the sg driver the block layer |
| infrequently returns EINVAL. Closer inspection shows the block |
| layer was trying to return ENOMEM (which is much more |
| understandable) but for some reason overroad that useful error. |
| |
| Patch below does not show this (unchanged) line: |
| ret =__blk_rq_map_user_iov(rq, map_data, &i, gfp_mask, copy); |
| That 'ret' was being overridden when that function failed. |
| |
| Signed-off-by: Douglas Gilbert <dgilbert@interlog.com> |
| Signed-off-by: Jens Axboe <axboe@kernel.dk> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| block/blk-map.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/block/blk-map.c |
| +++ b/block/blk-map.c |
| @@ -116,7 +116,7 @@ int blk_rq_map_user_iov(struct request_q |
| unsigned long align = q->dma_pad_mask | queue_dma_alignment(q); |
| struct bio *bio = NULL; |
| struct iov_iter i; |
| - int ret; |
| + int ret = -EINVAL; |
| |
| if (!iter_is_iovec(iter)) |
| goto fail; |
| @@ -145,7 +145,7 @@ unmap_rq: |
| __blk_rq_unmap_user(bio); |
| fail: |
| rq->bio = NULL; |
| - return -EINVAL; |
| + return ret; |
| } |
| EXPORT_SYMBOL(blk_rq_map_user_iov); |
| |