]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
client: inlcude inline data in FLUSHSNAP cap message 4331/head
authorYan, Zheng <zyan@redhat.com>
Mon, 20 Apr 2015 03:25:49 +0000 (11:25 +0800)
committerYan, Zheng <zyan@redhat.com>
Tue, 21 Apr 2015 05:56:17 +0000 (13:56 +0800)
Signed-off-by: Yan, Zheng <zyan@redhat.com>
src/client/Client.cc
src/client/Inode.h

index 833ad0acadb4ea97d7be00d193dedba8e0dc6b3d..618adbe342fa69ed4bc8a5473c04643d50da5344 100644 (file)
@@ -3040,7 +3040,7 @@ void Client::queue_cap_snap(Inode *in, snapid_t seq)
     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);
     
@@ -3070,6 +3070,13 @@ void Client::finish_cap_snap(Inode *in, CapSnap *capsnap, int used)
   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;
@@ -3146,6 +3153,11 @@ void Client::flush_snaps(Inode *in, bool all_again, CapSnap *again)
     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);
   }
 }
index 4a274026150fea6b5ffbe10f8a86b65322fb5f2d..4b2e32872dcac59bf76ea18d207086e6c74c96a2 100644 (file)
@@ -54,6 +54,9 @@ struct CapSnap {
   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;
@@ -61,7 +64,7 @@ struct CapSnap {
   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)
   {}