diff options
author | Trond Myklebust <trond.myklebust@primarydata.com> | 2016-11-27 21:12:39 +0100 |
---|---|---|
committer | Trond Myklebust <trond.myklebust@primarydata.com> | 2016-12-01 23:21:38 +0100 |
commit | 54e4a0dfa25d9365c4e80a639e80d9213eb6edbe (patch) | |
tree | 5d1004f5fc0f7e1529e323524eda755e69ec08bd /fs/nfs/pnfs.c | |
parent | NFSv4.1: Fix regression in callback retry handling (diff) | |
download | linux-54e4a0dfa25d9365c4e80a639e80d9213eb6edbe.tar.xz linux-54e4a0dfa25d9365c4e80a639e80d9213eb6edbe.zip |
pNFS: Fix a deadlock between read resends and layoutreturn
We must not call nfs_pageio_init_read() on a new nfs_pageio_descriptor
while holding a reference to a layout segment, as that can deadlock
pnfs_update_layout().
Fixes: d67ae825a59d6 ("pnfs/flexfiles: Add the FlexFile Layout Driver")
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
Cc: stable@vger.kernel.org # v4.0+
Diffstat (limited to 'fs/nfs/pnfs.c')
-rw-r--r-- | fs/nfs/pnfs.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c index 259ef85f435a..206d560c74f4 100644 --- a/fs/nfs/pnfs.c +++ b/fs/nfs/pnfs.c @@ -2286,6 +2286,10 @@ void pnfs_read_resend_pnfs(struct nfs_pgio_header *hdr) struct nfs_pageio_descriptor pgio; if (!test_and_set_bit(NFS_IOHDR_REDO, &hdr->flags)) { + /* Prevent deadlocks with layoutreturn! */ + pnfs_put_lseg(hdr->lseg); + hdr->lseg = NULL; + nfs_pageio_init_read(&pgio, hdr->inode, false, hdr->completion_ops); hdr->task.tk_status = nfs_pageio_resend(&pgio, hdr); |