spin_lock(q->queue_lock);
 
-       if (unlikely(cic->cfqq == cfqd->active_queue))
-               __cfq_slice_expired(cfqd, cic->cfqq, 0);
+       if (cic->cfqq[ASYNC]) {
+               if (unlikely(cic->cfqq[ASYNC] == cfqd->active_queue))
+                       __cfq_slice_expired(cfqd, cic->cfqq[ASYNC], 0);
+               cfq_put_queue(cic->cfqq[ASYNC]);
+               cic->cfqq[ASYNC] = NULL;
+       }
+
+       if (cic->cfqq[SYNC]) {
+               if (unlikely(cic->cfqq[SYNC] == cfqd->active_queue))
+                       __cfq_slice_expired(cfqd, cic->cfqq[SYNC], 0);
+               cfq_put_queue(cic->cfqq[SYNC]);
+               cic->cfqq[SYNC] = NULL;
+       }
 
-       cfq_put_queue(cic->cfqq);
-       cic->cfqq = NULL;
        cic->key = NULL;
        spin_unlock(q->queue_lock);
 }
 
        if (cic) {
                INIT_LIST_HEAD(&cic->list);
-               cic->cfqq = NULL;
+               cic->cfqq[ASYNC] = NULL;
+               cic->cfqq[SYNC] = NULL;
                cic->key = NULL;
                cic->last_end_request = jiffies;
                cic->ttime_total = 0;
        struct cfq_queue *cfqq;
        if (cfqd) {
                spin_lock(cfqd->queue->queue_lock);
-               cfqq = cic->cfqq;
+               cfqq = cic->cfqq[ASYNC];
+               if (cfqq) {
+                       cfq_mark_cfqq_prio_changed(cfqq);
+                       cfq_init_prio_data(cfqq);
+               }
+               cfqq = cic->cfqq[SYNC];
                if (cfqq) {
                        cfq_mark_cfqq_prio_changed(cfqq);
                        cfq_init_prio_data(cfqq);
        struct cfq_queue *cfqq;
        struct cfq_rq *crq;
        unsigned long flags;
+       int is_sync = key != CFQ_KEY_ASYNC;
 
        might_sleep_if(gfp_mask & __GFP_WAIT);
 
        if (!cic)
                goto queue_fail;
 
-       if (!cic->cfqq) {
+       if (!cic->cfqq[is_sync]) {
                cfqq = cfq_get_queue(cfqd, key, tsk->ioprio, gfp_mask);
                if (!cfqq)
                        goto queue_fail;
 
-               cic->cfqq = cfqq;
+               cic->cfqq[is_sync] = cfqq;
        } else
-               cfqq = cic->cfqq;
+               cfqq = cic->cfqq[is_sync];
 
        cfqq->allocated[rw]++;
        cfq_clear_cfqq_must_alloc(cfqq);
                crq->cfq_queue = cfqq;
                crq->io_context = cic;
 
-               if (rw == READ || process_sync(tsk))
+               if (is_sync)
                        cfq_mark_crq_is_sync(crq);
                else
                        cfq_clear_crq_is_sync(crq);