From: Nishtha Rai Date: Wed, 5 Aug 2015 14:05:39 +0000 (+0530) Subject: add caps_dirty to setattr X-Git-Tag: v10.0.0~123^2~21 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=43f50c73edbba63a6a9dd64c337619634413039a;p=ceph.git add caps_dirty to setattr Signed-off-by: Nishtha Rai --- diff --git a/src/client/Client.cc b/src/client/Client.cc index b62dbdfedf6a..b28385f31a15 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -5799,9 +5799,16 @@ int Client::_setattr(Inode *in, struct stat *attr, int mask, int uid, int gid, 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); + in->cap_dirtier_uid = uid; + in->cap_dirtier_gid = gid; if (issued & CEPH_CAP_AUTH_EXCL) mark_caps_dirty(in, CEPH_CAP_AUTH_EXCL); else if (issued & CEPH_CAP_FILE_EXCL) @@ -5815,6 +5822,8 @@ int Client::_setattr(Inode *in, struct stat *attr, int mask, int uid, int gid, if (in->caps_issued_mask(CEPH_CAP_AUTH_EXCL)) { if (mask & CEPH_SETATTR_MODE) { in->ctime = ceph_clock_now(cct); + in->cap_dirtier_uid = uid; + in->cap_dirtier_gid = gid; in->mode = (in->mode & ~07777) | (attr->st_mode & 07777); mark_caps_dirty(in, CEPH_CAP_AUTH_EXCL); mask &= ~CEPH_SETATTR_MODE; @@ -5822,6 +5831,8 @@ int Client::_setattr(Inode *in, struct stat *attr, int mask, int uid, int gid, } if (mask & CEPH_SETATTR_UID) { in->ctime = ceph_clock_now(cct); + in->cap_dirtier_uid = uid; + in->cap_dirtier_gid = gid; in->uid = attr->st_uid; mark_caps_dirty(in, CEPH_CAP_AUTH_EXCL); mask &= ~CEPH_SETATTR_UID; @@ -5829,6 +5840,8 @@ int Client::_setattr(Inode *in, struct stat *attr, int mask, int uid, int gid, } if (mask & CEPH_SETATTR_GID) { in->ctime = ceph_clock_now(cct); + in->cap_dirtier_uid = uid; + in->cap_dirtier_gid = gid; in->gid = attr->st_gid; mark_caps_dirty(in, CEPH_CAP_AUTH_EXCL); mask &= ~CEPH_SETATTR_GID; @@ -5842,6 +5855,8 @@ int Client::_setattr(Inode *in, struct stat *attr, int mask, int uid, int gid, if (mask & CEPH_SETATTR_ATIME) in->atime = utime_t(stat_get_atime_sec(attr), stat_get_atime_nsec(attr)); in->ctime = ceph_clock_now(cct); + in->cap_dirtier_uid = uid; + in->cap_dirtier_gid = gid; in->time_warp_seq++; mark_caps_dirty(in, CEPH_CAP_FILE_EXCL); mask &= ~(CEPH_SETATTR_MTIME|CEPH_SETATTR_ATIME); diff --git a/src/client/Inode.h b/src/client/Inode.h index 07061e286c38..b4d1475ad548 100644 --- a/src/client/Inode.h +++ b/src/client/Inode.h @@ -234,6 +234,8 @@ struct Inode { // per-mds caps map caps; // mds -> Cap Cap *auth_cap; + __u32 cap_dirtier_uid; + __u32 cap_dirtier_gid; unsigned dirty_caps, flushing_caps; std::map flushing_cap_tids; int shared_gen, cache_gen;