diff options
author | Nikanth Karthikesan <knikanth@novell.com> | 2009-06-10 12:57:06 -0700 |
---|---|---|
committer | Jens Axboe <jens.axboe@oracle.com> | 2009-06-10 23:07:15 +0200 |
commit | d9c7d394a8ebacb60097b192939ae9f15235225e (patch) | |
tree | 4fbf9c7677acb03c23d05faba1a4b0bcfb6702b4 /block/cfq-iosched.c | |
parent | 1d589bb16b825b3a7b4edd34d997f1f1f953033d (diff) | |
download | blackbird-op-linux-d9c7d394a8ebacb60097b192939ae9f15235225e.tar.gz blackbird-op-linux-d9c7d394a8ebacb60097b192939ae9f15235225e.zip |
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) if (!cfqd->active_cic) { struct cfq_io_context *cic = RQ_CIC(rq); - atomic_inc(&cic->ioc->refcount); + atomic_long_inc(&cic->ioc->refcount); cfqd->active_cic = cic; } } |