replace mem.File handles with mem.FileData when mem.FileData is all we need
diff --git a/mem/file.go b/mem/file.go
index 2ac9d3f..e92d943 100644
--- a/mem/file.go
+++ b/mem/file.go
@@ -66,20 +66,20 @@
 	return &FileData{name: name, memDir: &DirMap{}, dir: true}
 }
 
-func ChangeFileName(f *File, newname string) {
-	f.fileData.name = newname
+func ChangeFileName(f *FileData, newname string) {
+	f.name = newname
 }
 
-func SetMode(f *File, mode os.FileMode) {
-	f.fileData.mode = mode
+func SetMode(f *FileData, mode os.FileMode) {
+	f.mode = mode
 }
 
-func SetModTime(f *File, mtime time.Time) {
-	f.fileData.modtime = mtime
+func SetModTime(f *FileData, mtime time.Time) {
+	f.modtime = mtime
 }
 
-func GetFileInfo(f *File) *FileInfo {
-	return &FileInfo{f.fileData}
+func GetFileInfo(f *FileData) *FileInfo {
+	return &FileInfo{f}
 }
 
 func (f *File) Open() error {
diff --git a/memmap.go b/memmap.go
index 7e5536d..2c1ba39 100644
--- a/memmap.go
+++ b/memmap.go
@@ -64,11 +64,11 @@
 	if parent == nil {
 		log.Fatal("parent of ", f.Name(), " is nil")
 	}
-	mem.RemoveFromMemDir(parent.Data(), f.Data())
+	mem.RemoveFromMemDir(parent, f)
 	return nil
 }
 
-func (m *MemMapFs) findParent(f *mem.File) *mem.File {
+func (m *MemMapFs) findParent(f *mem.FileData) *mem.FileData {
 	pdir, _ := filepath.Split(f.Name())
 	pdir = filepath.Clean(pdir)
 	pfile, err := m.lockfreeOpen(pdir)
@@ -82,7 +82,7 @@
 	if f == nil {
 		return
 	}
-	parent := m.findParent(mem.NewFileHandle(f))
+	parent := m.findParent(f)
 	if parent == nil {
 		pdir := filepath.Dir(filepath.Clean(f.Name()))
 		err := m.lockfreeMkdir(pdir, 0777)
@@ -97,8 +97,8 @@
 		}
 	}
 
-	mem.InitializeDir(parent.Data())
-	mem.AddToMemDir(parent.Data(), f)
+	mem.InitializeDir(parent)
+	mem.AddToMemDir(parent, f)
 }
 
 func (m *MemMapFs) lockfreeMkdir(name string, perm os.FileMode) error {
@@ -106,13 +106,10 @@
 	x, ok := m.getData()[name]
 	if ok {
 		// Only return ErrFileExists if it's a file, not a directory.
-		i, err := mem.NewFileHandle(x).Stat()
+		i := mem.FileInfo{x}
 		if !i.IsDir() {
 			return ErrFileExists
 		}
-		if err != nil {
-			return err
-		}
 	} else {
 		item := mem.CreateDir(name)
 		m.getData()[name] = item
@@ -174,19 +171,14 @@
 	if !ok {
 		return nil, &os.PathError{"open", name, ErrFileNotFound}
 	}
-	ff := mem.NewFileHandle(f)
-	ff.Open()
-	return ff, nil
+	return mem.NewFileHandle(f), nil
 }
 
-func (m *MemMapFs) lockfreeOpen(name string) (*mem.File, error) {
+func (m *MemMapFs) lockfreeOpen(name string) (*mem.FileData, error) {
 	name = normalizePath(name)
 	f, ok := m.getData()[name]
 	if ok {
-		// TODO (mbertschler)
-		// not used anymore?
-		//ff.Open()
-		return mem.NewFileHandle(f), nil
+		return f, nil
 	} else {
 		return nil, ErrFileNotFound
 	}
@@ -273,7 +265,7 @@
 			m.unRegisterWithParent(oldname)
 			fileData := m.getData()[oldname]
 			delete(m.getData(), oldname)
-			mem.ChangeFileName(mem.NewFileHandle(fileData), newname)
+			mem.ChangeFileName(fileData, newname)
 			m.getData()[newname] = fileData
 			m.registerWithParent(fileData)
 			m.mu.Unlock()
@@ -292,7 +284,7 @@
 	if err != nil {
 		return nil, err
 	}
-	fi := mem.GetFileInfo(f.(*mem.File))
+	fi := mem.GetFileInfo(f.(*mem.File).Data())
 	return fi, nil
 }
 
@@ -303,9 +295,8 @@
 		return &os.PathError{"chmod", name, ErrFileNotFound}
 	}
 
-	ff := mem.NewFileHandle(f)
 	m.mu.Lock()
-	mem.SetMode(ff, mode)
+	mem.SetMode(f, mode)
 	m.mu.Unlock()
 
 	return nil
@@ -318,9 +309,8 @@
 		return &os.PathError{"chtimes", name, ErrFileNotFound}
 	}
 
-	ff := mem.NewFileHandle(f)
 	m.mu.Lock()
-	mem.SetModTime(ff, mtime)
+	mem.SetModTime(f, mtime)
 	m.mu.Unlock()
 
 	return nil
@@ -328,9 +318,8 @@
 
 func (m *MemMapFs) List() {
 	for _, x := range m.data {
-		f := mem.NewFileHandle(x)
-		y, _ := f.Stat()
-		fmt.Println(f.Name(), y.Size())
+		y := mem.FileInfo{x}
+		fmt.Println(x.Name(), y.Size())
 	}
 }