Commit b0319c464263 for kernel

commit b0319c4642638bad4b36974055b1c0894b2c7aa9
Merge: 1a68aefc710a df8c841dd92a
Author: Linus Torvalds <torvalds@linux-foundation.org>
Date:   Sat Dec 6 10:57:02 2025 -0800

    Merge tag 'nfsd-6.19' of git://git.kernel.org/pub/scm/linux/kernel/git/cel/linux

    Pull nfsd updates from Chuck Lever:

     - Mike Snitzer's mechanism for disabling I/O caching introduced in
       v6.18 is extended to include using direct I/O. The goal is to further
       reduce the memory footprint consumed by NFS clients accessing large
       data sets via NFSD.

     - The NFSD community adopted a maintainer entry profile during this
       cycle. See

          Documentation/filesystems/nfs/nfsd-maintainer-entry-profile.rst

     - Work continues on hardening NFSD's implementation of the pNFS block
       layout type. This type enables pNFS clients to directly access the
       underlying block devices that contain an exported file system,
       reducing server overhead and increasing data throughput.

     - The remaining patches are clean-ups and minor optimizations. Many
       thanks to the contributors, reviewers, testers, and bug reporters who
       participated during the v6.19 NFSD development cycle.

    * tag 'nfsd-6.19' of git://git.kernel.org/pub/scm/linux/kernel/git/cel/linux: (38 commits)
      NFSD: nfsd-io-modes: Separate lists
      NFSD: nfsd-io-modes: Wrap shell snippets in literal code blocks
      NFSD: Add toctree entry for NFSD IO modes docs
      NFSD: add Documentation/filesystems/nfs/nfsd-io-modes.rst
      NFSD: Implement NFSD_IO_DIRECT for NFS WRITE
      NFSD: Make FILE_SYNC WRITEs comply with spec
      NFSD: Add trace point for SCSI fencing operation.
      NFSD: use correct reservation type in nfsd4_scsi_fence_client
      xdrgen: Don't generate unnecessary semicolon
      xdrgen: Fix union declarations
      NFSD: don't start nfsd if sv_permsocks is empty
      xdrgen: handle _XdrString in union encoder/decoder
      xdrgen: Fix the variable-length opaque field decoder template
      xdrgen: Make the xdrgen script location-independent
      xdrgen: Generalize/harden pathname construction
      lockd: don't allow locking on reexported NFSv2/3
      MAINTAINERS: add a nfsd blocklayout reviewer
      nfsd: Use MD5 library instead of crypto_shash
      nfsd: stop pretending that we cache the SEQUENCE reply.
      NFS: nfsd-maintainer-entry-profile: Inline function name prefixes
      ...

diff --cc fs/nfsd/nfs4recover.c
index b39d4cbdfd35,aa15b30f9dbf..441dfbfe2d2b
--- a/fs/nfsd/nfs4recover.c
+++ b/fs/nfsd/nfs4recover.c
@@@ -210,17 -160,18 +158,16 @@@ nfsd4_create_clid_dir(struct nfs4_clien
  		 * In the 4.0 case, we should never get here; but we may
  		 * as well be forgiving and just succeed silently.
  		 */
 -		goto out_put;
 -	dentry = vfs_mkdir(&nop_mnt_idmap, d_inode(dir), dentry, S_IRWXU);
 +		goto out_end;
 +	dentry = vfs_mkdir(&nop_mnt_idmap, d_inode(dir), dentry, 0700, NULL);
  	if (IS_ERR(dentry))
  		status = PTR_ERR(dentry);
 -out_put:
 -	if (!status)
 -		dput(dentry);
 -out_unlock:
 -	inode_unlock(d_inode(dir));
 +out_end:
 +	end_creating(dentry);
 +out:
  	if (status == 0) {
  		if (nn->in_grace)
- 			__nfsd4_create_reclaim_record_grace(clp, dname,
- 					HEXDIR_LEN, nn);
+ 			__nfsd4_create_reclaim_record_grace(clp, dname, nn);
  		vfs_fsync(nn->rec_file, 0);
  	} else {
  		printk(KERN_ERR "NFSD: failed to write recovery record"
@@@ -415,10 -363,17 +351,17 @@@ purge_old(struct dentry *parent, char *
  	if (nfs4_has_reclaimed_state(name, nn))
  		goto out_free;

- 	status = vfs_rmdir(&nop_mnt_idmap, d_inode(parent), child, NULL);
- 	if (status)
- 		printk("failed to remove client recovery directory %pd\n",
- 				child);
+ 	inode_lock_nested(d_inode(parent), I_MUTEX_PARENT);
+ 	child = lookup_one(&nop_mnt_idmap, &QSTR(cname), parent);
+ 	if (!IS_ERR(child)) {
 -		status = vfs_rmdir(&nop_mnt_idmap, d_inode(parent), child);
++		status = vfs_rmdir(&nop_mnt_idmap, d_inode(parent), child, NULL);
+ 		if (status)
+ 			printk("failed to remove client recovery directory %pd\n",
+ 			       child);
+ 		dput(child);
+ 	}
+ 	inode_unlock(d_inode(parent));
+
  out_free:
  	kfree(name.data);
  out: