From c4de9154918268890a4ff1ef9a41fb02e64759ef Mon Sep 17 00:00:00 2001 From: Aaron Jacobs Date: Fri, 6 Mar 2015 05:59:06 +1100 Subject: [PATCH 1/6] MemFSTest.Chmod --- samples/memfs/memfs_test.go | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/samples/memfs/memfs_test.go b/samples/memfs/memfs_test.go index 6bd4252..884bb9d 100644 --- a/samples/memfs/memfs_test.go +++ b/samples/memfs/memfs_test.go @@ -859,7 +859,6 @@ func (t *MemFSTest) ReadsPastEndOfFile() { func (t *MemFSTest) Truncate_Smaller() { var err error - fileName := path.Join(t.mfs.Dir(), "foo") // Create a file. @@ -888,7 +887,6 @@ func (t *MemFSTest) Truncate_Smaller() { func (t *MemFSTest) Truncate_SameSize() { var err error - fileName := path.Join(t.mfs.Dir(), "foo") // Create a file. @@ -917,7 +915,6 @@ func (t *MemFSTest) Truncate_SameSize() { func (t *MemFSTest) Truncate_Larger() { var err error - fileName := path.Join(t.mfs.Dir(), "foo") // Create a file. @@ -945,7 +942,21 @@ func (t *MemFSTest) Truncate_Larger() { } func (t *MemFSTest) Chmod() { - AssertTrue(false, "TODO") + var err error + fileName := path.Join(t.mfs.Dir(), "foo") + + // Create a file. + err = ioutil.WriteFile(fileName, []byte(""), 0600) + AssertEq(nil, err) + + // Chmod it. + err = os.Chmod(fileName, 0754) + AssertEq(nil, err) + + // Stat it. + fi, err := os.Stat(fileName) + AssertEq(nil, err) + ExpectEq(os.FileMode(0754), fi.Mode()) } func (t *MemFSTest) Chtimes() { From f10dc3e5ee1da60a7f97ef5ebc8d8d12446fab9f Mon Sep 17 00:00:00 2001 From: Aaron Jacobs Date: Fri, 6 Mar 2015 05:59:47 +1100 Subject: [PATCH 2/6] Added a Mode field. --- file_system.go | 1 + server.go | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/file_system.go b/file_system.go index d67fcee..60840ad 100644 --- a/file_system.go +++ b/file_system.go @@ -434,6 +434,7 @@ type SetInodeAttributesRequest struct { // The attributes to modify, or nil for attributes that don't need a change. Size *uint64 + Mode *os.FileMode } type SetInodeAttributesResponse struct { diff --git a/server.go b/server.go index 811c34b..dddfc74 100644 --- a/server.go +++ b/server.go @@ -182,6 +182,10 @@ func (s *server) handleFuseRequest(fuseReq bazilfuse.Request) { req.Size = &typed.Size } + if typed.Valid&bazilfuse.SetattrMode != 0 { + req.Mode = &typed.Mode + } + // Call the file system. resp, err := s.fs.SetInodeAttributes(ctx, req) if err != nil { From 13335f6e9b4a3614f71055b77dc1007036eb5646 Mon Sep 17 00:00:00 2001 From: Aaron Jacobs Date: Fri, 6 Mar 2015 06:00:55 +1100 Subject: [PATCH 3/6] Support changing mode. --- samples/memfs/fs.go | 2 +- samples/memfs/inode.go | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/samples/memfs/fs.go b/samples/memfs/fs.go index 730636f..49a1f69 100644 --- a/samples/memfs/fs.go +++ b/samples/memfs/fs.go @@ -281,7 +281,7 @@ func (fs *memFS) SetInodeAttributes( defer inode.mu.Unlock() // Handle the request. - inode.SetAttributes(req.Size) + inode.SetAttributes(req.Size, req.Mode) // Fill in the response. resp.Attributes = inode.attributes diff --git a/samples/memfs/inode.go b/samples/memfs/inode.go index a878fcc..0ea3d5b 100644 --- a/samples/memfs/inode.go +++ b/samples/memfs/inode.go @@ -373,7 +373,7 @@ func (inode *inode) WriteAt(p []byte, off int64) (n int, err error) { // Update attributes from non-nil parameters. // // EXCLUSIVE_LOCKS_REQUIRED(inode.mu) -func (inode *inode) SetAttributes(size *uint64) { +func (inode *inode) SetAttributes(size *uint64, mode *os.FileMode) { // Update the modification time. inode.attributes.Mtime = inode.clock.Now() @@ -392,4 +392,9 @@ func (inode *inode) SetAttributes(size *uint64) { // Update attributes. inode.attributes.Size = *size } + + // Change mode? + if mode != nil { + inode.attributes.Mode = *mode + } } From 76ac5cc2647c35f4b4e62f3547d4a425023acaa7 Mon Sep 17 00:00:00 2001 From: Aaron Jacobs Date: Fri, 6 Mar 2015 06:02:43 +1100 Subject: [PATCH 4/6] MemFSTest.Chtimes --- samples/memfs/memfs_test.go | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/samples/memfs/memfs_test.go b/samples/memfs/memfs_test.go index 884bb9d..c788a76 100644 --- a/samples/memfs/memfs_test.go +++ b/samples/memfs/memfs_test.go @@ -960,5 +960,20 @@ func (t *MemFSTest) Chmod() { } func (t *MemFSTest) Chtimes() { - AssertTrue(false, "TODO") + var err error + fileName := path.Join(t.mfs.Dir(), "foo") + + // Create a file. + err = ioutil.WriteFile(fileName, []byte(""), 0600) + AssertEq(nil, err) + + // Chtimes it. + expectedMtime := time.Now().Add(123 * time.Millisecond) + err = os.Chtimes(fileName, time.Time{}, expectedMtime) + AssertEq(nil, err) + + // Stat it. + fi, err := os.Stat(fileName) + AssertEq(nil, err) + ExpectEq(0, fi.ModTime().Sub(expectedMtime)) } From 1698f1604ae1b801081d8046651e0cce35beaa6e Mon Sep 17 00:00:00 2001 From: Aaron Jacobs Date: Fri, 6 Mar 2015 06:03:25 +1100 Subject: [PATCH 5/6] Added Atime and Mtime fields. --- file_system.go | 6 ++++-- server.go | 8 ++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/file_system.go b/file_system.go index 60840ad..56ccac2 100644 --- a/file_system.go +++ b/file_system.go @@ -433,8 +433,10 @@ type SetInodeAttributesRequest struct { Inode InodeID // The attributes to modify, or nil for attributes that don't need a change. - Size *uint64 - Mode *os.FileMode + Size *uint64 + Mode *os.FileMode + Atime *time.Time + Mtime *time.Time } type SetInodeAttributesResponse struct { diff --git a/server.go b/server.go index dddfc74..28ebf3e 100644 --- a/server.go +++ b/server.go @@ -186,6 +186,14 @@ func (s *server) handleFuseRequest(fuseReq bazilfuse.Request) { req.Mode = &typed.Mode } + if typed.Valid&bazilfuse.SetattrAtime != 0 { + req.Atime = &typed.Atime + } + + if typed.Valid&bazilfuse.SetattrMtime != 0 { + req.Mtime = &typed.Mtime + } + // Call the file system. resp, err := s.fs.SetInodeAttributes(ctx, req) if err != nil { From a7d2944d2e1d8b7ebbc2f34bbc2db108ac52c304 Mon Sep 17 00:00:00 2001 From: Aaron Jacobs Date: Fri, 6 Mar 2015 06:04:51 +1100 Subject: [PATCH 6/6] Support changing mtime. --- samples/memfs/fs.go | 2 +- samples/memfs/inode.go | 11 ++++++++++- samples/memfs/memfs_test.go | 2 +- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/samples/memfs/fs.go b/samples/memfs/fs.go index 49a1f69..4a752a6 100644 --- a/samples/memfs/fs.go +++ b/samples/memfs/fs.go @@ -281,7 +281,7 @@ func (fs *memFS) SetInodeAttributes( defer inode.mu.Unlock() // Handle the request. - inode.SetAttributes(req.Size, req.Mode) + inode.SetAttributes(req.Size, req.Mode, req.Mtime) // Fill in the response. resp.Attributes = inode.attributes diff --git a/samples/memfs/inode.go b/samples/memfs/inode.go index 0ea3d5b..e906545 100644 --- a/samples/memfs/inode.go +++ b/samples/memfs/inode.go @@ -18,6 +18,7 @@ import ( "fmt" "io" "os" + "time" "github.com/jacobsa/fuse" "github.com/jacobsa/fuse/fuseutil" @@ -373,7 +374,10 @@ func (inode *inode) WriteAt(p []byte, off int64) (n int, err error) { // Update attributes from non-nil parameters. // // EXCLUSIVE_LOCKS_REQUIRED(inode.mu) -func (inode *inode) SetAttributes(size *uint64, mode *os.FileMode) { +func (inode *inode) SetAttributes( + size *uint64, + mode *os.FileMode, + mtime *time.Time) { // Update the modification time. inode.attributes.Mtime = inode.clock.Now() @@ -397,4 +401,9 @@ func (inode *inode) SetAttributes(size *uint64, mode *os.FileMode) { if mode != nil { inode.attributes.Mode = *mode } + + // Change mtime? + if mtime != nil { + inode.attributes.Mtime = *mtime + } } diff --git a/samples/memfs/memfs_test.go b/samples/memfs/memfs_test.go index c788a76..9c3d5ba 100644 --- a/samples/memfs/memfs_test.go +++ b/samples/memfs/memfs_test.go @@ -968,7 +968,7 @@ func (t *MemFSTest) Chtimes() { AssertEq(nil, err) // Chtimes it. - expectedMtime := time.Now().Add(123 * time.Millisecond) + expectedMtime := time.Now().Add(123 * time.Second).Round(time.Second) err = os.Chtimes(fileName, time.Time{}, expectedMtime) AssertEq(nil, err)