Patch "nfsd: eliminate the NFSD_FILE_BREAK_* flags" has been added to the 5.10-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    nfsd: eliminate the NFSD_FILE_BREAK_* flags

to the 5.10-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     nfsd-eliminate-the-nfsd_file_break_-flags.patch
and it can be found in the queue-5.10 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 88fc57c09273ee7b92e6fd2f29171b6cb495e1a6
Author: Jeff Layton <jlayton@xxxxxxxxxx>
Date:   Fri Jul 29 17:01:07 2022 -0400

    nfsd: eliminate the NFSD_FILE_BREAK_* flags
    
    [ Upstream commit 23ba98de6dcec665e15c0ca19244379bb0d30932 ]
    
    We had a report from the spring Bake-a-thon of data corruption in some
    nfstest_interop tests. Looking at the traces showed the NFS server
    allowing a v3 WRITE to proceed while a read delegation was still
    outstanding.
    
    Currently, we only set NFSD_FILE_BREAK_* flags if
    NFSD_MAY_NOT_BREAK_LEASE was set when we call nfsd_file_alloc.
    NFSD_MAY_NOT_BREAK_LEASE was intended to be set when finding files for
    COMMIT ops, where we need a writeable filehandle but don't need to
    break read leases.
    
    It doesn't make any sense to consult that flag when allocating a file
    since the file may be used on subsequent calls where we do want to break
    the lease (and the usage of it here seems to be reverse from what it
    should be anyway).
    
    Also, after calling nfsd_open_break_lease, we don't want to clear the
    BREAK_* bits. A lease could end up being set on it later (more than
    once) and we need to be able to break those leases as well.
    
    This means that the NFSD_FILE_BREAK_* flags now just mirror
    NFSD_MAY_{READ,WRITE} flags, so there's no need for them at all. Just
    drop those flags and unconditionally call nfsd_open_break_lease every
    time.
    
    Reported-by: Olga Kornieskaia <kolga@xxxxxxxxxx>
    Link: https://bugzilla.redhat.com/show_bug.cgi?id=2107360
    Fixes: 65294c1f2c5e (nfsd: add a new struct file caching facility to nfsd)
    Cc: <stable@xxxxxxxxxxxxxxx> # 5.4.x : bb283ca18d1e NFSD: Clean up the show_nf_flags() macro
    Cc: <stable@xxxxxxxxxxxxxxx> # 5.4.x
    Signed-off-by: Jeff Layton <jlayton@xxxxxxxxxx>
    Signed-off-by: Chuck Lever <chuck.lever@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/fs/nfsd/filecache.c b/fs/nfsd/filecache.c
index fc0fcb3321537..1d3d13b78be0e 100644
--- a/fs/nfsd/filecache.c
+++ b/fs/nfsd/filecache.c
@@ -183,12 +183,6 @@ nfsd_file_alloc(struct inode *inode, unsigned int may, unsigned int hashval,
 		nf->nf_hashval = hashval;
 		refcount_set(&nf->nf_ref, 1);
 		nf->nf_may = may & NFSD_FILE_MAY_MASK;
-		if (may & NFSD_MAY_NOT_BREAK_LEASE) {
-			if (may & NFSD_MAY_WRITE)
-				__set_bit(NFSD_FILE_BREAK_WRITE, &nf->nf_flags);
-			if (may & NFSD_MAY_READ)
-				__set_bit(NFSD_FILE_BREAK_READ, &nf->nf_flags);
-		}
 		nf->nf_mark = NULL;
 		trace_nfsd_file_alloc(nf);
 	}
@@ -957,21 +951,7 @@ nfsd_do_file_acquire(struct svc_rqst *rqstp, struct svc_fh *fhp,
 
 	this_cpu_inc(nfsd_file_cache_hits);
 
-	if (!(may_flags & NFSD_MAY_NOT_BREAK_LEASE)) {
-		bool write = (may_flags & NFSD_MAY_WRITE);
-
-		if (test_bit(NFSD_FILE_BREAK_READ, &nf->nf_flags) ||
-		    (test_bit(NFSD_FILE_BREAK_WRITE, &nf->nf_flags) && write)) {
-			status = nfserrno(nfsd_open_break_lease(
-					file_inode(nf->nf_file), may_flags));
-			if (status == nfs_ok) {
-				clear_bit(NFSD_FILE_BREAK_READ, &nf->nf_flags);
-				if (write)
-					clear_bit(NFSD_FILE_BREAK_WRITE,
-						  &nf->nf_flags);
-			}
-		}
-	}
+	status = nfserrno(nfsd_open_break_lease(file_inode(nf->nf_file), may_flags));
 out:
 	if (status == nfs_ok) {
 		*pnf = nf;
diff --git a/fs/nfsd/filecache.h b/fs/nfsd/filecache.h
index 1da0c79a55804..c9e3c6eb4776e 100644
--- a/fs/nfsd/filecache.h
+++ b/fs/nfsd/filecache.h
@@ -37,9 +37,7 @@ struct nfsd_file {
 	struct net		*nf_net;
 #define NFSD_FILE_HASHED	(0)
 #define NFSD_FILE_PENDING	(1)
-#define NFSD_FILE_BREAK_READ	(2)
-#define NFSD_FILE_BREAK_WRITE	(3)
-#define NFSD_FILE_REFERENCED	(4)
+#define NFSD_FILE_REFERENCED	(2)
 	unsigned long		nf_flags;
 	struct inode		*nf_inode;
 	unsigned int		nf_hashval;
diff --git a/fs/nfsd/trace.h b/fs/nfsd/trace.h
index 8ccce4ac66b4e..5c2292a1892cc 100644
--- a/fs/nfsd/trace.h
+++ b/fs/nfsd/trace.h
@@ -707,8 +707,6 @@ DEFINE_CLID_EVENT(confirmed_r);
 	__print_flags(val, "|",						\
 		{ 1 << NFSD_FILE_HASHED,	"HASHED" },		\
 		{ 1 << NFSD_FILE_PENDING,	"PENDING" },		\
-		{ 1 << NFSD_FILE_BREAK_READ,	"BREAK_READ" },		\
-		{ 1 << NFSD_FILE_BREAK_WRITE,	"BREAK_WRITE" },	\
 		{ 1 << NFSD_FILE_REFERENCED,	"REFERENCED"})
 
 DECLARE_EVENT_CLASS(nfsd_file_class,




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux