Merge tag 'nfs-for-7.0-2' of git://git.linux-nfs.org/projects/anna/linux-nfs

Pull NFS client fixes from Anna Schumaker:

 - Fix NFS KConfig typos

 - Decrement re_receiving on the early exit paths

 - return EISDIR on nfs3_proc_create if d_alias is a dir

* tag 'nfs-for-7.0-2' of git://git.linux-nfs.org/projects/anna/linux-nfs:
  NFS: Fix NFS KConfig typos
  xprtrdma: Decrement re_receiving on the early exit paths
  nfs: return EISDIR on nfs3_proc_create if d_alias is a dir
This commit is contained in:
Linus Torvalds
2026-03-12 12:38:17 -07:00
3 changed files with 12 additions and 5 deletions

View File

@@ -87,7 +87,7 @@ config NFS_V4
space programs which can be found in the Linux nfs-utils package, space programs which can be found in the Linux nfs-utils package,
available from http://linux-nfs.org/. available from http://linux-nfs.org/.
If unsure, say Y. If unsure, say N.
config NFS_SWAP config NFS_SWAP
bool "Provide swap over NFS support" bool "Provide swap over NFS support"
@@ -100,6 +100,7 @@ config NFS_SWAP
config NFS_V4_0 config NFS_V4_0
bool "NFS client support for NFSv4.0" bool "NFS client support for NFSv4.0"
depends on NFS_V4 depends on NFS_V4
default y
help help
This option enables support for minor version 0 of the NFSv4 protocol This option enables support for minor version 0 of the NFSv4 protocol
(RFC 3530) in the kernel's NFS client. (RFC 3530) in the kernel's NFS client.

View File

@@ -392,8 +392,13 @@ nfs3_proc_create(struct inode *dir, struct dentry *dentry, struct iattr *sattr,
if (status != 0) if (status != 0)
goto out_release_acls; goto out_release_acls;
if (d_alias) if (d_alias) {
if (d_is_dir(d_alias)) {
status = -EISDIR;
goto out_dput;
}
dentry = d_alias; dentry = d_alias;
}
/* When we created the file with exclusive semantics, make /* When we created the file with exclusive semantics, make
* sure we set the attributes afterwards. */ * sure we set the attributes afterwards. */

View File

@@ -1362,7 +1362,7 @@ void rpcrdma_post_recvs(struct rpcrdma_xprt *r_xprt, int needed)
needed += RPCRDMA_MAX_RECV_BATCH; needed += RPCRDMA_MAX_RECV_BATCH;
if (atomic_inc_return(&ep->re_receiving) > 1) if (atomic_inc_return(&ep->re_receiving) > 1)
goto out; goto out_dec;
/* fast path: all needed reps can be found on the free list */ /* fast path: all needed reps can be found on the free list */
wr = NULL; wr = NULL;
@@ -1385,7 +1385,7 @@ void rpcrdma_post_recvs(struct rpcrdma_xprt *r_xprt, int needed)
++count; ++count;
} }
if (!wr) if (!wr)
goto out; goto out_dec;
rc = ib_post_recv(ep->re_id->qp, wr, rc = ib_post_recv(ep->re_id->qp, wr,
(const struct ib_recv_wr **)&bad_wr); (const struct ib_recv_wr **)&bad_wr);
@@ -1400,9 +1400,10 @@ void rpcrdma_post_recvs(struct rpcrdma_xprt *r_xprt, int needed)
--count; --count;
} }
} }
out_dec:
if (atomic_dec_return(&ep->re_receiving) > 0) if (atomic_dec_return(&ep->re_receiving) > 0)
complete(&ep->re_done); complete(&ep->re_done);
out: out:
trace_xprtrdma_post_recvs(r_xprt, count); trace_xprtrdma_post_recvs(r_xprt, count);
ep->re_receive_count += count; ep->re_receive_count += count;