X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/f34a8d68bdd096cf1b019a9806bd1e6eba028d77..HEAD:/sdk/go/arvados/fs_lookup.go diff --git a/sdk/go/arvados/fs_lookup.go b/sdk/go/arvados/fs_lookup.go index 2bb09995e1..7f22449318 100644 --- a/sdk/go/arvados/fs_lookup.go +++ b/sdk/go/arvados/fs_lookup.go @@ -48,7 +48,19 @@ func (ln *lookupnode) Readdir() ([]os.FileInfo, error) { return nil, err } for _, child := range all { - _, err = ln.treenode.Child(child.FileInfo().Name(), func(inode) (inode, error) { + var name string + if hl, ok := child.(*hardlink); ok && hl.inode == ln { + // If child is a hardlink to its + // parent, FileInfo()->RLock() will + // deadlock, because we already have + // the write lock. In this situation + // we can safely access the hardlink's + // name directly. + name = hl.name + } else { + name = child.FileInfo().Name() + } + _, err = ln.treenode.Child(name, func(inode) (inode, error) { return child, nil }) if err != nil {