diff options
author | 2009-04-13 20:03:10 +0200 | |
---|---|---|
committer | 2009-04-15 12:10:11 +0200 | |
commit | 91e463c8f5f7a5b09d3d034c01a88567af60c504 (patch) | |
tree | b37b3402f7eb55e9f899d63faf1e2ec520c0a3c7 | |
parent | cfq-iosched: don't delay queue kick for a merged request (diff) | |
download | linux-91e463c8f5f7a5b09d3d034c01a88567af60c504.tar.gz linux-91e463c8f5f7a5b09d3d034c01a88567af60c504.tar.bz2 linux-91e463c8f5f7a5b09d3d034c01a88567af60c504.zip |
block: fix SG_IO to return a proper error value
blk_rq_unmap_user() returns -EFAULT if a program passes an invalid
address to kernel. SG_IO path needs to pass the returned value to user
space instead of ignoring it.
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
-rw-r--r-- | block/scsi_ioctl.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/block/scsi_ioctl.c b/block/scsi_ioctl.c index 626ee274c5c4..84b7f8709f41 100644 --- a/block/scsi_ioctl.c +++ b/block/scsi_ioctl.c @@ -217,7 +217,7 @@ static int blk_fill_sghdr_rq(struct request_queue *q, struct request *rq, static int blk_complete_sghdr_rq(struct request *rq, struct sg_io_hdr *hdr, struct bio *bio) { - int ret = 0; + int r, ret = 0; /* * fill in all the output members @@ -242,7 +242,9 @@ static int blk_complete_sghdr_rq(struct request *rq, struct sg_io_hdr *hdr, ret = -EFAULT; } - blk_rq_unmap_user(bio); + r = blk_rq_unmap_user(bio); + if (!ret) + ret = r; blk_put_request(rq); return ret; |