| From 6b7f3e077f81064a0ccd160263990354e5d517f1 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 11 May 2021 23:41:10 -0400 |
| Subject: NFS: nfs_find_open_context() may only select open files |
| |
| From: Trond Myklebust <trond.myklebust@hammerspace.com> |
| |
| [ Upstream commit e97bc66377bca097e1f3349ca18ca17f202ff659 ] |
| |
| If a file has already been closed, then it should not be selected to |
| support further I/O. |
| |
| Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com> |
| [Trond: Fix an invalid pointer deref reported by Colin Ian King] |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| fs/nfs/inode.c | 4 ++++ |
| include/linux/nfs_fs.h | 1 + |
| 2 files changed, 5 insertions(+) |
| |
| diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c |
| index ae8bc84e39fb..6b1f2bf65bee 100644 |
| --- a/fs/nfs/inode.c |
| +++ b/fs/nfs/inode.c |
| @@ -1079,6 +1079,7 @@ EXPORT_SYMBOL_GPL(nfs_inode_attach_open_context); |
| void nfs_file_set_open_context(struct file *filp, struct nfs_open_context *ctx) |
| { |
| filp->private_data = get_nfs_open_context(ctx); |
| + set_bit(NFS_CONTEXT_FILE_OPEN, &ctx->flags); |
| if (list_empty(&ctx->list)) |
| nfs_inode_attach_open_context(ctx); |
| } |
| @@ -1098,6 +1099,8 @@ struct nfs_open_context *nfs_find_open_context(struct inode *inode, const struct |
| continue; |
| if ((pos->mode & (FMODE_READ|FMODE_WRITE)) != mode) |
| continue; |
| + if (!test_bit(NFS_CONTEXT_FILE_OPEN, &pos->flags)) |
| + continue; |
| ctx = get_nfs_open_context(pos); |
| if (ctx) |
| break; |
| @@ -1113,6 +1116,7 @@ void nfs_file_clear_open_context(struct file *filp) |
| if (ctx) { |
| struct inode *inode = d_inode(ctx->dentry); |
| |
| + clear_bit(NFS_CONTEXT_FILE_OPEN, &ctx->flags); |
| /* |
| * We fatal error on write before. Try to writeback |
| * every page again. |
| diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h |
| index eadaabd18dc7..be9eadd23659 100644 |
| --- a/include/linux/nfs_fs.h |
| +++ b/include/linux/nfs_fs.h |
| @@ -84,6 +84,7 @@ struct nfs_open_context { |
| #define NFS_CONTEXT_RESEND_WRITES (1) |
| #define NFS_CONTEXT_BAD (2) |
| #define NFS_CONTEXT_UNLOCK (3) |
| +#define NFS_CONTEXT_FILE_OPEN (4) |
| int error; |
| |
| struct list_head list; |
| -- |
| 2.30.2 |
| |