From 2cfe2354dfe19ad6d77fcf921f38fe9103bedef4 Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Fri, 21 Dec 2018 13:55:06 +0000 Subject: [PATCH] vfs: fix deadlock between RWFileHandle.close and File.Remove - fixes #2857 Before this change we took the locks file.mu and file.muRW in an inconsistent order - after the change we always take them in the same order to fix the deadlock. --- vfs/file.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/vfs/file.go b/vfs/file.go index 8e9f91ecc..47fdf22ab 100644 --- a/vfs/file.go +++ b/vfs/file.go @@ -444,19 +444,19 @@ func (f *File) Remove() error { if f.d.vfs.Opt.ReadOnly { return EROFS } - f.mu.Lock() - f.muRW.Lock() + f.muRW.Lock() // muRW must be locked before mu to avoid + f.mu.Lock() // deadlock in RWFileHandle.openPending and .close if f.o != nil { err := f.o.Remove() if err != nil { fs.Errorf(f, "File.Remove file error: %v", err) - f.muRW.Unlock() f.mu.Unlock() + f.muRW.Unlock() return err } } - f.muRW.Unlock() f.mu.Unlock() + f.muRW.Unlock() // Remove the item from the directory listing f.d.delObject(f.Name())