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))
|
if (!nfs41_sequence_process(task, &lrp->res.seq_res))
|
||||||
return;
|
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);
|
server = NFS_SERVER(lrp->args.inode);
|
||||||
switch (task->tk_status) {
|
switch (task->tk_status) {
|
||||||
case -NFS4ERR_OLD_STATEID:
|
case -NFS4ERR_OLD_STATEID:
|
||||||
|
|
|
@ -1455,6 +1455,21 @@ int pnfs_roc_done(struct rpc_task *task, struct inode *inode,
|
||||||
case 0:
|
case 0:
|
||||||
retval = 0;
|
retval = 0;
|
||||||
break;
|
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:
|
case -NFS4ERR_DELAY:
|
||||||
/* Let the caller handle the retry */
|
/* Let the caller handle the retry */
|
||||||
*ret = -NFS4ERR_NOMATCHING_LAYOUT;
|
*ret = -NFS4ERR_NOMATCHING_LAYOUT;
|
||||||
|
|
Loading…
Reference in New Issue