]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
NFS: nfs_find_open_context() may only select open files
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Wed, 12 May 2021 03:41:10 +0000 (23:41 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 20 Jul 2021 14:16:11 +0000 (16:16 +0200)
[ 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
include/linux/nfs_fs.h

index dc55ecc3bec463e860b9aa8a27bf7da2c191244c..2cdd8883b7c5ddbd6158a870af2263e007a46d98 100644 (file)
@@ -1038,6 +1038,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);
 }
@@ -1057,6 +1058,8 @@ struct nfs_open_context *nfs_find_open_context(struct inode *inode, struct rpc_c
                        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);
                break;
        }
@@ -1071,6 +1074,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.
index a0831e9d19c9df9f26c6d0777e198c32241550b4..0ff7dd2bf8a4faddeadef04aab213b6f68fd1ee6 100644 (file)
@@ -78,6 +78,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;