NFSv4: Handle RPC level errors in LAYOUTRETURN
Handle RPC level errors by assuming that the RPC call was successful. Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
This commit is contained in:
parent
078a432d1c
commit
6109bcf713
|
@ -9051,6 +9051,15 @@ static void nfs4_layoutreturn_done(struct rpc_task *task, void *calldata)
|
|||
if (!nfs41_sequence_process(task, &lrp->res.seq_res))
|
||||
return;
|
||||
|
||||
/*
|
||||
* Was there an RPC level error? Assume the call succeeded,
|
||||
* and that we need to release the layout
|
||||
*/
|
||||
if (task->tk_rpc_status != 0 && RPC_WAS_SENT(task)) {
|
||||
lrp->res.lrs_present = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
server = NFS_SERVER(lrp->args.inode);
|
||||
switch (task->tk_status) {
|
||||
case -NFS4ERR_OLD_STATEID:
|
||||
|
|
|
@ -1455,6 +1455,21 @@ int pnfs_roc_done(struct rpc_task *task, struct inode *inode,
|
|||
case 0:
|
||||
retval = 0;
|
||||
break;
|
||||
case -NFS4ERR_NOMATCHING_LAYOUT:
|
||||
/* Was there an RPC level error? If not, retry */
|
||||
if (task->tk_rpc_status == 0)
|
||||
break;
|
||||
/* If the call was not sent, let caller handle it */
|
||||
if (!RPC_WAS_SENT(task))
|
||||
return 0;
|
||||
/*
|
||||
* Otherwise, assume the call succeeded and
|
||||
* that we need to release the layout
|
||||
*/
|
||||
*ret = 0;
|
||||
(*respp)->lrs_present = 0;
|
||||
retval = 0;
|
||||
break;
|
||||
case -NFS4ERR_DELAY:
|
||||
/* Let the caller handle the retry */
|
||||
*ret = -NFS4ERR_NOMATCHING_LAYOUT;
|
||||
|
|
Loading…
Reference in New Issue