summaryrefslogtreecommitdiffstats
path: root/block
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2006-03-18 19:25:24 +0100
committerAl Viro <viro@zeniv.linux.org.uk>2006-03-19 00:33:59 +0100
commit478a82b0edeea1cc82a5f79880b3a15923a678de (patch)
tree091c2ace634975c62c8236f209b24e4fded81ff4 /block
parent[PATCH] stop leaking cfq_data in cfq_set_request() (diff)
downloadlinux-478a82b0edeea1cc82a5f79880b3a15923a678de.tar.xz
linux-478a82b0edeea1cc82a5f79880b3a15923a678de.zip
[PATCH] switch to use of ->key to get cfq_data by cfq_io_context
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'block')
-rw-r--r--block/cfq-iosched.c26
1 files changed, 15 insertions, 11 deletions
diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c
index 63ed11f8795d..42f990f2763d 100644
--- a/block/cfq-iosched.c
+++ b/block/cfq-iosched.c
@@ -1212,7 +1212,7 @@ static void cfq_free_io_context(struct cfq_io_context *cic)
*/
static void cfq_exit_single_io_context(struct cfq_io_context *cic)
{
- struct cfq_data *cfqd = cic->cfqq->cfqd;
+ struct cfq_data *cfqd = cic->key;
request_queue_t *q = cfqd->queue;
WARN_ON(!irqs_disabled());
@@ -1224,6 +1224,7 @@ static void cfq_exit_single_io_context(struct cfq_io_context *cic)
cfq_put_queue(cic->cfqq);
cic->cfqq = NULL;
+ cic->key = NULL;
spin_unlock(q->queue_lock);
}
@@ -1318,14 +1319,17 @@ static void cfq_init_prio_data(struct cfq_queue *cfqq)
cfq_clear_cfqq_prio_changed(cfqq);
}
-static inline void changed_ioprio(struct cfq_queue *cfqq)
+static inline void changed_ioprio(struct cfq_io_context *cic)
{
- if (cfqq) {
- struct cfq_data *cfqd = cfqq->cfqd;
-
+ struct cfq_data *cfqd = cic->key;
+ struct cfq_queue *cfqq;
+ if (cfqd) {
spin_lock(cfqd->queue->queue_lock);
- cfq_mark_cfqq_prio_changed(cfqq);
- cfq_init_prio_data(cfqq);
+ cfqq = cic->cfqq;
+ if (cfqq) {
+ cfq_mark_cfqq_prio_changed(cfqq);
+ cfq_init_prio_data(cfqq);
+ }
spin_unlock(cfqd->queue->queue_lock);
}
}
@@ -1337,10 +1341,10 @@ static int cfq_ioc_set_ioprio(struct io_context *ioc, unsigned int ioprio)
{
struct cfq_io_context *cic = ioc->cic;
- changed_ioprio(cic->cfqq);
+ changed_ioprio(cic);
list_for_each_entry(cic, &cic->list, list)
- changed_ioprio(cic->cfqq);
+ changed_ioprio(cic);
return 0;
}
@@ -1429,10 +1433,10 @@ cfq_get_io_context(struct cfq_data *cfqd, pid_t pid, gfp_t gfp_mask)
* manually increment generic io_context usage count, it
* cannot go away since we are already holding one ref to it
*/
- ioc->cic = cic;
- ioc->set_ioprio = cfq_ioc_set_ioprio;
cic->ioc = ioc;
cic->key = cfqd;
+ ioc->set_ioprio = cfq_ioc_set_ioprio;
+ ioc->cic = cic;
} else {
struct cfq_io_context *__cic;