|
@@ -93,6 +93,8 @@ static int nfs4_map_errors(int err)
|
|
|
return err;
|
|
|
switch (err) {
|
|
|
case -NFS4ERR_RESOURCE:
|
|
|
+ case -NFS4ERR_LAYOUTTRYLATER:
|
|
|
+ case -NFS4ERR_RECALLCONFLICT:
|
|
|
return -EREMOTEIO;
|
|
|
case -NFS4ERR_WRONGSEC:
|
|
|
return -EPERM;
|
|
@@ -6046,6 +6048,7 @@ static void nfs4_layoutget_done(struct rpc_task *task, void *calldata)
|
|
|
struct nfs_server *server = NFS_SERVER(inode);
|
|
|
struct pnfs_layout_hdr *lo;
|
|
|
struct nfs4_state *state = NULL;
|
|
|
+ unsigned long timeo, giveup;
|
|
|
|
|
|
dprintk("--> %s\n", __func__);
|
|
|
|
|
@@ -6057,7 +6060,10 @@ static void nfs4_layoutget_done(struct rpc_task *task, void *calldata)
|
|
|
goto out;
|
|
|
case -NFS4ERR_LAYOUTTRYLATER:
|
|
|
case -NFS4ERR_RECALLCONFLICT:
|
|
|
- task->tk_status = -NFS4ERR_DELAY;
|
|
|
+ timeo = rpc_get_timeout(task->tk_client);
|
|
|
+ giveup = lgp->args.timestamp + timeo;
|
|
|
+ if (time_after(giveup, jiffies))
|
|
|
+ task->tk_status = -NFS4ERR_DELAY;
|
|
|
break;
|
|
|
case -NFS4ERR_EXPIRED:
|
|
|
case -NFS4ERR_BAD_STATEID:
|
|
@@ -6178,6 +6184,7 @@ nfs4_proc_layoutget(struct nfs4_layoutget *lgp, gfp_t gfp_flags)
|
|
|
return ERR_PTR(-ENOMEM);
|
|
|
}
|
|
|
lgp->args.layout.pglen = max_pages * PAGE_SIZE;
|
|
|
+ lgp->args.timestamp = jiffies;
|
|
|
|
|
|
lgp->res.layoutp = &lgp->args.layout;
|
|
|
lgp->res.seq_res.sr_slot = NULL;
|