]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
client: fix locking for SafeCond users
authorSage Weil <sage@inktank.com>
Wed, 4 Jul 2012 22:11:21 +0000 (15:11 -0700)
committerSage Weil <sage@inktank.com>
Wed, 11 Jul 2012 01:17:43 +0000 (18:17 -0700)
Need to wait on flock, not client_lock.

Signed-off-by: Sage Weil <sage@inktank.com>
src/client/Client.cc

index d4282285a3fcfd33bbf31b2190d169627ca5ff61..9c1ee5011640b3b4a38514be84f8350494cb71fd 100644 (file)
@@ -5143,8 +5143,12 @@ int Client::_read_async(Fh *f, uint64_t off, uint64_t len, bufferlist *bl)
   r = objectcacher->file_read(&in->oset, &in->layout, in->snapid,
                               off, len, bl, 0, onfinish);
   if (r == 0) {
+    client_lock.Unlock();
+    flock.Lock();
     while (!done) 
-      cond.Wait(client_lock);
+      cond.Wait(flock);
+    flock.Unlock();
+    client_lock.Lock();
     r = rvalue;
   } else {
     // it was cached.
@@ -5175,8 +5179,12 @@ int Client::_read_sync(Fh *f, uint64_t off, uint64_t len, bufferlist *bl)
                      pos, left, &tbl, 0,
                      in->truncate_size, in->truncate_seq,
                      onfinish);
+    client_lock.Unlock();
+    flock.Lock();
     while (!done)
-      cond.Wait(client_lock);
+      cond.Wait(flock);
+    flock.Unlock();
+    client_lock.Lock();
 
     if (r < 0)
       return r;
@@ -5342,8 +5350,12 @@ int Client::_write(Fh *f, int64_t offset, uint64_t size, const char *buf)
                       in->truncate_size, in->truncate_seq,
                       onfinish, onsafe);
     
+    client_lock.Unlock();
+    flock.Lock();
     while (!done)
-      cond.Wait(client_lock);
+      cond.Wait(flock);
+    flock.Unlock();
+    client_lock.Lock();
   }
 
   // time