From eaa0177b80daf4c82ffae826983c5d3d245f6c5b Mon Sep 17 00:00:00 2001 From: Aaron Jacobs Date: Tue, 11 Aug 2015 06:26:46 +0000 Subject: [PATCH 1/2] Clean up mappings even on assertion failure. --- samples/flushfs/flush_fs_test.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/samples/flushfs/flush_fs_test.go b/samples/flushfs/flush_fs_test.go index 278f0ba..e787998 100644 --- a/samples/flushfs/flush_fs_test.go +++ b/samples/flushfs/flush_fs_test.go @@ -590,6 +590,8 @@ func (t *NoErrorsTest) Mmap_NoMsync_MunmapBeforeClose() { syscall.MAP_SHARED) AssertEq(nil, err) + defer syscall.Munmap(data) + AssertEq("taco", string(data)) // Modify the contents. @@ -638,6 +640,8 @@ func (t *NoErrorsTest) Mmap_NoMsync_CloseBeforeMunmap() { syscall.MAP_SHARED) AssertEq(nil, err) + defer syscall.Munmap(data) + AssertEq("taco", string(data)) // Close the file. We should see a flush. @@ -682,6 +686,8 @@ func (t *NoErrorsTest) Mmap_WithMsync_MunmapBeforeClose() { syscall.MAP_SHARED) AssertEq(nil, err) + defer syscall.Munmap(data) + AssertEq("taco", string(data)) // Modify the contents. @@ -738,6 +744,8 @@ func (t *NoErrorsTest) Mmap_WithMsync_CloseBeforeMunmap() { syscall.MAP_SHARED) AssertEq(nil, err) + defer syscall.Munmap(data) + AssertEq("taco", string(data)) // Close the file. We should see a flush. @@ -941,6 +949,7 @@ func (t *FsyncErrorTest) Msync() { syscall.MAP_SHARED) AssertEq(nil, err) + defer syscall.Munmap(data) // msync the mapping. err = msync(data) From e69b8a8c37eedad34cbe5358bb259e1348641df5 Mon Sep 17 00:00:00 2001 From: Aaron Jacobs Date: Tue, 11 Aug 2015 06:29:52 +0000 Subject: [PATCH 2/2] Implement setattr; otherwise closing after writing fails. --- samples/flushfs/flush_fs.go | 48 ++++++++++++++++++++++++++----------- 1 file changed, 34 insertions(+), 14 deletions(-) diff --git a/samples/flushfs/flush_fs.go b/samples/flushfs/flush_fs.go index 7dea888..2963519 100644 --- a/samples/flushfs/flush_fs.go +++ b/samples/flushfs/flush_fs.go @@ -90,6 +90,29 @@ func (fs *flushFS) barAttributes() fuseops.InodeAttributes { } } +// LOCKS_REQUIRED(fs.mu) +func (fs *flushFS) getAttributes(id fuseops.InodeID) ( + attrs fuseops.InodeAttributes, + err error) { + switch id { + case fuseops.RootInodeID: + attrs = fs.rootAttributes() + return + + case fooID: + attrs = fs.fooAttributes() + return + + case barID: + attrs = fs.barAttributes() + return + + default: + err = fuse.ENOENT + return + } +} + //////////////////////////////////////////////////////////////////////// // FileSystem methods //////////////////////////////////////////////////////////////////////// @@ -134,23 +157,20 @@ func (fs *flushFS) GetInodeAttributes( fs.mu.Lock() defer fs.mu.Unlock() - switch op.Inode { - case fuseops.RootInodeID: - op.Attributes = fs.rootAttributes() - return + op.Attributes, err = fs.getAttributes(op.Inode) + return +} - case fooID: - op.Attributes = fs.fooAttributes() - return +func (fs *flushFS) SetInodeAttributes( + ctx context.Context, + op *fuseops.SetInodeAttributesOp) (err error) { + fs.mu.Lock() + defer fs.mu.Unlock() - case barID: - op.Attributes = fs.barAttributes() - return + // Ignore any changes and simply return existing attributes. + op.Attributes, err = fs.getAttributes(op.Inode) - default: - err = fuse.ENOENT - return - } + return } func (fs *flushFS) OpenFile(