]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
ObjectCacher: fix dirty_or_tx_bh logic in bh_set_state()
authorJosh Durgin <josh.durgin@inktank.com>
Mon, 21 Jul 2014 21:08:44 +0000 (14:08 -0700)
committerHaomai Wang <haomaiwang@gmail.com>
Sun, 27 Jul 2014 05:36:19 +0000 (13:36 +0800)
The else-if chain here was wrong. Handling dirty or tx buffers and
errors should be in independent conditions.

Signed-off-by: Josh Durgin <josh.durgin@inktank.com>
src/osdc/ObjectCacher.cc

index cb3c56456a8ce6c0acc0f1f1070df1b06928466a..e87ec7a07ec088d18c1e45fcaad76db5ddc802f2 100644 (file)
@@ -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;
   }