.. | .. |
---|
373 | 373 | |
---|
374 | 374 | void bic_set_bfqq(struct bfq_io_cq *bic, struct bfq_queue *bfqq, bool is_sync) |
---|
375 | 375 | { |
---|
| 376 | + struct bfq_queue *old_bfqq = bic->bfqq[is_sync]; |
---|
| 377 | + |
---|
| 378 | + /* Clear bic pointer if bfqq is detached from this bic */ |
---|
| 379 | + if (old_bfqq && old_bfqq->bic == bic) |
---|
| 380 | + old_bfqq->bic = NULL; |
---|
| 381 | + |
---|
376 | 382 | bic->bfqq[is_sync] = bfqq; |
---|
377 | 383 | } |
---|
378 | 384 | |
---|
.. | .. |
---|
2810 | 2816 | /* |
---|
2811 | 2817 | * Merge queues (that is, let bic redirect its requests to new_bfqq) |
---|
2812 | 2818 | */ |
---|
2813 | | - bic_set_bfqq(bic, new_bfqq, 1); |
---|
| 2819 | + bic_set_bfqq(bic, new_bfqq, true); |
---|
2814 | 2820 | bfq_mark_bfqq_coop(new_bfqq); |
---|
2815 | 2821 | /* |
---|
2816 | 2822 | * new_bfqq now belongs to at least two bics (it is a shared queue): |
---|
.. | .. |
---|
4974 | 4980 | unsigned long flags; |
---|
4975 | 4981 | |
---|
4976 | 4982 | spin_lock_irqsave(&bfqd->lock, flags); |
---|
4977 | | - bfqq->bic = NULL; |
---|
4978 | | - bfq_exit_bfqq(bfqd, bfqq); |
---|
4979 | 4983 | bic_set_bfqq(bic, NULL, is_sync); |
---|
| 4984 | + bfq_exit_bfqq(bfqd, bfqq); |
---|
4980 | 4985 | spin_unlock_irqrestore(&bfqd->lock, flags); |
---|
4981 | 4986 | } |
---|
4982 | 4987 | } |
---|
.. | .. |
---|
5062 | 5067 | |
---|
5063 | 5068 | bfqq = bic_to_bfqq(bic, false); |
---|
5064 | 5069 | if (bfqq) { |
---|
5065 | | - bfq_release_process_ref(bfqd, bfqq); |
---|
5066 | | - bfqq = bfq_get_queue(bfqd, bio, BLK_RW_ASYNC, bic); |
---|
| 5070 | + struct bfq_queue *old_bfqq = bfqq; |
---|
| 5071 | + |
---|
| 5072 | + bfqq = bfq_get_queue(bfqd, bio, false, bic); |
---|
5067 | 5073 | bic_set_bfqq(bic, bfqq, false); |
---|
| 5074 | + bfq_release_process_ref(bfqd, old_bfqq); |
---|
5068 | 5075 | } |
---|
5069 | 5076 | |
---|
5070 | 5077 | bfqq = bic_to_bfqq(bic, true); |
---|
.. | .. |
---|
6004 | 6011 | return bfqq; |
---|
6005 | 6012 | } |
---|
6006 | 6013 | |
---|
6007 | | - bic_set_bfqq(bic, NULL, 1); |
---|
| 6014 | + bic_set_bfqq(bic, NULL, true); |
---|
6008 | 6015 | |
---|
6009 | 6016 | bfq_put_cooperator(bfqq); |
---|
6010 | 6017 | |
---|