diff --git a/[refs] b/[refs] index 51d55d1582a6..8f4d67170336 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 8ae30b895805a6e2bb725b1d78b12daabd7eadfe +refs/heads/master: 62c1fe9d9f0a676fce89185b1513f0e5f473c72c diff --git a/trunk/block/cfq-iosched.c b/trunk/block/cfq-iosched.c index ee8a90c7c46c..e8525fa72823 100644 --- a/trunk/block/cfq-iosched.c +++ b/trunk/block/cfq-iosched.c @@ -1314,7 +1314,15 @@ static void cfq_exit_single_io_context(struct io_context *ioc, unsigned long flags; spin_lock_irqsave(q->queue_lock, flags); - __cfq_exit_single_io_context(cfqd, cic); + + /* + * Ensure we get a fresh copy of the ->key to prevent + * race between exiting task and queue + */ + smp_read_barrier_depends(); + if (cic->key) + __cfq_exit_single_io_context(cfqd, cic); + spin_unlock_irqrestore(q->queue_lock, flags); } }