summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTrond Myklebust <trond.myklebust@hammerspace.com>2018-06-15 16:31:02 -0400
committerTrond Myklebust <trond.myklebust@hammerspace.com>2018-06-19 08:52:27 -0400
commitc8bf70735382401a161d9c818e8ea89500812d0c (patch)
tree972531a2cd646bdb6aaaac128e19902abe06775e
parent2dbf8dffbf35fd8f611083b9d9fe74fdccf912a3 (diff)
pNFS: Don't send layoutreturn if the layout is already invalid
If the layout was invalidated due to a reboot, then don't try to send a layoutreturn for it. Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
-rw-r--r--fs/nfs/nfs4proc.c16
-rw-r--r--fs/nfs/pnfs.h5
2 files changed, 21 insertions, 0 deletions
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index 2c8c2696415e..6dd146885da9 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -3294,6 +3294,7 @@ static void nfs4_close_prepare(struct rpc_task *task, void *data)
3294 struct nfs4_closedata *calldata = data; 3294 struct nfs4_closedata *calldata = data;
3295 struct nfs4_state *state = calldata->state; 3295 struct nfs4_state *state = calldata->state;
3296 struct inode *inode = calldata->inode; 3296 struct inode *inode = calldata->inode;
3297 struct pnfs_layout_hdr *lo;
3297 bool is_rdonly, is_wronly, is_rdwr; 3298 bool is_rdonly, is_wronly, is_rdwr;
3298 int call_close = 0; 3299 int call_close = 0;
3299 3300
@@ -3337,6 +3338,12 @@ static void nfs4_close_prepare(struct rpc_task *task, void *data)
3337 goto out_wait; 3338 goto out_wait;
3338 } 3339 }
3339 3340
3341 lo = calldata->arg.lr_args ? calldata->arg.lr_args->layout : NULL;
3342 if (lo && !pnfs_layout_is_valid(lo)) {
3343 calldata->arg.lr_args = NULL;
3344 calldata->res.lr_res = NULL;
3345 }
3346
3340 if (calldata->arg.fmode == 0) 3347 if (calldata->arg.fmode == 0)
3341 task->tk_msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CLOSE]; 3348 task->tk_msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CLOSE];
3342 3349
@@ -5972,12 +5979,19 @@ static void nfs4_delegreturn_release(void *calldata)
5972static void nfs4_delegreturn_prepare(struct rpc_task *task, void *data) 5979static void nfs4_delegreturn_prepare(struct rpc_task *task, void *data)
5973{ 5980{
5974 struct nfs4_delegreturndata *d_data; 5981 struct nfs4_delegreturndata *d_data;
5982 struct pnfs_layout_hdr *lo;
5975 5983
5976 d_data = (struct nfs4_delegreturndata *)data; 5984 d_data = (struct nfs4_delegreturndata *)data;
5977 5985
5978 if (!d_data->lr.roc && nfs4_wait_on_layoutreturn(d_data->inode, task)) 5986 if (!d_data->lr.roc && nfs4_wait_on_layoutreturn(d_data->inode, task))
5979 return; 5987 return;
5980 5988
5989 lo = d_data->args.lr_args ? d_data->args.lr_args->layout : NULL;
5990 if (lo && !pnfs_layout_is_valid(lo)) {
5991 d_data->args.lr_args = NULL;
5992 d_data->res.lr_res = NULL;
5993 }
5994
5981 nfs4_setup_sequence(d_data->res.server->nfs_client, 5995 nfs4_setup_sequence(d_data->res.server->nfs_client,
5982 &d_data->args.seq_args, 5996 &d_data->args.seq_args,
5983 &d_data->res.seq_res, 5997 &d_data->res.seq_res,
@@ -8820,6 +8834,8 @@ nfs4_layoutreturn_prepare(struct rpc_task *task, void *calldata)
8820 &lrp->args.seq_args, 8834 &lrp->args.seq_args,
8821 &lrp->res.seq_res, 8835 &lrp->res.seq_res,
8822 task); 8836 task);
8837 if (!pnfs_layout_is_valid(lrp->args.layout))
8838 rpc_exit(task, 0);
8823} 8839}
8824 8840
8825static void nfs4_layoutreturn_done(struct rpc_task *task, void *calldata) 8841static void nfs4_layoutreturn_done(struct rpc_task *task, void *calldata)
diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h
index a8f5e6b16749..3fe81424337d 100644
--- a/fs/nfs/pnfs.h
+++ b/fs/nfs/pnfs.h
@@ -801,6 +801,11 @@ static inline void nfs4_lgopen_release(struct nfs4_layoutget *lgp)
801{ 801{
802} 802}
803 803
804static inline bool pnfs_layout_is_valid(const struct pnfs_layout_hdr *lo)
805{
806 return false;
807}
808
804#endif /* CONFIG_NFS_V4_1 */ 809#endif /* CONFIG_NFS_V4_1 */
805 810
806#if IS_ENABLED(CONFIG_NFS_V4_2) 811#if IS_ENABLED(CONFIG_NFS_V4_2)