From 4e3fc94c0fbcde0d319e21dbbc3f0f1a72ca7671 Mon Sep 17 00:00:00 2001 From: Fabio Checconi Date: Thu, 10 Apr 2008 08:28:01 +0200 Subject: [PATCH] --- yaml --- r: 88223 b: refs/heads/master c: 4faa3c8150c1d4f7b38d962eda7851083e218e3f h: refs/heads/master i: 88221: d6903ec909aceb74631970c457e3de2ba2ed31b3 88219: 44f354f082056e74a550b5a309b9cc2b0fbfad7a 88215: f202a7c11706907027a8786a86648cfcac052b69 88207: 9a44836b0554dc56aa3a001ffa38721363388c50 88191: 4dc3125d74f3dfb5af7f365fbcb4cc5d50148ed7 v: v3 --- [refs] | 2 +- trunk/block/cfq-iosched.c | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index a1c84aedec17..24d292d10648 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 8191ecd1d14c6914c660dfa007154860a7908857 +refs/heads/master: 4faa3c8150c1d4f7b38d962eda7851083e218e3f diff --git a/trunk/block/cfq-iosched.c b/trunk/block/cfq-iosched.c index f26da2bfcc15..f4e1006c253d 100644 --- a/trunk/block/cfq-iosched.c +++ b/trunk/block/cfq-iosched.c @@ -1214,6 +1214,8 @@ static void cfq_exit_cfqq(struct cfq_data *cfqd, struct cfq_queue *cfqq) static void __cfq_exit_single_io_context(struct cfq_data *cfqd, struct cfq_io_context *cic) { + struct io_context *ioc = cic->ioc; + list_del_init(&cic->queue_list); /* @@ -1223,6 +1225,9 @@ static void __cfq_exit_single_io_context(struct cfq_data *cfqd, cic->dead_key = (unsigned long) cic->key; cic->key = NULL; + if (ioc->ioc_data == cic) + rcu_assign_pointer(ioc->ioc_data, NULL); + if (cic->cfqq[ASYNC]) { cfq_exit_cfqq(cfqd, cic->cfqq[ASYNC]); cic->cfqq[ASYNC] = NULL; @@ -1255,7 +1260,6 @@ static void cfq_exit_single_io_context(struct io_context *ioc, */ static void cfq_exit_io_context(struct io_context *ioc) { - rcu_assign_pointer(ioc->ioc_data, NULL); call_for_each_cic(ioc, cfq_exit_single_io_context); } @@ -1478,8 +1482,7 @@ cfq_drop_dead_cic(struct cfq_data *cfqd, struct io_context *ioc, spin_lock_irqsave(&ioc->lock, flags); - if (ioc->ioc_data == cic) - rcu_assign_pointer(ioc->ioc_data, NULL); + BUG_ON(ioc->ioc_data == cic); radix_tree_delete(&ioc->radix_root, (unsigned long) cfqd); hlist_del_rcu(&cic->cic_list);