| From 3181faa85bda3dc3f5e630a1846526c9caaa38e3 Mon Sep 17 00:00:00 2001 |
| From: Shaohua Li <shaohua.li@intel.com> |
| Date: Mon, 27 Jun 2011 09:03:47 +0200 |
| Subject: cfq-iosched: fix a rcu warning |
| |
| From: Shaohua Li <shaohua.li@intel.com> |
| |
| commit 3181faa85bda3dc3f5e630a1846526c9caaa38e3 upstream. |
| |
| I got a rcu warnning at boot. the ioc->ioc_data is rcu_deferenced, but |
| doesn't hold rcu_read_lock. |
| |
| Signed-off-by: Shaohua Li <shaohua.li@intel.com> |
| Signed-off-by: Jens Axboe <jaxboe@fusionio.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| block/cfq-iosched.c | 5 ++++- |
| 1 file changed, 4 insertions(+), 1 deletion(-) |
| |
| --- a/block/cfq-iosched.c |
| +++ b/block/cfq-iosched.c |
| @@ -1540,11 +1540,14 @@ static void __cfq_exit_single_io_context |
| cic->dead_key = (unsigned long) cic->key; |
| cic->key = NULL; |
| |
| + rcu_read_lock(); |
| if (rcu_dereference(ioc->ioc_data) == cic) { |
| + rcu_read_unlock(); |
| spin_lock(&ioc->lock); |
| rcu_assign_pointer(ioc->ioc_data, NULL); |
| spin_unlock(&ioc->lock); |
| - } |
| + } else |
| + rcu_read_unlock(); |
| |
| if (cic->cfqq[BLK_RW_ASYNC]) { |
| cfq_exit_cfqq(cfqd, cic->cfqq[BLK_RW_ASYNC]); |