summaryrefslogtreecommitdiffstats
path: root/block
diff options
context:
space:
mode:
authorJens Axboe2006-12-19 11:07:59 +0100
committerJens Axboe2006-12-19 11:07:59 +0100
commit48785bb9fa39415d7553e234946442579dfcf591 (patch)
tree2f22a34dbc334daade0962a119b2b42795715df8 /block
parent[PATCH] __blk_rq_map_user() doesn't need to grab the queue_lock (diff)
downloadkernel-qcow2-linux-48785bb9fa39415d7553e234946442579dfcf591.tar.gz
kernel-qcow2-linux-48785bb9fa39415d7553e234946442579dfcf591.tar.xz
kernel-qcow2-linux-48785bb9fa39415d7553e234946442579dfcf591.zip
[PATCH] __blk_rq_unmap_user() fails to return error
If the bio is user copied, the copy back could return -EFAULT. Make sure we return any error seen during unmapping. Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
Diffstat (limited to 'block')
-rw-r--r--block/ll_rw_blk.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/block/ll_rw_blk.c b/block/ll_rw_blk.c
index 5d472e47c125..a66ec30855d8 100644
--- a/block/ll_rw_blk.c
+++ b/block/ll_rw_blk.c
@@ -2504,6 +2504,7 @@ EXPORT_SYMBOL(blk_rq_map_user_iov);
int blk_rq_unmap_user(struct request *rq)
{
struct bio *bio, *mapped_bio;
+ int ret = 0, ret2;
while ((bio = rq->bio)) {
if (bio_flagged(bio, BIO_BOUNCED))
@@ -2511,11 +2512,15 @@ int blk_rq_unmap_user(struct request *rq)
else
mapped_bio = bio;
- __blk_rq_unmap_user(mapped_bio);
+ ret2 = __blk_rq_unmap_user(mapped_bio);
+ if (ret2 && !ret)
+ ret = ret2;
+
rq->bio = bio->bi_next;
bio_put(bio);
}
- return 0;
+
+ return ret;
}
EXPORT_SYMBOL(blk_rq_unmap_user);