From: Anna Schumaker Date: Tue, 4 Nov 2025 15:06:45 +0000 (-0500) Subject: NFS: Add a module option to disable directory delegations X-Git-Tag: v6.19-rc1~27^2~9 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b6d2a520f4638c2e7d3f2f11946918946941be18;p=thirdparty%2Flinux.git NFS: Add a module option to disable directory delegations When this option is disabled then the client will not request directory delegations or check if we have one during the revalidation paths. Signed-off-by: Anna Schumaker Signed-off-by: Trond Myklebust --- diff --git a/fs/nfs/delegation.c b/fs/nfs/delegation.c index b4c192f00e94..2248e3ad089a 100644 --- a/fs/nfs/delegation.c +++ b/fs/nfs/delegation.c @@ -30,6 +30,11 @@ static unsigned nfs_delegation_watermark = NFS_DEFAULT_DELEGATION_WATERMARK; module_param_named(delegation_watermark, nfs_delegation_watermark, uint, 0644); +bool directory_delegations = true; +module_param(directory_delegations, bool, 0644); +MODULE_PARM_DESC(directory_delegations, + "Enable the use of directory delegations, defaults to on."); + static struct hlist_head *nfs_delegation_hash(struct nfs_server *server, const struct nfs_fh *fhandle) { @@ -143,6 +148,8 @@ static int nfs4_do_check_delegation(struct inode *inode, fmode_t type, */ int nfs4_have_delegation(struct inode *inode, fmode_t type, int flags) { + if (S_ISDIR(inode->i_mode) && !directory_delegations) + nfs_inode_evict_delegation(inode); return nfs4_do_check_delegation(inode, type, flags, true); } diff --git a/fs/nfs/delegation.h b/fs/nfs/delegation.h index 8968f62bf438..46d866adb5c2 100644 --- a/fs/nfs/delegation.h +++ b/fs/nfs/delegation.h @@ -124,6 +124,8 @@ static inline int nfs_have_delegated_mtime(struct inode *inode) NFS_DELEGATION_FLAG_TIME); } +extern bool directory_delegations; + static inline void nfs_request_directory_delegation(struct inode *inode) { if (S_ISDIR(inode->i_mode)) diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 6691a44866b6..c53ddb185aa3 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -4473,6 +4473,8 @@ out: #if IS_ENABLED(CONFIG_NFS_V4_1) static bool should_request_dir_deleg(struct inode *inode) { + if (!directory_delegations) + return false; if (!inode) return false; if (!S_ISDIR(inode->i_mode))