]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
kclient: avoid no-op dir cap release when no dentry lease
authorSage Weil <sage@newdream.net>
Thu, 17 Sep 2009 22:56:43 +0000 (15:56 -0700)
committerSage Weil <sage@newdream.net>
Thu, 17 Sep 2009 22:56:43 +0000 (15:56 -0700)
Make release logic a bit smarter: only force inclusion of dir
cap release if there is a dentry lease to start with.

src/kernel/caps.c

index c6d9ab72fded31356fb149e5df7e6aef31c90e5a..06a3b5d3ed012eb45957efb175e1973ea84290df 100644 (file)
@@ -2770,11 +2770,22 @@ int ceph_encode_dentry_release(void **p, struct dentry *dentry,
        struct inode *dir = dentry->d_parent->d_inode;
        struct ceph_mds_request_release *rel = *p;
        struct ceph_dentry_info *di = ceph_dentry(dentry);
+       int force = 0;
        int ret;
 
-       ret = ceph_encode_inode_release(p, dir, mds, drop, unless, 1);
+       /*
+        * force an record for the directory caps if we have a dentry lease.
+        * this is racy (can't take i_lock and d_lock together), but it
+        * doesn't have to be perfect; the mds will revoke anything we don't
+        * release.
+        */
+       spin_lock(&dentry->d_lock);
+       if (di->lease_session && di->lease_session->s_mds == mds)
+               force = 1;
+       spin_unlock(&dentry->d_lock);
+
+       ret = ceph_encode_inode_release(p, dir, mds, drop, unless, force);
 
-       /* drop dentry lease too? */
        spin_lock(&dentry->d_lock);
        if (ret && di->lease_session && di->lease_session->s_mds == mds) {
                dout("encode_dentry_release %p mds%d seq %d\n",