flush,
cap->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 = in->cap_dirtier_uid;
+ m->caller_gid = in->cap_dirtier_gid;
m->head.issue_seq = cap->issue_seq;
m->set_tid(flush_tid);
sync_cond.Signal();
}
+ if (!dirty) {
+ in->cap_dirtier_uid = -1;
+ in->cap_dirtier_gid = -1;
+ }
+
if (!cleaned) {
ldout(cct, 10) << " tid " << m->get_client_tid() << " != any cap bit tids" << dendl;
} else {
is_quota_bytes_exceeded(in, (unsigned long)attr->st_size - in->size)) {
return -EDQUOT;
}
+
+ if (uid < 0) {
+ uid = get_uid();
+ gid = get_gid();
+ }
+
// make the change locally?
- if ((uid >= 0 && user_id >= 0 && uid != user_id) ||
- (gid >= 0 && group_id >= 0 && gid != group_id)) {
+ if ((in->cap_dirtier_uid >= 0 && uid != in->cap_dirtier_uid) ||
+ (in->cap_dirtier_gid >= 0 && gid != in->cap_dirtier_gid)) {
+ ldout(cct, 10) << __func__ << " caller " << uid << ":" << gid
+ << " != cap dirtier " << in->cap_dirtier_uid << ":"
+ << in->cap_dirtier_gid << ", forcing sync setattr"
+ << dendl;
if (!mask)
mask |= CEPH_SETATTR_CTIME;
goto force_request;
}
- if (uid < 0) {
- uid = geteuid();
- gid = getegid();
- }
-
if (!mask) {
// caller just needs us to bump the ctime
in->ctime = ceph_clock_now(cct);
// per-mds caps
map<mds_rank_t, Cap*> caps; // mds -> Cap
Cap *auth_cap;
- __u32 cap_dirtier_uid;
- __u32 cap_dirtier_gid;
+ int64_t cap_dirtier_uid;
+ int64_t cap_dirtier_gid;
unsigned dirty_caps, flushing_caps;
std::map<ceph_tid_t, int> flushing_cap_tids;
int shared_gen, cache_gen;
flags(0),
qtree(NULL),
dir_hashed(false), dir_replicated(false), auth_cap(NULL),
+ cap_dirtier_uid(-1), cap_dirtier_gid(-1),
dirty_caps(0), flushing_caps(0), shared_gen(0), cache_gen(0),
snap_caps(0), snap_cap_refs(0),
cap_item(this), flushing_cap_item(this),