]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
NFSv4: Always set NLINK even if the server doesn't support it
authorHan Young <hanyang.tony@bytedance.com>
Sun, 4 May 2025 12:57:04 +0000 (20:57 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 10 Jul 2025 13:57:31 +0000 (15:57 +0200)
[ Upstream commit 3a3065352f73381d3a1aa0ccab44aec3a5a9b365 ]

fattr4_numlinks is a recommended attribute, so the client should emulate
it even if the server doesn't support it. In decode_attr_nlink function
in nfs4xdr.c, nlink is initialized to 1. However, this default value
isn't set to the inode due to the check in nfs_fhget.

So if the server doesn't support numlinks, inode's nlink will be zero,
the mount will fail with error "Stale file handle". Set the nlink to 1
if the server doesn't support it.

Signed-off-by: Han Young <hanyang.tony@bytedance.com>
Signed-off-by: Anna Schumaker <anna.schumaker@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/nfs/inode.c

index 09922258f5a111c0da3c092a4ae7918633193a25..28c24079c57a8652f9a6c9187262b5aa1a204435 100644 (file)
@@ -567,6 +567,8 @@ nfs_fhget(struct super_block *sb, struct nfs_fh *fh, struct nfs_fattr *fattr, st
                        set_nlink(inode, fattr->nlink);
                else if (fattr_supported & NFS_ATTR_FATTR_NLINK)
                        nfs_set_cache_invalid(inode, NFS_INO_INVALID_NLINK);
+               else
+                       set_nlink(inode, 1);
                if (fattr->valid & NFS_ATTR_FATTR_OWNER)
                        inode->i_uid = fattr->uid;
                else if (fattr_supported & NFS_ATTR_FATTR_OWNER)