]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
client: fix wrong lock logic of ll_read_block() method
authorxie xingguo <xie.xingguo@zte.com.cn>
Wed, 8 Jun 2016 01:54:20 +0000 (09:54 +0800)
committerxie xingguo <xie.xingguo@zte.com.cn>
Wed, 8 Jun 2016 10:25:20 +0000 (18:25 +0800)
Signed-off-by: xie xingguo <xie.xingguo@zte.com.cn>
src/client/Client.cc

index 31cc936bce8dc43d0e2cf3d5756b00db7af4cf61..880df16a65b7c36627bcbafd4acc934474c77675 100644 (file)
@@ -11274,13 +11274,10 @@ int Client::ll_read_block(Inode *in, uint64_t blockid,
                          file_layout_t* layout)
 {
   Mutex::Locker lock(client_lock);
-  Mutex flock("Client::ll_read_block flock");
-  Cond cond;
   vinodeno_t vino = ll_get_vino(in);
   object_t oid = file_object_t(vino.ino, blockid);
   int r = 0;
-  bool done = false;
-  Context *onfinish = new C_SafeCond(&flock, &cond, &done, &r);
+  C_SaferCond cond;
   bufferlist bl;
 
   objecter->read(oid,
@@ -11290,10 +11287,11 @@ int Client::ll_read_block(Inode *in, uint64_t blockid,
                 vino.snapid,
                 &bl,
                 CEPH_OSD_FLAG_READ,
-                onfinish);
+                &cond);
 
-  while (!done)
-      cond.Wait(client_lock);
+  client_lock.Unlock();
+  r = cond.wait();
+  client_lock.Lock(); // lock is going to unlock on exit.
 
   if (r >= 0) {
       bl.copy(0, bl.length(), buf);