summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorTrond Myklebust <trond.myklebust@hammerspace.com>2021-07-07 22:08:32 -0400
committerTrond Myklebust <trond.myklebust@hammerspace.com>2021-10-03 20:49:05 -0400
commit342a67f0884293639bd17ea44df754ead799e669 (patch)
tree6dc6194415ca68135a2c6ab1e2c5b308aa48cfee /fs
parent9e1ff307c779ce1f0f810c7ecce3d95bbae40896 (diff)
downloadlinux-stable-342a67f0884293639bd17ea44df754ead799e669.tar.gz
linux-stable-342a67f0884293639bd17ea44df754ead799e669.tar.bz2
linux-stable-342a67f0884293639bd17ea44df754ead799e669.zip
NFS: Label the dentry with a verifier in nfs_link(), nfs_symlink()
After the success of an operation such as link(), or symlink(), we expect to add the dentry back to the dcache as an ordinary positive dentry. However in NFS, unless it is labelled with the appropriate verifier for the parent directory state, then nfs_lookup_revalidate will end up discarding that dentry and forcing a new lookup. The fix is to ensure that we relabel the dentry appropriately on success. Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/nfs/dir.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
index 1a6d2867fba4..baca036f3890 100644
--- a/fs/nfs/dir.c
+++ b/fs/nfs/dir.c
@@ -2352,6 +2352,8 @@ int nfs_symlink(struct user_namespace *mnt_userns, struct inode *dir,
return error;
}
+ nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
+
/*
* No big deal if we can't add this page to the page cache here.
* READLINK will get the missing page from the server if needed.
@@ -2385,6 +2387,7 @@ nfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry)
d_drop(dentry);
error = NFS_PROTO(dir)->link(inode, dir, &dentry->d_name);
if (error == 0) {
+ nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
ihold(inode);
d_add(dentry, inode);
}