Commit 0261d688 authored by Jens Axboe's avatar Jens Axboe Committed by Linus Torvalds

[PATCH] CFQ: use irq safe locking in cfq_cic_link()

If cfq_set_request() is called for a new process AND a non-fs io
request (so that __GFP_WAIT may not be set), cfq_cic_link() may
use spin_lock_irq() and spin_unlock_irq() with interrupts already
disabled.

Fix is to always use irq safe locking in cfq_cic_link()
Acked-By: default avatarArjan van de Ven <arjan@linux.intel.com>
Acked-by: default avatarIngo Molnar <mingo@elte.hu>
Signed-off-by: default avatarJens Axboe <jens.axboe@oracle.com>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 209ad53b
...@@ -1362,6 +1362,7 @@ cfq_cic_link(struct cfq_data *cfqd, struct io_context *ioc, ...@@ -1362,6 +1362,7 @@ cfq_cic_link(struct cfq_data *cfqd, struct io_context *ioc,
struct rb_node **p; struct rb_node **p;
struct rb_node *parent; struct rb_node *parent;
struct cfq_io_context *__cic; struct cfq_io_context *__cic;
unsigned long flags;
void *k; void *k;
cic->ioc = ioc; cic->ioc = ioc;
...@@ -1391,9 +1392,9 @@ cfq_cic_link(struct cfq_data *cfqd, struct io_context *ioc, ...@@ -1391,9 +1392,9 @@ cfq_cic_link(struct cfq_data *cfqd, struct io_context *ioc,
rb_link_node(&cic->rb_node, parent, p); rb_link_node(&cic->rb_node, parent, p);
rb_insert_color(&cic->rb_node, &ioc->cic_root); rb_insert_color(&cic->rb_node, &ioc->cic_root);
spin_lock_irq(cfqd->queue->queue_lock); spin_lock_irqsave(cfqd->queue->queue_lock, flags);
list_add(&cic->queue_list, &cfqd->cic_list); list_add(&cic->queue_list, &cfqd->cic_list);
spin_unlock_irq(cfqd->queue->queue_lock); spin_unlock_irqrestore(cfqd->queue->queue_lock, flags);
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment