aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2018-06-21 17:21:34 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2018-06-21 17:21:34 -0400
commit27db64f65f1be2f2ee741a1bf20d8d13d62c167f (patch)
treeb42f39435edcc17fac6a0d4e92fcabfd090b2cbb /net
parentacdf3f93b6e366981535ab93c6465e393e0f2e35 (diff)
parent7b0df92ac12148098391bf53f3494af17812f264 (diff)
Merge tag 'nfs-for-4.18-2' of git://git.linux-nfs.org/projects/trondmy/linux-nfs
Pull NFS client bugfixes from Trond Myklebust: "Hightlights include: - fix an rcu deadlock in nfs_delegation_find_inode() - fix NFSv4 deadlocks due to not freeing the session slot in layoutget - don't send layoutreturn if the layout is already invalid - prevent duplicate XID allocation - flexfiles: Don't tie up all the rpciod threads in resends" * tag 'nfs-for-4.18-2' of git://git.linux-nfs.org/projects/trondmy/linux-nfs: pNFS/flexfiles: Process writeback resends from nfsiod context as well pNFS/flexfiles: Don't tie up all the rpciod threads in resends sunrpc: Prevent duplicate XID allocation pNFS: Don't send layoutreturn if the layout is already invalid pNFS: Always free the session slot on error in nfs4_layoutget_handle_exception NFS: Fix an rcu deadlock in nfs_delegation_find_inode()
Diffstat (limited to 'net')
-rw-r--r--net/sunrpc/xprt.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c
index 3c85af058227..3fabf9f6a0f9 100644
--- a/net/sunrpc/xprt.c
+++ b/net/sunrpc/xprt.c
@@ -987,8 +987,6 @@ bool xprt_prepare_transmit(struct rpc_task *task)
987 task->tk_status = -EAGAIN; 987 task->tk_status = -EAGAIN;
988 goto out_unlock; 988 goto out_unlock;
989 } 989 }
990 if (!bc_prealloc(req) && !req->rq_xmit_bytes_sent)
991 req->rq_xid = xprt_alloc_xid(xprt);
992 ret = true; 990 ret = true;
993out_unlock: 991out_unlock:
994 spin_unlock_bh(&xprt->transport_lock); 992 spin_unlock_bh(&xprt->transport_lock);
@@ -1298,7 +1296,12 @@ void xprt_retry_reserve(struct rpc_task *task)
1298 1296
1299static inline __be32 xprt_alloc_xid(struct rpc_xprt *xprt) 1297static inline __be32 xprt_alloc_xid(struct rpc_xprt *xprt)
1300{ 1298{
1301 return (__force __be32)xprt->xid++; 1299 __be32 xid;
1300
1301 spin_lock(&xprt->reserve_lock);
1302 xid = (__force __be32)xprt->xid++;
1303 spin_unlock(&xprt->reserve_lock);
1304 return xid;
1302} 1305}
1303 1306
1304static inline void xprt_init_xid(struct rpc_xprt *xprt) 1307static inline void xprt_init_xid(struct rpc_xprt *xprt)
@@ -1316,6 +1319,7 @@ void xprt_request_init(struct rpc_task *task)
1316 req->rq_task = task; 1319 req->rq_task = task;
1317 req->rq_xprt = xprt; 1320 req->rq_xprt = xprt;
1318 req->rq_buffer = NULL; 1321 req->rq_buffer = NULL;
1322 req->rq_xid = xprt_alloc_xid(xprt);
1319 req->rq_connect_cookie = xprt->connect_cookie - 1; 1323 req->rq_connect_cookie = xprt->connect_cookie - 1;
1320 req->rq_bytes_sent = 0; 1324 req->rq_bytes_sent = 0;
1321 req->rq_snd_buf.len = 0; 1325 req->rq_snd_buf.len = 0;