NFS: fix nfs_path in case of a rename retry
authorAshish Sangwan <ashishsangwan2@gmail.com>
Mon, 5 Oct 2020 09:22:43 +0000 (02:22 -0700)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Tue, 6 Oct 2020 14:21:18 +0000 (10:21 -0400)
We are generating incorrect path in case of rename retry because
we are restarting from wrong dentry. We should restart from the
dentry which was received in the call to nfs_path.

CC: stable@vger.kernel.org
Signed-off-by: Ashish Sangwan <ashishsangwan2@gmail.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
fs/nfs/namespace.c

index 6b063227e34e9de4cbb52bfcbac46cc0d69b309a..2bcbe38afe2e723be4b434b81f4405fa4fdad3ff 100644 (file)
@@ -32,9 +32,9 @@ int nfs_mountpoint_expiry_timeout = 500 * HZ;
 /*
  * nfs_path - reconstruct the path given an arbitrary dentry
  * @base - used to return pointer to the end of devname part of path
- * @dentry - pointer to dentry
+ * @dentry_in - pointer to dentry
  * @buffer - result buffer
- * @buflen - length of buffer
+ * @buflen_in - length of buffer
  * @flags - options (see below)
  *
  * Helper function for constructing the server pathname
@@ -49,15 +49,19 @@ int nfs_mountpoint_expiry_timeout = 500 * HZ;
  *                    the original device (export) name
  *                    (if unset, the original name is returned verbatim)
  */
-char *nfs_path(char **p, struct dentry *dentry, char *buffer, ssize_t buflen,
-              unsigned flags)
+char *nfs_path(char **p, struct dentry *dentry_in, char *buffer,
+              ssize_t buflen_in, unsigned flags)
 {
        char *end;
        int namelen;
        unsigned seq;
        const char *base;
+       struct dentry *dentry;
+       ssize_t buflen;
 
 rename_retry:
+       buflen = buflen_in;
+       dentry = dentry_in;
        end = buffer+buflen;
        *--end = '\0';
        buflen--;