]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
uclient: factor out command cap issue checks
authorSage Weil <sage@newdream.net>
Thu, 17 Sep 2009 21:25:55 +0000 (14:25 -0700)
committerSage Weil <sage@newdream.net>
Thu, 17 Sep 2009 21:25:55 +0000 (14:25 -0700)
rdcache_gen, shared_gen

src/client/Client.cc
src/client/Client.h

index a6205e36fb6d5b0a52a0db7d56f59d62445b1da7..a3d40e972e15a6ae1f81478a345248f63bff5f7e 100644 (file)
@@ -1843,10 +1843,26 @@ void Client::_flushed(Inode *in)
 
 
 
-/** handle_file_caps
- * handle caps update from mds.  including mds to mds caps transitions.
- * do not block.
- */
+// checks common to add_update_cap, handle_cap_grant
+void Client::check_cap_issue(Inode *in, InodeCap *cap, unsigned issued)
+{
+  unsigned had = in->caps_issued();
+
+  if ((issued & CEPH_CAP_FILE_CACHE) &&
+      !(had & CEPH_CAP_FILE_CACHE))
+    in->cache_gen++;
+
+  if ((issued & CEPH_CAP_FILE_SHARED) &&
+      !(had & CEPH_CAP_FILE_SHARED)) {
+    in->shared_gen++;
+
+    if (in->is_dir()) {
+      // ...
+    }
+  }
+
+}
+
 void Client::add_update_cap(Inode *in, int mds, __u64 cap_id,
                            unsigned issued, unsigned seq, unsigned mseq, inodeno_t realm,
                            int flags)
@@ -1876,16 +1892,11 @@ void Client::add_update_cap(Inode *in, int mds, __u64 cap_id,
     cap_list.push_back(&in->cap_item);
   }
 
+  check_cap_issue(in, cap, issued);
+
   if (flags & CEPH_CAP_FLAG_AUTH)
     in->auth_cap = cap;
 
-  if ((issued & CEPH_CAP_FILE_SHARED) &&
-      !(cap->issued & CEPH_CAP_FILE_SHARED))
-    in->shared_gen++;
-  if ((issued & CEPH_CAP_FILE_CACHE) &&
-      !(cap->issued & CEPH_CAP_FILE_CACHE))
-    in->cache_gen++;
-
   unsigned old_caps = cap->issued;
   cap->cap_id = cap_id;
   cap->issued |= issued;
@@ -2493,12 +2504,7 @@ void Client::handle_cap_grant(Inode *in, int mds, InodeCap *cap, MClientCaps *m)
     kick_writers = true;
   }
 
-  if ((issued & CEPH_CAP_FILE_CACHE) &&
-      !(cap->issued & CEPH_CAP_FILE_CACHE))
-    in->cache_gen++;
-  if ((issued & CEPH_CAP_FILE_SHARED) &&
-      !(cap->issued & CEPH_CAP_FILE_SHARED))
-    in->shared_gen++;
+  check_cap_issue(in, cap, issued);
 
   // update caps
   if (old_caps & ~new_caps) { 
index 17cb7aceeca4e158a1c50fc3089996fd0de1a3bc..3a9064919a47bf5da169cd3899a0cbaf4ae599f4 100644 (file)
@@ -999,6 +999,7 @@ protected:
   void release_lease(Inode *in, Dentry *dn, int mask);
 
   // file caps
+  void check_cap_issue(Inode *in, InodeCap *cap, unsigned issued);
   void add_update_cap(Inode *in, int mds, __u64 cap_id,
                      unsigned issued, unsigned seq, unsigned mseq, inodeno_t realm,
                      int flags);