Merge branch '21535-multi-wf-delete'
[arvados.git] / sdk / go / arvados / fs_lookup.go
index 2bb09995e16e476b3889abbdc1c61b6fc1abbd15..7f2244931877aff551e5f1c0687d81d4cc8c49ed 100644 (file)
@@ -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 {