Merge tag 'driver-core-5.6-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-microblaze.git] / fs / nfs / dir.c
index 0adfd88..e180033 100644 (file)
@@ -1669,10 +1669,8 @@ static int nfs4_lookup_revalidate(struct dentry *dentry, unsigned int flags)
 
 #endif /* CONFIG_NFSV4 */
 
-/*
- * Code common to create, mkdir, and mknod.
- */
-int nfs_instantiate(struct dentry *dentry, struct nfs_fh *fhandle,
+struct dentry *
+nfs_add_or_obtain(struct dentry *dentry, struct nfs_fh *fhandle,
                                struct nfs_fattr *fattr,
                                struct nfs4_label *label)
 {
@@ -1680,13 +1678,10 @@ int nfs_instantiate(struct dentry *dentry, struct nfs_fh *fhandle,
        struct inode *dir = d_inode(parent);
        struct inode *inode;
        struct dentry *d;
-       int error = -EACCES;
+       int error;
 
        d_drop(dentry);
 
-       /* We may have been initialized further down */
-       if (d_really_is_positive(dentry))
-               goto out;
        if (fhandle->size == 0) {
                error = NFS_PROTO(dir)->lookup(dir, &dentry->d_name, fhandle, fattr, NULL);
                if (error)
@@ -1702,18 +1697,32 @@ int nfs_instantiate(struct dentry *dentry, struct nfs_fh *fhandle,
        }
        inode = nfs_fhget(dentry->d_sb, fhandle, fattr, label);
        d = d_splice_alias(inode, dentry);
-       if (IS_ERR(d)) {
-               error = PTR_ERR(d);
-               goto out_error;
-       }
-       dput(d);
 out:
        dput(parent);
-       return 0;
+       return d;
 out_error:
        nfs_mark_for_revalidate(dir);
-       dput(parent);
-       return error;
+       d = ERR_PTR(error);
+       goto out;
+}
+EXPORT_SYMBOL_GPL(nfs_add_or_obtain);
+
+/*
+ * Code common to create, mkdir, and mknod.
+ */
+int nfs_instantiate(struct dentry *dentry, struct nfs_fh *fhandle,
+                               struct nfs_fattr *fattr,
+                               struct nfs4_label *label)
+{
+       struct dentry *d;
+
+       d = nfs_add_or_obtain(dentry, fhandle, fattr, label);
+       if (IS_ERR(d))
+               return PTR_ERR(d);
+
+       /* Callers don't care */
+       dput(d);
+       return 0;
 }
 EXPORT_SYMBOL_GPL(nfs_instantiate);