]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/commit
NFSv4 fix CLOSE not waiting for direct IO compeletion
authorOlga Kornievskaia <olga.kornievskaia@gmail.com>
Wed, 24 Jun 2020 17:54:08 +0000 (13:54 -0400)
committerKhalid Elmously <khalid.elmously@canonical.com>
Sat, 8 Aug 2020 05:53:12 +0000 (01:53 -0400)
commitb5d1ff506b16f1a17a467b9c1c0c9fcdfb286df4
treef66701187dc6282327133378d12426634aac79bd
parent353162b036a7864eec4c49570ccb40a5dbd82fb0
NFSv4 fix CLOSE not waiting for direct IO compeletion

BugLink: https://bugs.launchpad.net/bugs/1885942
commit d03727b248d0dae6199569a8d7b629a681154633 upstream.

Figuring out the root case for the REMOVE/CLOSE race and
suggesting the solution was done by Neil Brown.

Currently what happens is that direct IO calls hold a reference
on the open context which is decremented as an asynchronous task
in the nfs_direct_complete(). Before reference is decremented,
control is returned to the application which is free to close the
file. When close is being processed, it decrements its reference
on the open_context but since directIO still holds one, it doesn't
sent a close on the wire. It returns control to the application
which is free to do other operations. For instance, it can delete a
file. Direct IO is finally releasing its reference and triggering
an asynchronous close. Which races with the REMOVE. On the server,
REMOVE can be processed before the CLOSE, failing the REMOVE with
EACCES as the file is still opened.

Signed-off-by: Olga Kornievskaia <kolga@netapp.com>
Suggested-by: Neil Brown <neilb@suse.com>
CC: stable@vger.kernel.org
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Kelsey Skunberg <kelsey.skunberg@canonical.com>
fs/nfs/direct.c
fs/nfs/file.c