aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2014-07-13 21:28:20 -0400
committerTrond Myklebust <trond.myklebust@primarydata.com>2014-08-03 17:14:11 -0400
commit49317a7fdaa462b09b9bb4942b64c3a3316bd564 (patch)
treecbdfc9d24d867498dbf22fb456d697944fb5a1b5
parent1f70ef96b176bdb3b75230ec68850d83736b387b (diff)
NFS: nfs4_lookup_revalidate: only evaluate parent if it will be used.
nfs4_lookup_revalidate only uses 'parent' to get 'dir', and only uses 'dir' if 'inode == NULL'. So we don't need to find out what 'parent' or 'dir' is until we know that 'inode' is NULL. By moving 'dget_parent' inside the 'if', we can reduce the number of call sites for 'dput(parent)'. Signed-off-by: NeilBrown <neilb@suse.de> Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
-rw-r--r--fs/nfs/dir.c17
1 files changed, 8 insertions, 9 deletions
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
index 7dc88bb4296c..0090dae1acd3 100644
--- a/fs/nfs/dir.c
+++ b/fs/nfs/dir.c
@@ -1529,9 +1529,7 @@ EXPORT_SYMBOL_GPL(nfs_atomic_open);
1529 1529
1530static int nfs4_lookup_revalidate(struct dentry *dentry, unsigned int flags) 1530static int nfs4_lookup_revalidate(struct dentry *dentry, unsigned int flags)
1531{ 1531{
1532 struct dentry *parent = NULL;
1533 struct inode *inode; 1532 struct inode *inode;
1534 struct inode *dir;
1535 int ret = 0; 1533 int ret = 0;
1536 1534
1537 if (flags & LOOKUP_RCU) 1535 if (flags & LOOKUP_RCU)
@@ -1545,34 +1543,35 @@ static int nfs4_lookup_revalidate(struct dentry *dentry, unsigned int flags)
1545 goto no_open; 1543 goto no_open;
1546 1544
1547 inode = dentry->d_inode; 1545 inode = dentry->d_inode;
1548 parent = dget_parent(dentry);
1549 dir = parent->d_inode;
1550 1546
1551 /* We can't create new files in nfs_open_revalidate(), so we 1547 /* We can't create new files in nfs_open_revalidate(), so we
1552 * optimize away revalidation of negative dentries. 1548 * optimize away revalidation of negative dentries.
1553 */ 1549 */
1554 if (inode == NULL) { 1550 if (inode == NULL) {
1551 struct dentry *parent;
1552 struct inode *dir;
1553
1554 parent = dget_parent(dentry);
1555 dir = parent->d_inode;
1555 if (!nfs_neg_need_reval(dir, dentry, flags)) 1556 if (!nfs_neg_need_reval(dir, dentry, flags))
1556 ret = 1; 1557 ret = 1;
1558 dput(parent);
1557 goto out; 1559 goto out;
1558 } 1560 }
1559 1561
1560 /* NFS only supports OPEN on regular files */ 1562 /* NFS only supports OPEN on regular files */
1561 if (!S_ISREG(inode->i_mode)) 1563 if (!S_ISREG(inode->i_mode))
1562 goto no_open_dput; 1564 goto no_open;
1563 /* We cannot do exclusive creation on a positive dentry */ 1565 /* We cannot do exclusive creation on a positive dentry */
1564 if (flags & LOOKUP_EXCL) 1566 if (flags & LOOKUP_EXCL)
1565 goto no_open_dput; 1567 goto no_open;
1566 1568
1567 /* Let f_op->open() actually open (and revalidate) the file */ 1569 /* Let f_op->open() actually open (and revalidate) the file */
1568 ret = 1; 1570 ret = 1;
1569 1571
1570out: 1572out:
1571 dput(parent);
1572 return ret; 1573 return ret;
1573 1574
1574no_open_dput:
1575 dput(parent);
1576no_open: 1575no_open:
1577 return nfs_lookup_revalidate(dentry, flags); 1576 return nfs_lookup_revalidate(dentry, flags);
1578} 1577}