]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: take ondisk_read_lock on src_oids
authorSage Weil <sage@newdream.net>
Wed, 7 Sep 2011 20:28:21 +0000 (13:28 -0700)
committerSage Weil <sage@newdream.net>
Wed, 7 Sep 2011 22:25:18 +0000 (15:25 -0700)
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 <sage@newdream.net>
src/osd/ReplicatedPG.cc

index 81850f4bcb493d6c4ddb1596eba8f5666c1467b7..cc13a11a9c4c4646af1ac2f4a50cf2aac8d34025 100644 (file)
@@ -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<hobject_t,ObjectContext*>::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<hobject_t,ObjectContext*>::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