diff options
author | Jens Axboe <jens.axboe@oracle.com> | 2006-12-19 11:07:59 +0100 |
---|---|---|
committer | Jens Axboe <jens.axboe@oracle.com> | 2006-12-19 11:07:59 +0100 |
commit | 48785bb9fa39415d7553e234946442579dfcf591 (patch) | |
tree | 2f22a34dbc334daade0962a119b2b42795715df8 /block | |
parent | 9c9381f9425ab4d2f9f0458ae9525c18bc832f59 (diff) | |
download | lwn-48785bb9fa39415d7553e234946442579dfcf591.tar.gz lwn-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.c | 9 |
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); |