From: Sage Weil Date: Thu, 17 Sep 2009 21:25:55 +0000 (-0700) Subject: uclient: factor out command cap issue checks X-Git-Tag: v0.15~48 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=b53f9a4efa3195bb680dbd715dbe052c0fd21d19;p=ceph.git uclient: factor out command cap issue checks rdcache_gen, shared_gen --- diff --git a/src/client/Client.cc b/src/client/Client.cc index a6205e36fb6d..a3d40e972e15 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -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) { diff --git a/src/client/Client.h b/src/client/Client.h index 17cb7aceeca4..3a9064919a47 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -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);