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()
This commit is contained in:
@@ -987,8 +987,6 @@ bool xprt_prepare_transmit(struct rpc_task *task)
|
||||
task->tk_status = -EAGAIN;
|
||||
goto out_unlock;
|
||||
}
|
||||
if (!bc_prealloc(req) && !req->rq_xmit_bytes_sent)
|
||||
req->rq_xid = xprt_alloc_xid(xprt);
|
||||
ret = true;
|
||||
out_unlock:
|
||||
spin_unlock_bh(&xprt->transport_lock);
|
||||
@@ -1298,7 +1296,12 @@ void xprt_retry_reserve(struct rpc_task *task)
|
||||
|
||||
static inline __be32 xprt_alloc_xid(struct rpc_xprt *xprt)
|
||||
{
|
||||
return (__force __be32)xprt->xid++;
|
||||
__be32 xid;
|
||||
|
||||
spin_lock(&xprt->reserve_lock);
|
||||
xid = (__force __be32)xprt->xid++;
|
||||
spin_unlock(&xprt->reserve_lock);
|
||||
return xid;
|
||||
}
|
||||
|
||||
static inline void xprt_init_xid(struct rpc_xprt *xprt)
|
||||
@@ -1316,6 +1319,7 @@ void xprt_request_init(struct rpc_task *task)
|
||||
req->rq_task = task;
|
||||
req->rq_xprt = xprt;
|
||||
req->rq_buffer = NULL;
|
||||
req->rq_xid = xprt_alloc_xid(xprt);
|
||||
req->rq_connect_cookie = xprt->connect_cookie - 1;
|
||||
req->rq_bytes_sent = 0;
|
||||
req->rq_snd_buf.len = 0;
|
||||
|
Reference in New Issue
Block a user