diff options
author | Trond Myklebust <trond.myklebust@hammerspace.com> | 2018-06-15 16:31:02 -0400 |
---|---|---|
committer | Trond Myklebust <trond.myklebust@hammerspace.com> | 2018-06-19 08:52:27 -0400 |
commit | c8bf70735382401a161d9c818e8ea89500812d0c (patch) | |
tree | 972531a2cd646bdb6aaaac128e19902abe06775e | |
parent | 2dbf8dffbf35fd8f611083b9d9fe74fdccf912a3 (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.c | 16 | ||||
-rw-r--r-- | fs/nfs/pnfs.h | 5 |
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) | |||
5972 | static void nfs4_delegreturn_prepare(struct rpc_task *task, void *data) | 5979 | static 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 | ||
8825 | static void nfs4_layoutreturn_done(struct rpc_task *task, void *calldata) | 8841 | static 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 | ||
804 | static 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) |