diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2006-03-18 19:25:24 +0100 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2006-03-19 00:33:59 +0100 |
commit | 478a82b0edeea1cc82a5f79880b3a15923a678de (patch) | |
tree | 091c2ace634975c62c8236f209b24e4fded81ff4 /block | |
parent | [PATCH] stop leaking cfq_data in cfq_set_request() (diff) | |
download | linux-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.c | 26 |
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; |