summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/client/Client.cc15
-rw-r--r--src/client/Inode.h6
2 files changed, 15 insertions, 6 deletions
diff --git a/src/client/Client.cc b/src/client/Client.cc
index 9a05d4f5b19..a7f84be9ff9 100644
--- a/src/client/Client.cc
+++ b/src/client/Client.cc
@@ -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;
diff --git a/src/client/Inode.h b/src/client/Inode.h
index cbffaec6531..04d3ff312a6 100644
--- a/src/client/Inode.h
+++ b/src/client/Inode.h
@@ -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;