diff --git a/unionfs/memunionfs.go b/unionfs/memunionfs.go index 44150995400624ca481853c3ea8220eb53166a02..cba2b43cc90b90cbe1865fffbdffbbc91098d28f 100644 --- a/unionfs/memunionfs.go +++ b/unionfs/memunionfs.go @@ -23,6 +23,8 @@ type MemUnionFs struct { mutex sync.RWMutex cond *sync.Cond nextFree int + + // TODO - should clear out backing every X file creations, to clean up unused files. readonly fuse.FileSystem @@ -379,6 +381,7 @@ func (me *memNode) Create(name string, flags uint32, mode uint32, context *fuse. n.backing = me.fs.getFilename() f, err := os.Create(n.backing) if err != nil { + log.Printf("Backing store error %q: %v", n.backing, err) return nil, nil, nil, fuse.OsErrorToErrno(err) } me.Inode().AddChild(name, n.Inode()) @@ -475,12 +478,16 @@ func (me *memNode) Open(flags uint32, context *fuse.Context) (file fuse.File, co } func (me *memNode) GetAttr(file fuse.File, context *fuse.Context) (fi *os.FileInfo, code fuse.Status) { + var sz int64 + if file != nil { + fi, _ := file.GetAttr() + sz = fi.Size + } me.mutex.RLock() defer me.mutex.RUnlock() info := me.info if file != nil { - fi, _ := file.GetAttr() - info.Size = fi.Size + info.Size = sz } return &info, fuse.OK } @@ -547,11 +554,7 @@ func (me *memNode) OpenDir(context *fuse.Context) (stream chan fuse.DirEntry, co } for k, n := range me.Inode().FsChildren() { - fi, code := n.FsNode().GetAttr(nil, nil) - if !code.Ok() { - panic("child does not have mode.") - } - ch[k] = fi.Mode + ch[k] = n.FsNode().(*memNode).info.Mode } stream = make(chan fuse.DirEntry, len(ch)) diff --git a/unionfs/memunionfs_test.go b/unionfs/memunionfs_test.go index eb448776882488b507b68af9036f9150f1918209..1dd45c01f28960380de8fe2b697d887efd996b55 100644 --- a/unionfs/memunionfs_test.go +++ b/unionfs/memunionfs_test.go @@ -222,7 +222,7 @@ func TestMemUnionFsPromote(t *testing.T) { } } -func TestMemUnionFsCreate(t *testing.T) { +func TestMemUnionFsSubdirCreate(t *testing.T) { wd, ufs, clean := setupMemUfs(t) defer clean() @@ -238,6 +238,20 @@ func TestMemUnionFsCreate(t *testing.T) { } } +func TestMemUnionFsCreate(t *testing.T) { + wd, ufs, clean := setupMemUfs(t) + defer clean() + + writeToFile(wd+"/mount/file.txt", "hello") + _, err := os.Lstat(wd + "/mount/file.txt") + CheckSuccess(err) + + r := ufs.Reap() + if r["file.txt"] == nil || r["file.txt"].Backing == "" { + t.Errorf("expect 1 file reap result: %v", r) + } +} + func TestMemUnionFsOpenUndeletes(t *testing.T) { wd, _, clean := setupMemUfs(t) defer clean()