From 064f02917df32b19057b4e2fd73f7eb90c5ae280 Mon Sep 17 00:00:00 2001 From: Boaz Harrosh Date: Tue, 24 Mar 2009 12:35:07 +0100 Subject: [PATCH] --- yaml --- r: 135578 b: refs/heads/master c: 1cd96c242a829d52f7a5ae98f554ca9775429685 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/block/blk-core.c | 3 +++ trunk/block/blk-merge.c | 2 ++ trunk/block/scsi_ioctl.c | 21 ++++----------------- 4 files changed, 10 insertions(+), 18 deletions(-) diff --git a/[refs] b/[refs] index 413d61f10004..2a6d6f4ac731 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: f028f3b2f987ebc61cef382ab7a5c449917b728e +refs/heads/master: 1cd96c242a829d52f7a5ae98f554ca9775429685 diff --git a/trunk/block/blk-core.c b/trunk/block/blk-core.c index 7b63c9b6333d..996ed906d8ca 100644 --- a/trunk/block/blk-core.c +++ b/trunk/block/blk-core.c @@ -1062,6 +1062,9 @@ void __blk_put_request(struct request_queue *q, struct request *req) elv_completed_request(q, req); + /* this is a bio leak */ + WARN_ON(req->bio != NULL); + /* * Request may not have originated from ll_rw_blk. if not, * it didn't come out of our reserved rq pools diff --git a/trunk/block/blk-merge.c b/trunk/block/blk-merge.c index 5a244f05360f..e39cb24b7679 100644 --- a/trunk/block/blk-merge.c +++ b/trunk/block/blk-merge.c @@ -403,6 +403,8 @@ static int attempt_merge(struct request_queue *q, struct request *req, if (blk_rq_cpu_valid(next)) req->cpu = next->cpu; + /* owner-ship of bio passed from next to req */ + next->bio = NULL; __blk_put_request(q, next); return 1; } diff --git a/trunk/block/scsi_ioctl.c b/trunk/block/scsi_ioctl.c index ee9c67d7e1be..626ee274c5c4 100644 --- a/trunk/block/scsi_ioctl.c +++ b/trunk/block/scsi_ioctl.c @@ -214,21 +214,10 @@ static int blk_fill_sghdr_rq(struct request_queue *q, struct request *rq, return 0; } -/* - * unmap a request that was previously mapped to this sg_io_hdr. handles - * both sg and non-sg sg_io_hdr. - */ -static int blk_unmap_sghdr_rq(struct request *rq, struct sg_io_hdr *hdr) -{ - blk_rq_unmap_user(rq->bio); - blk_put_request(rq); - return 0; -} - static int blk_complete_sghdr_rq(struct request *rq, struct sg_io_hdr *hdr, struct bio *bio) { - int r, ret = 0; + int ret = 0; /* * fill in all the output members @@ -253,12 +242,10 @@ static int blk_complete_sghdr_rq(struct request *rq, struct sg_io_hdr *hdr, ret = -EFAULT; } - rq->bio = bio; - r = blk_unmap_sghdr_rq(rq, hdr); - if (ret) - r = ret; + blk_rq_unmap_user(bio); + blk_put_request(rq); - return r; + return ret; } static int sg_io(struct request_queue *q, struct gendisk *bd_disk,