}
}
- if (in->caps_issued_mask(CEPH_CAP_FILE_EXCL)) {
- if (mask & (CEPH_SETATTR_MTIME|CEPH_SETATTR_ATIME)) {
- if (mask & CEPH_SETATTR_MTIME)
- in->mtime = utime_t(stx->stx_mtime);
- if (mask & CEPH_SETATTR_ATIME)
- in->atime = utime_t(stx->stx_atime);
+ if (mask & CEPH_SETATTR_MTIME) {
+ if (in->caps_issued_mask(CEPH_CAP_FILE_EXCL)) {
+ in->mtime = utime_t(stx->stx_mtime);
+ in->ctime = ceph_clock_now();
+ in->cap_dirtier_uid = perms.uid();
+ in->cap_dirtier_gid = perms.gid();
+ in->time_warp_seq++;
+ in->mark_caps_dirty(CEPH_CAP_FILE_EXCL);
+ mask &= ~CEPH_SETATTR_MTIME;
+ } else if (in->caps_issued_mask(CEPH_CAP_FILE_WR) &&
+ utime_t(stx->stx_mtime) > in->mtime) {
+ in->mtime = utime_t(stx->stx_mtime);
+ in->ctime = ceph_clock_now();
+ in->cap_dirtier_uid = perms.uid();
+ in->cap_dirtier_gid = perms.gid();
+ in->mark_caps_dirty(CEPH_CAP_FILE_WR);
+ mask &= ~CEPH_SETATTR_MTIME;
+ } else if (!in->caps_issued_mask(CEPH_CAP_FILE_SHARED) ||
+ in->mtime != utime_t(stx->stx_mtime)) {
+ args.setattr.mtime = utime_t(stx->stx_mtime);
+ inode_drop |= CEPH_CAP_FILE_SHARED | CEPH_CAP_FILE_RD |
+ CEPH_CAP_FILE_WR;
+ } else {
+ mask &= ~CEPH_SETATTR_MTIME;
+ }
+ }
+
+ if (mask & CEPH_SETATTR_ATIME) {
+ if (in->caps_issued_mask(CEPH_CAP_FILE_EXCL)) {
+ in->atime = utime_t(stx->stx_atime);
in->ctime = ceph_clock_now();
in->cap_dirtier_uid = perms.uid();
in->cap_dirtier_gid = perms.gid();
in->time_warp_seq++;
in->mark_caps_dirty(CEPH_CAP_FILE_EXCL);
- mask &= ~(CEPH_SETATTR_MTIME|CEPH_SETATTR_ATIME);
+ mask &= ~CEPH_SETATTR_ATIME;
+ } else if (in->caps_issued_mask(CEPH_CAP_FILE_WR) &&
+ utime_t(stx->stx_atime) > in->atime) {
+ in->atime = utime_t(stx->stx_atime);
+ in->ctime = ceph_clock_now();
+ in->cap_dirtier_uid = perms.uid();
+ in->cap_dirtier_gid = perms.gid();
+ in->mark_caps_dirty(CEPH_CAP_FILE_WR);
+ mask &= ~CEPH_SETATTR_ATIME;
+ } else if (!in->caps_issued_mask(CEPH_CAP_FILE_SHARED) ||
+ in->atime != utime_t(stx->stx_atime)) {
+ args.setattr.atime = utime_t(stx->stx_atime);
+ inode_drop |= CEPH_CAP_FILE_CACHE | CEPH_CAP_FILE_RD |
+ CEPH_CAP_FILE_WR;
+ } else {
+ mask &= ~CEPH_SETATTR_ATIME;
}
}
+
if (!mask) {
in->change_attr++;
return 0;
req->head.args = args;
req->inode_drop = inode_drop;
-
- if (mask & CEPH_SETATTR_MTIME) {
- req->head.args.setattr.mtime = utime_t(stx->stx_mtime);
- req->inode_drop |= CEPH_CAP_FILE_SHARED | CEPH_CAP_FILE_RD |
- CEPH_CAP_FILE_WR;
- }
- if (mask & CEPH_SETATTR_ATIME) {
- req->head.args.setattr.atime = utime_t(stx->stx_atime);
- req->inode_drop |= CEPH_CAP_FILE_CACHE | CEPH_CAP_FILE_RD |
- CEPH_CAP_FILE_WR;
- }
req->head.args.setattr.mask = mask;
-
req->regetattr_mask = mask;
int res = make_request(req, perms, inp);