NACK: [SRU] [B] [PATCH 0/1] fuse: fix deadlock with FUSE_PARALLEL_DIROPS

Andrea Righi andrea.righi at canonical.com
Fri Apr 12 06:45:03 UTC 2019


NACK'ing this patch. This fix is included in my last fuse-fixes pull
request:

https://lists.ubuntu.com/archives/kernel-team/2019-April/100025.html

-Andrea

On Thu, Apr 11, 2019 at 07:00:25PM +0200, Andrea Righi wrote:
> Buglink: https://bugs.launchpad.net/bugs/1823972
> 
> [Impact]
> 
>  * Enabling parallel dirops in fuse (FUSE_PARALLEL_DIROPS) may cause a race
>    condition that leave fuse inode's mutex held, triggering a deadlock
> 
>  * The problem is that the lock and unlock paths are relying on
>    get_fuse_conn(inode)->parallel_dirops to decide if the mutex needs to be
>    acquired/released, but its value might be set in the lock path and unset in
>    the unlock path (leaving the mutex held)
> 
>  * See also: https://github.com/hanwen/go-fuse/issues/281
> 
> [Test Case]
> 
>  * A test case that triggers the bug almost immediately can be found here
>    https://github.com/hanwen/go-fuse/pull/288
> 
> [Fix]
> 
>  * Instead of relying on get_fuse_conn(inode)->parallel_dirops both in
>    fuse_lock_inode() and fuse_unlock_inode(), only check this flag in the
>    locking path and pass a variable to fuse_unlock_inode() to determine if the
>    mutex was acquired or not
> 
> [Regression Potential]
> 
>  * Fix has been tested on the affected platform. It is an upstream fix that
>    seems to affect only 4.7+ kernels, more exactly in our case only Bionic
>    kernels (and derived) are affected. Cosmic and above already include
>    this fix. So regression potential is minimal.
> 
> Miklos Szeredi (1):
>       fuse: fix initial parallel dirops
> 
>  fs/fuse/dir.c    | 10 ++++++----
>  fs/fuse/fuse_i.h |  4 ++--
>  fs/fuse/inode.c  | 14 ++++++++++----
>  3 files changed, 18 insertions(+), 10 deletions(-)
> 
> 



More information about the kernel-team mailing list