summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYan, Zheng <zheng.z.yan@intel.com>2013-09-12 10:36:39 +0800
committerSage Weil <sage@inktank.com>2013-10-10 04:26:44 -0700
commit33da08f683d40f33061cefa0cf145f3ff21ea089 (patch)
treec950e075099c8541bf6d0cb432475271229e1b7d
parent346b43d80f728e6b389208ccd8054d96b76b093c (diff)
downloadceph-33da08f683d40f33061cefa0cf145f3ff21ea089.tar.gz
osdc/ObjectCacher: finish contexts after dropping object reference
The context to finish can be class C_Client_PutInode, which may drop inode's last reference. So we should first drop object's reference, then finish contexts. Signed-off-by: Yan, Zheng <zheng.z.yan@intel.com> (cherry picked from commit b66ac77fa7aa3ff37804918c4308a348f239af09)
-rw-r--r--src/osdc/ObjectCacher.cc6
1 files changed, 4 insertions, 2 deletions
diff --git a/src/osdc/ObjectCacher.cc b/src/osdc/ObjectCacher.cc
index 4ea9bd622d9..81d879d5006 100644
--- a/src/osdc/ObjectCacher.cc
+++ b/src/osdc/ObjectCacher.cc
@@ -898,11 +898,10 @@ void ObjectCacher::bh_write_commit(int64_t poolid, sobject_t oid, loff_t start,
ob->last_commit_tid = tid;
// waiters?
+ list<Context*> ls;
if (ob->waitfor_commit.count(tid)) {
- list<Context*> ls;
ls.splice(ls.begin(), ob->waitfor_commit[tid]);
ob->waitfor_commit.erase(tid);
- finish_contexts(cct, ls, r);
}
// is the entire object set now clean and fully committed?
@@ -914,6 +913,9 @@ void ObjectCacher::bh_write_commit(int64_t poolid, sobject_t oid, loff_t start,
oset->dirty_or_tx == 0) { // nothing dirty/tx
flush_set_callback(flush_set_callback_arg, oset);
}
+
+ if (!ls.empty())
+ finish_contexts(cct, ls, r);
}
}