From: Sage Weil Date: Thu, 17 Sep 2009 22:56:43 +0000 (-0700) Subject: kclient: avoid no-op dir cap release when no dentry lease X-Git-Tag: v0.15~44 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=28b2df36a2fa66cd46d12808bb6261b8f2255c3e;p=ceph.git kclient: avoid no-op dir cap release when no dentry lease Make release logic a bit smarter: only force inclusion of dir cap release if there is a dentry lease to start with. --- diff --git a/src/kernel/caps.c b/src/kernel/caps.c index c6d9ab72fde..06a3b5d3ed0 100644 --- a/src/kernel/caps.c +++ b/src/kernel/caps.c @@ -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",