From: Yan, Zheng Date: Thu, 12 Sep 2013 02:36:39 +0000 (+0800) Subject: osdc/ObjectCacher: finish contexts after dropping object reference X-Git-Tag: v0.61.9~4 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=33da08f683d40f33061cefa0cf145f3ff21ea089;p=ceph.git 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 (cherry picked from commit b66ac77fa7aa3ff37804918c4308a348f239af09) --- 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 ls; if (ob->waitfor_commit.count(tid)) { - list 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); } }