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)
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<C_SaferCond> 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();
}
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);
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);
}
}
}
- 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);