diff options
author | Trond Myklebust <trond.myklebust@hammerspace.com> | 2020-04-19 14:38:00 -0400 |
---|---|---|
committer | Trond Myklebust <trond.myklebust@hammerspace.com> | 2020-04-19 19:27:26 -0400 |
commit | 7bcc10585bd9b762820fd8ffdc389aafa56ad689 (patch) | |
tree | ba75d1c335de6bd3d5014c4b2daee34e19651244 /fs/nfs | |
parent | ae83d0b416db002fe95601e7f97f64b59514d936 (diff) | |
download | linux-7bcc10585bd9b762820fd8ffdc389aafa56ad689.tar.gz linux-7bcc10585bd9b762820fd8ffdc389aafa56ad689.tar.bz2 linux-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>
Diffstat (limited to 'fs/nfs')
-rw-r--r-- | fs/nfs/pnfs.c | 4 |
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); |