aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs
diff options
context:
space:
mode:
Diffstat (limited to 'fs/nfs')
-rw-r--r--fs/nfs/nfs4proc.c9
-rw-r--r--fs/nfs/pnfs.c7
2 files changed, 11 insertions, 5 deletions
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index 37eb38566fbc..b2671cb0f901 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -93,6 +93,8 @@ static int nfs4_map_errors(int err)
93 return err; 93 return err;
94 switch (err) { 94 switch (err) {
95 case -NFS4ERR_RESOURCE: 95 case -NFS4ERR_RESOURCE:
96 case -NFS4ERR_LAYOUTTRYLATER:
97 case -NFS4ERR_RECALLCONFLICT:
96 return -EREMOTEIO; 98 return -EREMOTEIO;
97 case -NFS4ERR_WRONGSEC: 99 case -NFS4ERR_WRONGSEC:
98 return -EPERM; 100 return -EPERM;
@@ -6046,6 +6048,7 @@ static void nfs4_layoutget_done(struct rpc_task *task, void *calldata)
6046 struct nfs_server *server = NFS_SERVER(inode); 6048 struct nfs_server *server = NFS_SERVER(inode);
6047 struct pnfs_layout_hdr *lo; 6049 struct pnfs_layout_hdr *lo;
6048 struct nfs4_state *state = NULL; 6050 struct nfs4_state *state = NULL;
6051 unsigned long timeo, giveup;
6049 6052
6050 dprintk("--> %s\n", __func__); 6053 dprintk("--> %s\n", __func__);
6051 6054
@@ -6057,7 +6060,10 @@ static void nfs4_layoutget_done(struct rpc_task *task, void *calldata)
6057 goto out; 6060 goto out;
6058 case -NFS4ERR_LAYOUTTRYLATER: 6061 case -NFS4ERR_LAYOUTTRYLATER:
6059 case -NFS4ERR_RECALLCONFLICT: 6062 case -NFS4ERR_RECALLCONFLICT:
6060 task->tk_status = -NFS4ERR_DELAY; 6063 timeo = rpc_get_timeout(task->tk_client);
6064 giveup = lgp->args.timestamp + timeo;
6065 if (time_after(giveup, jiffies))
6066 task->tk_status = -NFS4ERR_DELAY;
6061 break; 6067 break;
6062 case -NFS4ERR_EXPIRED: 6068 case -NFS4ERR_EXPIRED:
6063 case -NFS4ERR_BAD_STATEID: 6069 case -NFS4ERR_BAD_STATEID:
@@ -6178,6 +6184,7 @@ nfs4_proc_layoutget(struct nfs4_layoutget *lgp, gfp_t gfp_flags)
6178 return ERR_PTR(-ENOMEM); 6184 return ERR_PTR(-ENOMEM);
6179 } 6185 }
6180 lgp->args.layout.pglen = max_pages * PAGE_SIZE; 6186 lgp->args.layout.pglen = max_pages * PAGE_SIZE;
6187 lgp->args.timestamp = jiffies;
6181 6188
6182 lgp->res.layoutp = &lgp->args.layout; 6189 lgp->res.layoutp = &lgp->args.layout;
6183 lgp->res.seq_res.sr_slot = NULL; 6190 lgp->res.seq_res.sr_slot = NULL;
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index 97767c8683f9..48ac5aad6258 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -1181,7 +1181,7 @@ pnfs_update_layout(struct inode *ino,
1181 struct nfs_client *clp = server->nfs_client; 1181 struct nfs_client *clp = server->nfs_client;
1182 struct pnfs_layout_hdr *lo; 1182 struct pnfs_layout_hdr *lo;
1183 struct pnfs_layout_segment *lseg = NULL; 1183 struct pnfs_layout_segment *lseg = NULL;
1184 bool first = false; 1184 bool first;
1185 1185
1186 if (!pnfs_enabled_sb(NFS_SERVER(ino))) 1186 if (!pnfs_enabled_sb(NFS_SERVER(ino)))
1187 goto out; 1187 goto out;
@@ -1215,10 +1215,9 @@ pnfs_update_layout(struct inode *ino,
1215 goto out_unlock; 1215 goto out_unlock;
1216 atomic_inc(&lo->plh_outstanding); 1216 atomic_inc(&lo->plh_outstanding);
1217 1217
1218 if (list_empty(&lo->plh_segs)) 1218 first = list_empty(&lo->plh_layouts) ? true : false;
1219 first = true;
1220
1221 spin_unlock(&ino->i_lock); 1219 spin_unlock(&ino->i_lock);
1220
1222 if (first) { 1221 if (first) {
1223 /* The lo must be on the clp list if there is any 1222 /* The lo must be on the clp list if there is any
1224 * chance of a CB_LAYOUTRECALL(FILE) coming in. 1223 * chance of a CB_LAYOUTRECALL(FILE) coming in.