Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 50 additions & 0 deletions fs/serve.go
Original file line number Diff line number Diff line change
Expand Up @@ -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.
//
Expand All @@ -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.
//
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions fuse.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down