fs: use do_splice_direct() for nfsd/ksmbd server-side-copy
authorAmir Goldstein <amir73il@gmail.com>
Thu, 30 Nov 2023 14:16:24 +0000 (16:16 +0200)
committerChristian Brauner <brauner@kernel.org>
Tue, 5 Dec 2023 11:58:02 +0000 (12:58 +0100)
commit730651268664070dbd582d7d0338b47d066d6323
tree4b91e63d7f64e112cc3431d0c9f1bc39bffc42eb
parentda40448ce4eb4de18eb7b0db61dddece32677939
fs: use do_splice_direct() for nfsd/ksmbd server-side-copy

nfsd/ksmbd call vfs_copy_file_range() with flag COPY_FILE_SPLICE to
perform kernel copy between two files on any two filesystems.

Splicing input file, while holding file_start_write() on the output file
which is on a different sb, posses a risk for fanotify related deadlocks.

We only need to call splice_file_range() from within the context of
->copy_file_range() filesystem methods with file_start_write() held.

To avoid the possible deadlocks, always use do_splice_direct() instead of
splice_file_range() for the kernel copy fallback in vfs_copy_file_range()
without holding file_start_write().

Reported-and-tested-by: Bert Karwatzki <spasswolf@web.de>
Signed-off-by: Amir Goldstein <amir73il@gmail.com>
Link: https://lore.kernel.org/r/20231130141624.3338942-4-amir73il@gmail.com
Reviewed-by: Jan Kara <jack@suse.cz>
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/read_write.c