From 08fb1dafbe3a2410497f39e6b26501f5e30f4934 Mon Sep 17 00:00:00 2001 From: Shaya Potter Date: Sun, 19 Apr 2020 11:49:02 +0300 Subject: [PATCH] Call methods on Handle instead of Node when possible issue #92 attempt at calling fsync/getattr/setattr on handlles when possible --- fs/serve.go | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ fuse.go | 1 + 2 files changed, 51 insertions(+) diff --git a/fs/serve.go b/fs/serve.go index 11bbc0bd..37de2441 100644 --- a/fs/serve.go +++ b/fs/serve.go @@ -111,6 +111,10 @@ type NodeGetattrer interface { Getattr(ctx context.Context, req *fuse.GetattrRequest, resp *fuse.GetattrResponse) error } +type HandleGetattrer interface { + Getattr(ctx context.Context, req *fuse.GetattrRequest, resp *fuse.GetattrResponse) error +} + type NodeSetattrer interface { // Setattr sets the standard metadata for the receiver. // @@ -123,6 +127,10 @@ type NodeSetattrer interface { Setattr(ctx context.Context, req *fuse.SetattrRequest, resp *fuse.SetattrResponse) error } +type HandleSetattrer interface { + Setattr(ctx context.Context, req *fuse.SetattrRequest, resp *fuse.SetattrResponse) error +} + type NodeSymlinker interface { // Symlink creates a new symbolic link in the receiver, which must be a directory. // @@ -223,6 +231,10 @@ type NodeFsyncer interface { Fsync(ctx context.Context, req *fuse.FsyncRequest) error } +type HandleFsyncer interface { + Fsync(ctx context.Context, req *fuse.FsyncRequest) error +} + type NodeGetxattrer interface { // Getxattr gets an extended attribute by the given name from the // node. @@ -979,6 +991,17 @@ func (c *Server) handleRequest(ctx context.Context, node Node, snode *serveNode, // Node operations. case *fuse.GetattrRequest: s := &fuse.GetattrResponse{} + shandle := c.getHandle(r.Handle) + if shandle != nil { + if h, ok := shandle.handle.(HandleGetattrer); ok { + if err := h.Getattr(ctx, r, s); err != nil { + return err + } + done(s) + r.Respond(s) + return nil + } + } if n, ok := node.(NodeGetattrer); ok { if err := n.Getattr(ctx, r, s); err != nil { return err @@ -994,6 +1017,21 @@ func (c *Server) handleRequest(ctx context.Context, node Node, snode *serveNode, case *fuse.SetattrRequest: s := &fuse.SetattrResponse{} + shandle := c.getHandle(r.Handle) + if shandle != nil { + if h, ok := shandle.handle.(HandleSetattrer); ok { + if err := h.Setattr(ctx, r, s); err != nil { + return err + } + if err := snode.attr(ctx, &s.Attr); err != nil { + return err + } + done(s) + r.Respond(s) + return nil + } + } + if n, ok := node.(NodeSetattrer); ok { if err := n.Setattr(ctx, r, s); err != nil { return err @@ -1412,6 +1450,18 @@ func (c *Server) handleRequest(ctx context.Context, node Node, snode *serveNode, return nil case *fuse.FsyncRequest: + if shandle := c.getHandle(r.Handle); shandle != nil { + if h, ok := shandle.handle.(HandleFsyncer); ok { + err := h.Fsync(ctx, r) + if err != nil { + return err + } + done(nil) + r.Respond() + return nil + } + } + n, ok := node.(NodeFsyncer) if !ok { return syscall.EIO diff --git a/fuse.go b/fuse.go index 58bd572e..cfadce1d 100644 --- a/fuse.go +++ b/fuse.go @@ -2277,6 +2277,7 @@ func (r *MknodRequest) Respond(resp *LookupResponse) { type FsyncRequest struct { Header `json:"-"` Handle HandleID + Hndle interface{} // TODO bit 1 is datasync, not well documented upstream Flags uint32 Dir bool