From: NeilBrown <[email protected]>

As preparation for d_alloc_parallel() being allowed without the
directory locked, use d_duplicate() to duplicate a dentry for silly
rename.

Signed-off-by: NeilBrown <[email protected]>
---
 fs/nfs/dir.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
index 4b73ec59bbcc..655a1e8467f7 100644
--- a/fs/nfs/dir.c
+++ b/fs/nfs/dir.c
@@ -2781,11 +2781,9 @@ int nfs_rename(struct mnt_idmap *idmap, struct inode 
*old_dir,
                        spin_unlock(&new_dentry->d_lock);
 
                        /* copy the target dentry's name */
-                       dentry = d_alloc(new_dentry->d_parent,
-                                        &new_dentry->d_name);
+                       dentry = d_duplicate(new_dentry);
                        if (!dentry)
                                goto out;
-
                        /* silly-rename the existing target ... */
                        err = nfs_sillyrename(new_dir, new_dentry);
                        if (err)
@@ -2850,8 +2848,10 @@ int nfs_rename(struct mnt_idmap *idmap, struct inode 
*old_dir,
                nfs_dentry_handle_enoent(old_dentry);
 
        /* new dentry created? */
-       if (dentry)
+       if (dentry) {
+               d_lookup_done(dentry);
                dput(dentry);
+       }
        return error;
 }
 EXPORT_SYMBOL_GPL(nfs_rename);
-- 
2.50.0.107.gf914562f5916.dirty


Reply via email to