From: Yan, Zheng Date: Tue, 11 Sep 2018 06:55:24 +0000 (+0800) Subject: client: update ctime when modifying file content X-Git-Tag: v12.2.9~41^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F24323%2Fhead;p=ceph.git client: update ctime when modifying file content Fixes: http://tracker.ceph.com/issues/35945 Signed-off-by: "Yan, Zheng" (cherry picked from commit 60f73cde4e04be2685eaf7cd04e03c045e1f9977) Conflicts: src/client/Client.cc - slightly different arguments to filer->zero() function call --- diff --git a/src/client/Client.cc b/src/client/Client.cc index aacc68f1fd33..b634dab84c53 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -9364,7 +9364,7 @@ success: } // mtime - in->mtime = ceph_clock_now(); + in->mtime = in->ctime = ceph_clock_now(); in->change_attr++; in->mark_caps_dirty(CEPH_CAP_FILE_WR); @@ -13045,7 +13045,7 @@ int Client::_fallocate(Fh *fh, int mode, int64_t offset, int64_t length) in->inline_data = bl; in->inline_version++; } - in->mtime = ceph_clock_now(); + in->mtime = in->ctime = ceph_clock_now(); in->change_attr++; in->mark_caps_dirty(CEPH_CAP_FILE_WR); } else { @@ -13071,7 +13071,7 @@ int Client::_fallocate(Fh *fh, int mode, int64_t offset, int64_t length) offset, length, ceph::real_clock::now(), 0, true, onfinish); - in->mtime = ceph_clock_now(); + in->mtime = in->ctime = ceph_clock_now(); in->change_attr++; in->mark_caps_dirty(CEPH_CAP_FILE_WR); @@ -13087,7 +13087,7 @@ int Client::_fallocate(Fh *fh, int mode, int64_t offset, int64_t length) uint64_t size = offset + length; if (size > in->size) { in->size = size; - in->mtime = ceph_clock_now(); + in->mtime = in->ctime = ceph_clock_now(); in->change_attr++; in->mark_caps_dirty(CEPH_CAP_FILE_WR); diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index 251dad5ff37d..5a1f8b01acd4 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -3178,6 +3178,8 @@ void Locker::_update_cap_fields(CInode *in, int dirty, MClientCaps *m, CInode::m dout(7) << " mtime " << pi->mtime << " -> " << mtime << " for " << *in << dendl; pi->mtime = mtime; + if (mtime > pi->rstat.rctime) + pi->rstat.rctime = mtime; } if (in->inode.is_file() && // ONLY if regular file size > pi->size) {