| From a65dedeafc785f4d056f6cbcfd1b233862e0f416 Mon Sep 17 00:00:00 2001 |
| From: Trond Myklebust <trond.myklebust@hammerspace.com> |
| Date: Tue, 4 Aug 2020 16:30:30 -0400 |
| Subject: [PATCH] NFS: Don't move layouts to plh_return_segs list while in use |
| |
| commit ff041727e9e029845857cac41aae118ead5e261b upstream. |
| |
| If the layout segment is still in use for a read or a write, we should |
| not move it to the layout plh_return_segs list. If we do, we can end |
| up returning the layout while I/O is still in progress. |
| |
| Fixes: e0b7d420f72a ("pNFS: Don't discard layout segments that are marked for return") |
| Cc: stable@vger.kernel.org # v4.19+ |
| Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c |
| index 5308aade081b..ae73377843ac 100644 |
| --- a/fs/nfs/pnfs.c |
| +++ b/fs/nfs/pnfs.c |
| @@ -2301,16 +2301,6 @@ pnfs_layout_process(struct nfs4_layoutget *lgp) |
| return ERR_PTR(-EAGAIN); |
| } |
| |
| -static int |
| -mark_lseg_invalid_or_return(struct pnfs_layout_segment *lseg, |
| - struct list_head *tmp_list) |
| -{ |
| - if (!mark_lseg_invalid(lseg, tmp_list)) |
| - return 0; |
| - pnfs_cache_lseg_for_layoutreturn(lseg->pls_layout, lseg); |
| - return 1; |
| -} |
| - |
| /** |
| * pnfs_mark_matching_lsegs_return - Free or return matching layout segments |
| * @lo: pointer to layout header |
| @@ -2347,7 +2337,7 @@ pnfs_mark_matching_lsegs_return(struct pnfs_layout_hdr *lo, |
| lseg, lseg->pls_range.iomode, |
| lseg->pls_range.offset, |
| lseg->pls_range.length); |
| - if (mark_lseg_invalid_or_return(lseg, tmp_list)) |
| + if (mark_lseg_invalid(lseg, tmp_list)) |
| continue; |
| remaining++; |
| set_bit(NFS_LSEG_LAYOUTRETURN, &lseg->pls_flags); |
| -- |
| 2.27.0 |
| |