From ec490d878d46c42392f114288afd06e7da548ab3 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 4 Jul 2012 15:11:21 -0700 Subject: [PATCH] client: fix locking for SafeCond users Need to wait on flock, not client_lock. Signed-off-by: Sage Weil --- src/client/Client.cc | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index d4282285a3fcf..9c1ee5011640b 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 -- 2.39.5