aboutsummaryrefslogtreecommitdiffstats
path: root/block/blk-map.c
diff options
context:
space:
mode:
authorDouglas Gilbert <dgilbert@interlog.com>2018-01-14 17:00:48 -0500
committerJens Axboe <axboe@kernel.dk>2018-01-15 10:50:32 -0500
commit69e0927b3774563c19b5fb32e91d75edc147fb62 (patch)
tree597acc434317fb8ba709051e0ee68de2c288f649 /block/blk-map.c
parentfa70d2e2c4a0a54ced98260c6a176cc94c876d27 (diff)
blk_rq_map_user_iov: fix error override
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>
Diffstat (limited to 'block/blk-map.c')
-rw-r--r--block/blk-map.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/block/blk-map.c b/block/blk-map.c
index b21f8e86f120..209eb3b45c54 100644
--- a/block/blk-map.c
+++ b/block/blk-map.c
@@ -114,7 +114,7 @@ int blk_rq_map_user_iov(struct request_queue *q, struct request *rq,
114 unsigned long align = q->dma_pad_mask | queue_dma_alignment(q); 114 unsigned long align = q->dma_pad_mask | queue_dma_alignment(q);
115 struct bio *bio = NULL; 115 struct bio *bio = NULL;
116 struct iov_iter i; 116 struct iov_iter i;
117 int ret; 117 int ret = -EINVAL;
118 118
119 if (!iter_is_iovec(iter)) 119 if (!iter_is_iovec(iter))
120 goto fail; 120 goto fail;
@@ -143,7 +143,7 @@ unmap_rq:
143 __blk_rq_unmap_user(bio); 143 __blk_rq_unmap_user(bio);
144fail: 144fail:
145 rq->bio = NULL; 145 rq->bio = NULL;
146 return -EINVAL; 146 return ret;
147} 147}
148EXPORT_SYMBOL(blk_rq_map_user_iov); 148EXPORT_SYMBOL(blk_rq_map_user_iov);
149 149