From: dongdong tao Date: Sun, 7 Jan 2018 13:49:44 +0000 (+0800) Subject: client: use C_SaferCond in _read_async X-Git-Tag: v13.0.2~401^2~6 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=0b42aa9f3b793822cd18d1a34e591f1268b532b1;p=ceph.git client: use C_SaferCond in _read_async Signed-off-by: dongdong tao --- diff --git a/src/client/Client.cc b/src/client/Client.cc index 83b53d99fa7f..664953c8b150 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -8894,26 +8894,16 @@ int Client::_read_async(Fh *f, uint64_t off, uint64_t len, bufferlist *bl) << " max_periods=" << conf->client_readahead_max_periods << dendl; // read (and possibly block) - int r, rvalue = 0; - Mutex flock("Client::_read_async flock"); - Cond cond; - bool done = false; - Context *onfinish = new C_SafeCond(&flock, &cond, &done, &rvalue); + int r = 0; + C_SaferCond onfinish("Client::_read_async flock"); r = objectcacher->file_read(&in->oset, &in->layout, in->snapid, - off, len, bl, 0, onfinish); + off, len, bl, 0, &onfinish); if (r == 0) { get_cap_ref(in, CEPH_CAP_FILE_CACHE); client_lock.Unlock(); - flock.Lock(); - while (!done) - cond.Wait(flock); - flock.Unlock(); + r = onfinish.wait(); client_lock.Lock(); put_cap_ref(in, CEPH_CAP_FILE_CACHE); - r = rvalue; - } else { - // it was cached. - delete onfinish; } if(f->readahead.get_min_readahead_size() > 0) {