]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
client: add cap_dirtier_uid/gid to CapSnap 20200/head
authorJeff Layton <jlayton@redhat.com>
Fri, 26 Jan 2018 15:23:58 +0000 (10:23 -0500)
committerJeff Layton <jlayton@redhat.com>
Fri, 26 Jan 2018 15:23:58 +0000 (10:23 -0500)
Set new fields to whatever the inode has at the time that we create the
CapSnap. In the event that it was unset at the time of the creation and
becomes dirty afterward, we set it again at finish.

This ensures that we send a valid uid/gid in the event that it had dirty
caps at any point during that period.

Tracker: http://tracker.ceph.com/issues/22801
Signed-off-by: Jeff Layton <jlayton@redhat.com>
src/client/Client.cc
src/client/Inode.h

index 9a05d4f5b1943cd6ac17d0d0a371c3f02fd52c5d..a7f84be9ff9ad5fab917c0bc5cce8a9fd133c9db 100644 (file)
@@ -3504,6 +3504,8 @@ void Client::queue_cap_snap(Inode *in, SnapContext& old_snapc)
     capsnap.btime = in->btime;
     capsnap.xattrs = in->xattrs;
     capsnap.xattr_version = in->xattr_version;
+    capsnap.cap_dirtier_uid = in->cap_dirtier_uid;
+    capsnap.cap_dirtier_gid = in->cap_dirtier_gid;
  
     if (used & CEPH_CAP_FILE_WR) {
       ldout(cct, 10) << "queue_cap_snap WR used on " << *in << dendl;
@@ -3525,9 +3527,14 @@ void Client::finish_cap_snap(Inode *in, CapSnap &capsnap, int used)
   capsnap.ctime = in->ctime;
   capsnap.time_warp_seq = in->time_warp_seq;
   capsnap.change_attr = in->change_attr;
-
   capsnap.dirty |= in->caps_dirty();
 
+  /* Only reset it if it wasn't set before */
+  if (capsnap.cap_dirtier_uid == -1) {
+    capsnap.cap_dirtier_uid = in->cap_dirtier_uid;
+    capsnap.cap_dirtier_gid = in->cap_dirtier_gid;
+  }
+
   if (capsnap.dirty & CEPH_CAP_FILE_WR) {
     capsnap.inline_data = in->inline_data;
     capsnap.inline_version = in->inline_version;
@@ -3586,10 +3593,8 @@ void Client::flush_snaps(Inode *in, bool all_again)
 
     MClientCaps *m = new MClientCaps(CEPH_CAP_OP_FLUSHSNAP, in->ino, in->snaprealm->ino, 0, mseq,
                                     cap_epoch_barrier);
-    if (user_id >= 0)
-      m->caller_uid = user_id;
-    if (group_id >= 0)
-      m->caller_gid = group_id;
+    m->caller_uid = capsnap.cap_dirtier_uid;
+    m->caller_gid = capsnap.cap_dirtier_gid;
 
     m->set_client_tid(capsnap.flush_tid);
     m->head.snap_follows = p.first;
index cbffaec6531d17dd6527628eff6a655a56e90385..04d3ff312a63ee2769704ac7f1bcfecc313da82f 100644 (file)
@@ -93,10 +93,14 @@ struct CapSnap {
   bool writing, dirty_data;
   uint64_t flush_tid;
 
+  int64_t cap_dirtier_uid;
+  int64_t cap_dirtier_gid;
+
   explicit CapSnap(Inode *i)
     : in(i), issued(0), dirty(0), size(0), time_warp_seq(0), change_attr(0),
       mode(0), uid(0), gid(0), xattr_version(0), inline_version(0),
-      writing(false), dirty_data(false), flush_tid(0)
+      writing(false), dirty_data(false), flush_tid(0), cap_dirtier_uid(-1),
+      cap_dirtier_gid(-1)
   {}
 
   void dump(Formatter *f) const;