From c4c302a27e5811ce04bb904686e657c9ed830a44 Mon Sep 17 00:00:00 2001 From: Jinmou Li Date: Wed, 16 Sep 2020 17:44:06 +0000 Subject: [PATCH] fuse: fix data race in fusefs Release() fix #3956 --- pkg/sentry/fsimpl/fuse/connection_control.go | 5 ++--- pkg/sentry/fsimpl/fuse/fusefs.go | 5 +++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pkg/sentry/fsimpl/fuse/connection_control.go b/pkg/sentry/fsimpl/fuse/connection_control.go index 50cf4a761..bfde78559 100644 --- a/pkg/sentry/fsimpl/fuse/connection_control.go +++ b/pkg/sentry/fsimpl/fuse/connection_control.go @@ -189,10 +189,9 @@ func (conn *connection) initProcessReply(out *linux.FUSEInitOut, hasSysAdminCap // Abort this FUSE connection. // It tries to acquire conn.fd.mu, conn.lock, conn.bgLock in order. // All possible requests waiting or blocking will be aborted. +// +// Preconditions: conn.fd.mu is locked. func (conn *connection) Abort(ctx context.Context) { - conn.fd.mu.Lock() - defer conn.fd.mu.Unlock() - conn.mu.Lock() conn.asyncMu.Lock() diff --git a/pkg/sentry/fsimpl/fuse/fusefs.go b/pkg/sentry/fsimpl/fuse/fusefs.go index 86922a96a..f1ffd2343 100644 --- a/pkg/sentry/fsimpl/fuse/fusefs.go +++ b/pkg/sentry/fsimpl/fuse/fusefs.go @@ -225,12 +225,13 @@ func newFUSEFilesystem(ctx context.Context, devMinor uint32, opts *filesystemOpt // Release implements vfs.FilesystemImpl.Release. func (fs *filesystem) Release(ctx context.Context) { + fs.conn.fd.mu.Lock() + fs.umounted = true fs.conn.Abort(ctx) - - fs.conn.fd.mu.Lock() // Notify all the waiters on this fd. fs.conn.fd.waitQueue.Notify(waiter.EventIn) + fs.conn.fd.mu.Unlock() fs.Filesystem.VFSFilesystem().VirtualFilesystem().PutAnonBlockDevMinor(fs.devMinor)