-func (dn *dirnode) makeParentDirs(name string) (err error) {
- names := strings.Split(name, "/")
- for _, name := range names[:len(names)-1] {
- f, err := dn.OpenFile(name, os.O_CREATE, os.ModeDir|0755)
- if err != nil {
- return err
+// only safe to call from loadManifest -- no locking
+func (dn *dirnode) createFileAndParents(path string) (fn *filenode, err error) {
+ names := strings.Split(path, "/")
+ if basename := names[len(names)-1]; basename == "" || basename == "." || basename == ".." {
+ err = fmt.Errorf("invalid filename")
+ return
+ }
+ var node inode = dn
+ for i, name := range names {
+ dn, ok := node.(*dirnode)
+ if !ok {
+ err = ErrFileExists
+ return