]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
Locker: accept ctime updates from clients without dirty write caps 2606/head
authorGreg Farnum <greg@inktank.com>
Mon, 29 Sep 2014 23:10:36 +0000 (16:10 -0700)
committerGreg Farnum <greg@inktank.com>
Tue, 30 Sep 2014 17:24:51 +0000 (10:24 -0700)
The ctime changes any time the inode does. That can happen even without
the file itself having changed, so we'd better accept the update whenever
the auth caps have dirtied, without worrying about the file caps!

Fixes: #9514
Backport: firefly

Signed-off-by: Greg Farnum <greg@inktank.com>
Reviewed-by: Sage Weil <sage@redhat.com>
Reviewed-by: John Spray <john.spray@redhat.com>
src/mds/Locker.cc

index c76582255c8991954b825267e6fa19a4442a37e0..ba92196583a65b8881d2ef319df6bec088b63b7a 100644 (file)
@@ -2865,11 +2865,18 @@ void Locker::_do_snap_update(CInode *in, snapid_t snap, int dirty, snapid_t foll
 
 void Locker::_update_cap_fields(CInode *in, int dirty, MClientCaps *m, inode_t *pi)
 {
+
+  utime_t ctime = m->get_ctime();
+  if (dirty && ctime > pi->ctime) {
+    dout(7) << "  ctime " << pi->ctime << " -> " << ctime
+           << " for " << *in << dendl;
+    pi->ctime = ctime;
+  }
+
   // file
   if (dirty & (CEPH_CAP_FILE_EXCL|CEPH_CAP_FILE_WR)) {
     utime_t atime = m->get_atime();
     utime_t mtime = m->get_mtime();
-    utime_t ctime = m->get_ctime();
     uint64_t size = m->get_size();
     version_t inline_version = m->inline_version;
     
@@ -2879,11 +2886,6 @@ void Locker::_update_cap_fields(CInode *in, int dirty, MClientCaps *m, inode_t *
              << " for " << *in << dendl;
       pi->mtime = mtime;
     }
-    if (ctime > pi->ctime) {
-      dout(7) << "  ctime " << pi->ctime << " -> " << ctime
-             << " for " << *in << dendl;
-      pi->ctime = ctime;
-    }
     if (in->inode.is_file() &&   // ONLY if regular file
        size > pi->size) {
       dout(7) << "  size " << pi->size << " -> " << size