X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/41eaf4e3b1601b8794f9e1b1abdd610ff3b1855b..ffe48ca94f89f3d7b71305b394e1f57ee633efed:/sdk/go/arvados/fs_base.go diff --git a/sdk/go/arvados/fs_base.go b/sdk/go/arvados/fs_base.go index 6da639edaf..274d207022 100644 --- a/sdk/go/arvados/fs_base.go +++ b/sdk/go/arvados/fs_base.go @@ -641,7 +641,15 @@ func (fs *fileSystem) Rename(oldname, newname string) error { } locked := map[sync.Locker]bool{} for i := len(needLock) - 1; i >= 0; i-- { - if n := needLock[i]; !locked[n] { + n := needLock[i] + if fs, ok := n.(interface{ rootnode() inode }); ok { + // Lock the fs's root dir directly, not + // through the fs. Otherwise our "locked" map + // would not reliably prevent double-locking + // the fs's root dir. + n = fs.rootnode() + } + if !locked[n] { n.Lock() defer n.Unlock() locked[n] = true