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.
This commit is contained in:
Nick Craig-Wood 2018-12-21 13:55:06 +00:00
parent 13387c0838
commit 2cfe2354df

View file

@ -444,19 +444,19 @@ func (f *File) Remove() error {
if f.d.vfs.Opt.ReadOnly { if f.d.vfs.Opt.ReadOnly {
return EROFS return EROFS
} }
f.mu.Lock() f.muRW.Lock() // muRW must be locked before mu to avoid
f.muRW.Lock() f.mu.Lock() // deadlock in RWFileHandle.openPending and .close
if f.o != nil { if f.o != nil {
err := f.o.Remove() err := f.o.Remove()
if err != nil { if err != nil {
fs.Errorf(f, "File.Remove file error: %v", err) fs.Errorf(f, "File.Remove file error: %v", err)
f.muRW.Unlock()
f.mu.Unlock() f.mu.Unlock()
f.muRW.Unlock()
return err return err
} }
} }
f.muRW.Unlock()
f.mu.Unlock() f.mu.Unlock()
f.muRW.Unlock()
// Remove the item from the directory listing // Remove the item from the directory listing
f.d.delObject(f.Name()) f.d.delObject(f.Name())