// the child inode is replaced with the one returned by
// replace().
//
+ // If replace(x) returns an inode (besides x or nil) that is
+ // subsequently returned by Child(), then Child()'s caller
+ // must ensure the new child's name and parent are set/updated
+ // to Child()'s name argument and its receiver respectively.
+ // This is not necessarily done before replace(x) returns, but
+ // it must be done before Child()'s caller releases the
+ // parent's lock.
+ //
// Nil represents "no child". replace(nil) signifies that no
// child with this name exists yet. If replace() returns nil,
// the existing child should be deleted if possible.
if newchild == nil {
delete(n.inodes, name)
} else if newchild != child {
- newchild.SetParent(n, name)
n.inodes[name] = newchild
n.fileinfo.modTime = time.Now()
child = newchild
var err error
n = parent.Child(name, func(inode) inode {
n, err = parent.FS().newNode(name, perm|0755, time.Now())
+ n.SetParent(parent, name)
return n
})
if err != nil {
}
child := n.Child(name, func(inode) (child inode) {
child, err = n.FS().newNode(name, perm|os.ModeDir, time.Now())
+ child.SetParent(n, name)
return
})
if err != nil {
// Leave oldinode in olddir.
return oldinode
}
+ accepted.SetParent(newdirf.inode, newname)
return nil
})
return err
}
data, err := json.Marshal(&coll)
if err == nil {
- data = append(data, 10)
+ data = append(data, '\n')
}
return data, err
}}
gn.SetParent(dn, name)
return gn
}
- oldchild := dn.treenode.Child(name, nil)
- child := dn.treenode.Child(name, replace)
- if child != nil && child != oldchild {
- child.SetParent(dn, name)
- }
- return child
+ return dn.treenode.Child(name, replace)
}
// sync flushes in-memory data (for all files in the tree rooted at
}
node.Child(name, func(child inode) inode {
if child == nil {
- node, err = node.FS().newNode(name, 0755|os.ModeDir, node.Parent().FileInfo().ModTime())
- child = node
+ child, err = node.FS().newNode(name, 0755|os.ModeDir, node.Parent().FileInfo().ModTime())
+ child.SetParent(node, name)
+ node = child
} else if !child.IsDir() {
err = ErrFileExists
} else {
switch child := child.(type) {
case nil:
child, err = node.FS().newNode(basename, 0755, node.FileInfo().ModTime())
+ child.SetParent(node, basename)
fn = child.(*filenode)
return child
case *filenode: