Commit c1b707d253fe918b92882cff1dbd926b47e14fd2

Authored by Jens Axboe
Committed by Linus Torvalds
1 parent 0261d6886e

[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>

Showing 1 changed file with 3 additions and 2 deletions Side-by-side Diff

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