summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTrond Myklebust <trond.myklebust@hammerspace.com>2020-04-19 14:38:00 -0400
committerTrond Myklebust <trond.myklebust@hammerspace.com>2020-04-19 19:27:26 -0400
commit7bcc10585bd9b762820fd8ffdc389aafa56ad689 (patch)
treeba75d1c335de6bd3d5014c4b2daee34e19651244
parentae83d0b416db002fe95601e7f97f64b59514d936 (diff)
downloadlinux-stable-7bcc10585bd9b762820fd8ffdc389aafa56ad689.tar.gz
linux-stable-7bcc10585bd9b762820fd8ffdc389aafa56ad689.tar.bz2
linux-stable-7bcc10585bd9b762820fd8ffdc389aafa56ad689.zip
NFS/pnfs: Ensure that _pnfs_return_layout() waits for layoutreturn completion
We require that any outstanding layout return completes before we can free up the inode so that the layout itself can be freed. Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
-rw-r--r--fs/nfs/pnfs.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index b8d78f393365..3bf6899cba95 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -1332,13 +1332,15 @@ _pnfs_return_layout(struct inode *ino)
!valid_layout) {
spin_unlock(&ino->i_lock);
dprintk("NFS: %s no layout segments to return\n", __func__);
- goto out_put_layout_hdr;
+ goto out_wait_layoutreturn;
}
send = pnfs_prepare_layoutreturn(lo, &stateid, &cred, NULL);
spin_unlock(&ino->i_lock);
if (send)
status = pnfs_send_layoutreturn(lo, &stateid, &cred, IOMODE_ANY, true);
+out_wait_layoutreturn:
+ wait_on_bit(&lo->plh_flags, NFS_LAYOUT_RETURN, TASK_UNINTERRUPTIBLE);
out_put_layout_hdr:
pnfs_free_lseg_list(&tmp_list);
pnfs_put_layout_hdr(lo);