summaryrefslogtreecommitdiff
path: root/block/cfq-iosched.c
diff options
context:
space:
mode:
authorNikanth Karthikesan <knikanth@novell.com>2009-06-10 12:57:06 -0700
committerJens Axboe <jens.axboe@oracle.com>2009-06-10 23:07:15 +0200
commitd9c7d394a8ebacb60097b192939ae9f15235225e (patch)
tree4fbf9c7677acb03c23d05faba1a4b0bcfb6702b4 /block/cfq-iosched.c
parent1d589bb16b825b3a7b4edd34d997f1f1f953033d (diff)
downloadlinux-3.10-d9c7d394a8ebacb60097b192939ae9f15235225e.tar.gz
linux-3.10-d9c7d394a8ebacb60097b192939ae9f15235225e.tar.bz2
linux-3.10-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.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c
index 99ac4304d71..ef2f72d4243 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;
}
}