[PATCH] switch to use of ->key to get cfq_data by cfq_io_context
authorAl Viro <viro@zeniv.linux.org.uk>
Sat, 18 Mar 2006 18:25:24 +0000 (13:25 -0500)
committerAl Viro <viro@zeniv.linux.org.uk>
Sat, 18 Mar 2006 23:33:59 +0000 (18:33 -0500)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
block/cfq-iosched.c

index 63ed11f..42f990f 100644 (file)
@@ -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;