From 523283a5d90b7608b09700d10191b9c37959f177 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 7 Sep 2011 13:28:21 -0700 Subject: [PATCH] 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 --- src/osd/ReplicatedPG.cc | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 81850f4bcb493..cc13a11a9c4c4 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 -- 2.39.5