From: Sage Weil Date: Wed, 4 Jul 2012 22:11:21 +0000 (-0700) Subject: client: fix locking for SafeCond users X-Git-Tag: v0.49~25 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=ec490d878d46c42392f114288afd06e7da548ab3;p=ceph.git client: fix locking for SafeCond users Need to wait on flock, not client_lock. Signed-off-by: Sage Weil --- diff --git a/src/client/Client.cc b/src/client/Client.cc index d4282285a3fc..9c1ee5011640 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -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