[PATCH] CFQ: bad locking in changed_ioprio()

When the ioprio code recently got juggled a bit, a bug was introduced.
changed_ioprio() is no longer called with interrupts disabled, so using
plain spin_lock() on the queue_lock is a bug.

Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by Jens Axboe and committed by Linus Torvalds c1b707d2 0261d688

+3 -2
+3 -2
block/cfq-iosched.c
··· 1215 { 1216 struct cfq_data *cfqd = cic->key; 1217 struct cfq_queue *cfqq; 1218 1219 if (unlikely(!cfqd)) 1220 return; 1221 1222 - spin_lock(cfqd->queue->queue_lock); 1223 1224 cfqq = cic->cfqq[ASYNC]; 1225 if (cfqq) { ··· 1237 if (cfqq) 1238 cfq_mark_cfqq_prio_changed(cfqq); 1239 1240 - spin_unlock(cfqd->queue->queue_lock); 1241 } 1242 1243 static void cfq_ioc_set_ioprio(struct io_context *ioc)
··· 1215 { 1216 struct cfq_data *cfqd = cic->key; 1217 struct cfq_queue *cfqq; 1218 + unsigned long flags; 1219 1220 if (unlikely(!cfqd)) 1221 return; 1222 1223 + spin_lock_irqsave(cfqd->queue->queue_lock, flags); 1224 1225 cfqq = cic->cfqq[ASYNC]; 1226 if (cfqq) { ··· 1236 if (cfqq) 1237 cfq_mark_cfqq_prio_changed(cfqq); 1238 1239 + spin_unlock_irqrestore(cfqd->queue->queue_lock, flags); 1240 } 1241 1242 static void cfq_ioc_set_ioprio(struct io_context *ioc)