in->cap_snaps[seq] = capsnap;
capsnap->context = in->snaprealm->get_snap_context();
capsnap->issued = in->caps_issued();
- capsnap->dirty = in->caps_dirty(); // a bit conservative?
+ capsnap->dirty = in->caps_dirty();
capsnap->dirty_data = (used & CEPH_CAP_FILE_BUFFER);
capsnap->ctime = in->ctime;
capsnap->time_warp_seq = in->time_warp_seq;
+ capsnap->dirty |= in->caps_dirty();
+
+ if (capsnap->dirty & CEPH_CAP_FILE_WR) {
+ capsnap->inline_data = in->inline_data;
+ capsnap->inline_version = in->inline_version;
+ }
+
if (used & CEPH_CAP_FILE_BUFFER) {
ldout(cct, 10) << "finish_cap_snap " << *in << " cap_snap " << capsnap << " used " << used
<< " WRBUFFER, delaying" << dendl;
capsnap->atime.encode_timeval(&m->head.atime);
m->head.time_warp_seq = capsnap->time_warp_seq;
+ if (capsnap->dirty & CEPH_CAP_FILE_WR) {
+ m->inline_version = in->inline_version;
+ m->inline_data = in->inline_data;
+ }
+
session->con->send_message(m);
}
}
map<string,bufferptr> xattrs;
version_t xattr_version;
+ bufferlist inline_data;
+ version_t inline_version;
+
bool writing, dirty_data;
uint64_t flush_tid;
xlist<CapSnap*>::item flushing_item;
CapSnap(Inode *i)
: in(i), issued(0), dirty(0),
size(0), time_warp_seq(0), mode(0), uid(0), gid(0), xattr_version(0),
- writing(false), dirty_data(false), flush_tid(0),
+ inline_version(0), writing(false), dirty_data(false), flush_tid(0),
flushing_item(this)
{}