diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2018-06-21 17:21:34 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2018-06-21 17:21:34 -0400 |
commit | 27db64f65f1be2f2ee741a1bf20d8d13d62c167f (patch) | |
tree | b42f39435edcc17fac6a0d4e92fcabfd090b2cbb /net | |
parent | acdf3f93b6e366981535ab93c6465e393e0f2e35 (diff) | |
parent | 7b0df92ac12148098391bf53f3494af17812f264 (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.c | 10 |
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; |
993 | out_unlock: | 991 | out_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 | ||
1299 | static inline __be32 xprt_alloc_xid(struct rpc_xprt *xprt) | 1297 | static 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 | ||
1304 | static inline void xprt_init_xid(struct rpc_xprt *xprt) | 1307 | static 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; |