]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
NFS: nfs4_lookup_revalidate: only evaluate parent if it will be used.
authorNeilBrown <neilb@suse.de>
Mon, 14 Jul 2014 01:28:20 +0000 (11:28 +1000)
committerTrond Myklebust <trond.myklebust@primarydata.com>
Sun, 3 Aug 2014 21:14:11 +0000 (17:14 -0400)
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>
fs/nfs/dir.c

index 7dc88bb4296c61c0c08cd70e3eb23dfe450a4d5b..0090dae1acd3d39caf48091cb14bd73de0407f76 100644 (file)
@@ -1529,9 +1529,7 @@ EXPORT_SYMBOL_GPL(nfs_atomic_open);
 
 static int nfs4_lookup_revalidate(struct dentry *dentry, unsigned int flags)
 {
-       struct dentry *parent = NULL;
        struct inode *inode;
-       struct inode *dir;
        int ret = 0;
 
        if (flags & LOOKUP_RCU)
@@ -1545,34 +1543,35 @@ static int nfs4_lookup_revalidate(struct dentry *dentry, unsigned int flags)
                goto no_open;
 
        inode = dentry->d_inode;
-       parent = dget_parent(dentry);
-       dir = parent->d_inode;
 
        /* We can't create new files in nfs_open_revalidate(), so we
         * optimize away revalidation of negative dentries.
         */
        if (inode == NULL) {
+               struct dentry *parent;
+               struct inode *dir;
+
+               parent = dget_parent(dentry);
+               dir = parent->d_inode;
                if (!nfs_neg_need_reval(dir, dentry, flags))
                        ret = 1;
+               dput(parent);
                goto out;
        }
 
        /* NFS only supports OPEN on regular files */
        if (!S_ISREG(inode->i_mode))
-               goto no_open_dput;
+               goto no_open;
        /* We cannot do exclusive creation on a positive dentry */
        if (flags & LOOKUP_EXCL)
-               goto no_open_dput;
+               goto no_open;
 
        /* Let f_op->open() actually open (and revalidate) the file */
        ret = 1;
 
 out:
-       dput(parent);
        return ret;
 
-no_open_dput:
-       dput(parent);
 no_open:
        return nfs_lookup_revalidate(dentry, flags);
 }