diff options
author | Nikanth Karthikesan <knikanth@novell.com> | 2009-06-10 15:57:06 -0400 |
---|---|---|
committer | Jens Axboe <jens.axboe@oracle.com> | 2009-06-10 17:07:15 -0400 |
commit | d9c7d394a8ebacb60097b192939ae9f15235225e (patch) | |
tree | 4fbf9c7677acb03c23d05faba1a4b0bcfb6702b4 /block/cfq-iosched.c | |
parent | 1d589bb16b825b3a7b4edd34d997f1f1f953033d (diff) |
block: prevent possible io_context->refcount overflow
Currently io_context has an atomic_t(32-bit) as refcount. In the case of
cfq, for each device against whcih a task does I/O, a reference to the
io_context would be taken. And when there are multiple process sharing
io_contexts(CLONE_IO) would also have a reference to the same io_context.
Theoretically the possible maximum number of processes sharing the same
io_context + the number of disks/cfq_data referring to the same io_context
can overflow the 32-bit counter on a very high-end machine.
Even though it is an improbable case, let us make it atomic_long_t.
Signed-off-by: Nikanth Karthikesan <knikanth@suse.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
Diffstat (limited to 'block/cfq-iosched.c')
-rw-r--r-- | block/cfq-iosched.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c index 99ac4304d711..ef2f72d42434 100644 --- a/block/cfq-iosched.c +++ b/block/cfq-iosched.c | |||
@@ -1282,7 +1282,7 @@ static void cfq_dispatch_request(struct cfq_data *cfqd, struct cfq_queue *cfqq) | |||
1282 | if (!cfqd->active_cic) { | 1282 | if (!cfqd->active_cic) { |
1283 | struct cfq_io_context *cic = RQ_CIC(rq); | 1283 | struct cfq_io_context *cic = RQ_CIC(rq); |
1284 | 1284 | ||
1285 | atomic_inc(&cic->ioc->refcount); | 1285 | atomic_long_inc(&cic->ioc->refcount); |
1286 | cfqd->active_cic = cic; | 1286 | cfqd->active_cic = cic; |
1287 | } | 1287 | } |
1288 | } | 1288 | } |