diff options
author | FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> | 2009-04-13 20:03:10 +0200 |
---|---|---|
committer | Jens Axboe <jens.axboe@oracle.com> | 2009-04-15 12:10:11 +0200 |
commit | 91e463c8f5f7a5b09d3d034c01a88567af60c504 (patch) | |
tree | b37b3402f7eb55e9f899d63faf1e2ec520c0a3c7 /block/scsi_ioctl.c | |
parent | d6ceb25e8d8bccf826848c2621a50d02c0a7f4ae (diff) | |
download | op-kernel-dev-91e463c8f5f7a5b09d3d034c01a88567af60c504.zip op-kernel-dev-91e463c8f5f7a5b09d3d034c01a88567af60c504.tar.gz |
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>
Diffstat (limited to 'block/scsi_ioctl.c')
-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 626ee27..84b7f87 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; |