| From 7b650994ab07434ae58a247dc9ac87d2488ca75c Mon Sep 17 00:00:00 2001 |
| From: Trond Myklebust <trond.myklebust@primarydata.com> |
| Date: Mon, 14 Nov 2016 13:10:48 -0500 |
| Subject: pNFS: Don't clear the layout stateid if a layout return is outstanding |
| |
| From: Trond Myklebust <trond.myklebust@primarydata.com> |
| |
| commit 7b650994ab07434ae58a247dc9ac87d2488ca75c upstream. |
| |
| If we no longer hold any layout segments, we're normally expected to |
| consider the layout stateid to be invalid. However we cannot assume this |
| if we're about to, or in the process of sending a layoutreturn. |
| |
| Fixes: 334a8f37115b ("pNFS: Don't forget the layout stateid if...") |
| Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/nfs/pnfs.c | 4 +++- |
| 1 file changed, 3 insertions(+), 1 deletion(-) |
| |
| --- a/fs/nfs/pnfs.c |
| +++ b/fs/nfs/pnfs.c |
| @@ -364,7 +364,9 @@ pnfs_layout_remove_lseg(struct pnfs_layo |
| list_del_init(&lseg->pls_list); |
| /* Matched by pnfs_get_layout_hdr in pnfs_layout_insert_lseg */ |
| atomic_dec(&lo->plh_refcount); |
| - if (list_empty(&lo->plh_segs)) { |
| + if (list_empty(&lo->plh_segs) && |
| + !test_bit(NFS_LAYOUT_RETURN_REQUESTED, &lo->plh_flags) && |
| + !test_bit(NFS_LAYOUT_RETURN, &lo->plh_flags)) { |
| if (atomic_read(&lo->plh_outstanding) == 0) |
| set_bit(NFS_LAYOUT_INVALID_STID, &lo->plh_flags); |
| clear_bit(NFS_LAYOUT_BULK_RECALL, &lo->plh_flags); |