fs: move file_start_write() into direct_splice_actor()
authorAmir Goldstein <amir73il@gmail.com>
Thu, 30 Nov 2023 14:16:23 +0000 (16:16 +0200)
committerChristian Brauner <brauner@kernel.org>
Fri, 1 Dec 2023 10:39:50 +0000 (11:39 +0100)
commitda40448ce4eb4de18eb7b0db61dddece32677939
tree8e9b7d76b71343504a594db874ad0b7192718f0f
parent488e8f685207e0758398963d6834f81e5e61c162
fs: move file_start_write() into direct_splice_actor()

The callers of do_splice_direct() hold file_start_write() on the output
file.

This may cause file permission hooks to be called indirectly on an
overlayfs lower layer, which is on the same filesystem of the output
file and could lead to deadlock with fanotify permission events.

To fix this potential deadlock, move file_start_write() from the callers
into the direct_splice_actor(), so file_start_write() will not be held
while splicing from the input file.

Suggested-by: Josef Bacik <josef@toxicpanda.com>
Link: https://lore.kernel.org/r/20231128214258.GA2398475@perftesting/
Reviewed-by: Jan Kara <jack@suse.cz>
Signed-off-by: Amir Goldstein <amir73il@gmail.com>
Link: https://lore.kernel.org/r/20231130141624.3338942-3-amir73il@gmail.com
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/overlayfs/copy_up.c
fs/read_write.c
fs/splice.c