From: Sage Weil Date: Wed, 7 Sep 2011 20:28:21 +0000 (-0700) Subject: osd: take ondisk_read_lock on src_oids X-Git-Tag: v0.35~72 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=523283a5d90b7608b09700d10191b9c37959f177;p=ceph.git osd: take ondisk_read_lock on src_oids We need to take the ondisk read lock on src oids for multiobject operations (like clonerange) to ensure that written data has hit disk before we clone it elsewhere. Order of acquisition doesn't actually matter here, since the ondisk locks are all leaves in the lock dependency hierarchy. Signed-off-by: Sage Weil --- diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 81850f4bcb4..cc13a11a9c4 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -594,16 +594,25 @@ void ReplicatedPG::do_op(MOSDOp *op) uint64_t old_size = obc->obs.oi.size; eversion_t old_version = obc->obs.oi.version; - // we are acker. if (op->may_read()) { dout(10) << " taking ondisk_read_lock" << dendl; obc->ondisk_read_lock(); } + for (map::iterator p = src_obc.begin(); p != src_obc.end(); ++p) { + dout(10) << " taking ondisk_read_lock for src " << p->first << dendl; + p->second->ondisk_read_lock(); + } + int result = prepare_transaction(ctx); + if (op->may_read()) { dout(10) << " dropping ondisk_read_lock" << dendl; obc->ondisk_read_unlock(); } + for (map::iterator p = src_obc.begin(); p != src_obc.end(); ++p) { + dout(10) << " dropping ondisk_read_lock for src " << p->first << dendl; + p->second->ondisk_read_unlock(); + } if (result == -EAGAIN) { // clean up after the ctx