From: Josh Durgin Date: Mon, 21 Jul 2014 21:08:44 +0000 (-0700) Subject: ObjectCacher: fix dirty_or_tx_bh logic in bh_set_state() X-Git-Tag: v0.84~77^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=8a05f1ba0e58f8558ddf8b525df10db333f4a226;p=ceph.git ObjectCacher: fix dirty_or_tx_bh logic in bh_set_state() The else-if chain here was wrong. Handling dirty or tx buffers and errors should be in independent conditions. Signed-off-by: Josh Durgin --- diff --git a/src/osdc/ObjectCacher.cc b/src/osdc/ObjectCacher.cc index cb3c56456a8c..e87ec7a07ec0 100644 --- a/src/osdc/ObjectCacher.cc +++ b/src/osdc/ObjectCacher.cc @@ -2003,20 +2003,29 @@ void ObjectCacher::bh_stat_sub(BufferHead *bh) void ObjectCacher::bh_set_state(BufferHead *bh, int s) { assert(lock.is_locked()); + int state = bh->get_state(); // move between lru lists? - if (s == BufferHead::STATE_DIRTY && bh->get_state() != BufferHead::STATE_DIRTY) { + if (s == BufferHead::STATE_DIRTY && state != BufferHead::STATE_DIRTY) { bh_lru_rest.lru_remove(bh); bh_lru_dirty.lru_insert_top(bh); - dirty_or_tx_bh.insert(bh); - } else if (s != BufferHead::STATE_DIRTY && bh->get_state() == BufferHead::STATE_DIRTY) { + } else if (s != BufferHead::STATE_DIRTY && state == BufferHead::STATE_DIRTY) { bh_lru_dirty.lru_remove(bh); bh_lru_rest.lru_insert_top(bh); - dirty_or_tx_bh.erase(bh); - } else if (s == BufferHead::STATE_TX && bh->get_state() != BufferHead::STATE_TX) { + } + + if ((s == BufferHead::STATE_TX || + s == BufferHead::STATE_DIRTY) && + state != BufferHead::STATE_TX && + state != BufferHead::STATE_DIRTY) { dirty_or_tx_bh.insert(bh); - } else if (s != BufferHead::STATE_TX && bh->get_state() == BufferHead::STATE_TX) { + } else if ((state == BufferHead::STATE_TX || + state == BufferHead::STATE_DIRTY) && + s != BufferHead::STATE_TX && + s != BufferHead::STATE_DIRTY) { dirty_or_tx_bh.erase(bh); - } else if (s != BufferHead::STATE_ERROR && bh->get_state() == BufferHead::STATE_ERROR) { + } + + if (s != BufferHead::STATE_ERROR && bh->get_state() == BufferHead::STATE_ERROR) { bh->error = 0; }