]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
NFSv4/flexfiles: Fix layout merge mirror check.
authorJonathan Curley <jcurley@purestorage.com>
Mon, 8 Sep 2025 17:35:16 +0000 (17:35 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 2 Oct 2025 11:35:36 +0000 (13:35 +0200)
[ Upstream commit dd2fa82473453661d12723c46c9f43d9876a7efd ]

Typo in ff_lseg_match_mirrors makes the diff ineffective. This results
in merge happening all the time. Merge happening all the time is
problematic because it marks lsegs invalid. Marking lsegs invalid
causes all outstanding IO to get restarted with EAGAIN and connections
to get closed.

Closing connections constantly triggers race conditions in the RDMA
implementation...

Fixes: 660d1eb22301c ("pNFS/flexfile: Don't merge layout segments if the mirrors don't match")
Signed-off-by: Jonathan Curley <jcurley@purestorage.com>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/nfs/flexfilelayout/flexfilelayout.c

index 43aefff2e6b060447198a24c4e462a5045271ab9..ee103cde19cdf2d0ef4de0db989556d1c70529e2 100644 (file)
@@ -270,7 +270,7 @@ ff_lseg_match_mirrors(struct pnfs_layout_segment *l1,
                struct pnfs_layout_segment *l2)
 {
        const struct nfs4_ff_layout_segment *fl1 = FF_LAYOUT_LSEG(l1);
-       const struct nfs4_ff_layout_segment *fl2 = FF_LAYOUT_LSEG(l1);
+       const struct nfs4_ff_layout_segment *fl2 = FF_LAYOUT_LSEG(l2);
        u32 i;
 
        if (fl1->mirror_array_cnt != fl2->mirror_array_cnt)