fuse: fix leak of fuse_io_priv
authorMiklos Szeredi <mszeredi@redhat.com>
Mon, 25 Nov 2019 19:48:46 +0000 (20:48 +0100)
committerMiklos Szeredi <mszeredi@redhat.com>
Wed, 27 Nov 2019 08:33:49 +0000 (09:33 +0100)
commitf1ebdeffc6f325e30e0ddb9f7a70f1370fa4b851
treea8d7d385f2201a03c01e17b9e088c1dd21b8680e
parent724c15a43e2c7ac26e2d07abef99191162498fa9
fuse: fix leak of fuse_io_priv

exit_aio() is sometimes stuck in wait_for_completion() after aio is issued
with direct IO and the task receives a signal.

The reason is failure to call ->ki_complete() due to a leaked reference to
fuse_io_priv.  This happens in fuse_async_req_send() if
fuse_simple_background() returns an error (e.g. -EINTR).

In this case the error value is propagated via io->err, so return success
to not confuse callers.

This issue is tracked as a virtio-fs issue:
https://gitlab.com/virtio-fs/qemu/issues/14

Reported-by: Masayoshi Mizuma <m.mizuma@jp.fujitsu.com>
Fixes: 45ac96ed7c36 ("fuse: convert direct_io to simple api")
Cc: <stable@vger.kernel.org> # v5.4
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
fs/fuse/file.c