In the oplock break handler, writing pending changes from pages puts the FileInfo handle. If the refcount reaches zero it closes the handle and waits for any oplock break handler to return, thus causing a deadlock. To prevent it we keep an additionnal reference of the SMB FileInfo handle while we write/read pages so that when writepages puts the handle, it won't close it. This was triggered by xfstest 464. Signed-off-by: Aurelien Aptel <aaptel@xxxxxxxx> --- fs/cifs/file.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/fs/cifs/file.c b/fs/cifs/file.c index 89006e044973..a9a515ea2e14 100644 --- a/fs/cifs/file.c +++ b/fs/cifs/file.c @@ -4579,12 +4579,15 @@ void cifs_oplock_break(struct work_struct *work) break_lease(inode, O_RDONLY); else break_lease(inode, O_WRONLY); + + cifsFileInfo_get(cfile); rc = filemap_fdatawrite(inode->i_mapping); if (!CIFS_CACHE_READ(cinode)) { rc = filemap_fdatawait(inode->i_mapping); mapping_set_error(inode->i_mapping, rc); cifs_zap_mapping(inode); } + cifsFileInfo_put(cfile); cifs_dbg(FYI, "Oplock flush inode %p rc %d\n", inode, rc); } -- 2.16.4