From: Patrick Donnelly Date: Tue, 30 Jan 2018 23:17:54 +0000 (-0800) Subject: Merge PR #19833 into master X-Git-Tag: wip-pdonnell-testing-20180317.202121~444 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=6c6e25f8eea9c6db4de52913df6a261c02d534dc;p=ceph-ci.git Merge PR #19833 into master * refs/pull/19833/head: common: add C_SaferCond ctor with name argument Client: use C_SaferCond for "_flush_range" client: use C_SaferCond for _fallocate and ll_write_block client: use C_SaferCond for _sync_fs and _fsync client: use C_SaferCond in Client::_write client: use C_SaferCond for _read_sync client: use C_SaferCond in _read_async client: use C_SaferCond for "Client::_read" Reviewed-by: Patrick Donnelly --- 6c6e25f8eea9c6db4de52913df6a261c02d534dc diff --cc src/client/Client.cc index 0b8256b43fa,147ee1beaf1..de6064dda8d --- a/src/client/Client.cc +++ b/src/client/Client.cc @@@ -8832,21 -8828,17 +8819,17 @@@ success done: // done! - if (onuninline) { + if (nullptr != onuninline) { client_lock.Unlock(); - uninline_flock.Lock(); - while (!uninline_done) - uninline_cond.Wait(uninline_flock); - uninline_flock.Unlock(); + int ret = onuninline->wait(); client_lock.Lock(); - - if (uninline_ret >= 0 || uninline_ret == -ECANCELED) { + if (ret >= 0 || ret == -ECANCELED) { in->inline_data.clear(); in->inline_version = CEPH_INLINE_NONE; - mark_caps_dirty(in, CEPH_CAP_FILE_WR); + in->mark_caps_dirty(CEPH_CAP_FILE_WR); check_caps(in, 0); } else - r = uninline_ret; + r = ret; } if (have) @@@ -10082,16 -10035,14 +10026,14 @@@ int Client::test_dentry_handling(bool c int Client::_sync_fs() { - ldout(cct, 10) << "_sync_fs" << dendl; + ldout(cct, 10) << __func__ << dendl; // flush file data - Mutex lock("Client::_fsync::lock"); - Cond cond; - bool flush_done = false; - if (cct->_conf->client_oc) - objectcacher->flush_all(new C_SafeCond(&lock, &cond, &flush_done)); - else - flush_done = true; + std::unique_ptr cond = nullptr; + if (cct->_conf->client_oc) { + cond.reset(new C_SaferCond("Client::_sync_fs:lock")); + objectcacher->flush_all(cond.get()); + } // flush caps flush_caps_sync(); @@@ -12956,20 -12879,14 +12876,14 @@@ int Client::_fallocate(Fh *fh, int mode } in->mtime = ceph_clock_now(); in->change_attr++; - mark_caps_dirty(in, CEPH_CAP_FILE_WR); + in->mark_caps_dirty(CEPH_CAP_FILE_WR); } else { if (in->inline_version < CEPH_INLINE_NONE) { - onuninline = new C_SafeCond(&uninline_flock, - &uninline_cond, - &uninline_done, - &uninline_ret); - uninline_data(in, onuninline); + onuninline.reset(new C_SaferCond("Client::_fallocate_uninline_data flock")); + uninline_data(in, onuninline.get()); } - Mutex flock("Client::_punch_hole flock"); - Cond cond; - bool done = false; - Context *onfinish = new C_SafeCond(&flock, &cond, &done); + C_SaferCond onfinish("Client::_punch_hole flock"); unsafe_sync_write++; get_cap_ref(in, CEPH_CAP_FILE_BUFFER); @@@ -12979,16 -12896,13 +12893,13 @@@ in->snaprealm->get_snap_context(), offset, length, ceph::real_clock::now(), - 0, true, onfinish); + 0, true, &onfinish); in->mtime = ceph_clock_now(); in->change_attr++; - mark_caps_dirty(in, CEPH_CAP_FILE_WR); + in->mark_caps_dirty(CEPH_CAP_FILE_WR); client_lock.Unlock(); - flock.Lock(); - while (!done) - cond.Wait(flock); - flock.Unlock(); + onfinish.wait(); client_lock.Lock(); _sync_write_commit(in); } @@@ -13008,21 -12922,18 +12919,18 @@@ } } - if (onuninline) { + if (nullptr != onuninline) { client_lock.Unlock(); - uninline_flock.Lock(); - while (!uninline_done) - uninline_cond.Wait(uninline_flock); - uninline_flock.Unlock(); + int ret = onuninline->wait(); client_lock.Lock(); - if (uninline_ret >= 0 || uninline_ret == -ECANCELED) { + if (ret >= 0 || ret == -ECANCELED) { in->inline_data.clear(); in->inline_version = CEPH_INLINE_NONE; - mark_caps_dirty(in, CEPH_CAP_FILE_WR); + in->mark_caps_dirty(CEPH_CAP_FILE_WR); check_caps(in, 0); } else - r = uninline_ret; + r = ret; } put_cap_ref(in, CEPH_CAP_FILE_WR);