forked from TrueCloudLab/rclone
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:
parent
13387c0838
commit
2cfe2354df
1 changed files with 4 additions and 4 deletions
|
@ -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())
|
||||||
|
|
Loading…
Add table
Reference in a new issue