if (!onfinish)
onfinish = new C_NoopContext;
+
bool safe = objectcacher->commit_set(&in->oset, onfinish);
- if (safe) {
- if (onfinish) {
- onfinish->finish(0);
- delete onfinish;
- }
- /* if we're safe, there shouldn't be any refs to CEPH_CAP_FILE_BUFFER
- * unless we're buffering the entire thing. In that case, clear the bit.
- */
- if (in->cap_refs[CEPH_CAP_FILE_BUFFER]) {
- assert(in->cap_refs[CEPH_CAP_FILE_BUFFER] == 1);
- put_cap_ref(in, CEPH_CAP_FILE_BUFFER);
- }
+ if (safe && onfinish) {
+ onfinish->finish(0);
+ delete onfinish;
}
}
void Client::_flushed(Inode *in)
{
dout(10) << "_flushed " << *in << dendl;
- assert(in->cap_refs[CEPH_CAP_FILE_BUFFER] == 1);
// release clean pages too, if we dont hold RDCACHE reference
if (in->cap_refs[CEPH_CAP_FILE_CACHE] == 0)
dout(10) << "truncate_set " << oset << dendl;
+ bool were_dirty = oset->dirty_tx > 0;
+
for (vector<ObjectExtent>::iterator p = exls.begin();
p != exls.end();
++p) {
}
}
}
+
+ // did we truncate off dirty data?
+ if (flush_set_callback &&
+ were_dirty && oset->dirty_tx == 0)
+ flush_set_callback(flush_set_callback_arg, oset);
}