Commit 2409b436 authored by Ivan Krasin's avatar Ivan Krasin

Simplified return values for openDir/releaseDir/readDir/getAttr

parent d75bba60
...@@ -92,7 +92,8 @@ func dispatch(fs FileSystem, h *InHeader, r *bytes.Buffer, c *managerClient, err ...@@ -92,7 +92,8 @@ func dispatch(fs FileSystem, h *InHeader, r *bytes.Buffer, c *managerClient, err
case FUSE_READDIR: case FUSE_READDIR:
return parseInvoke(readDir, fs, h, r, c, new(ReadIn)) return parseInvoke(readDir, fs, h, r, c, new(ReadIn))
case FUSE_LOOKUP: case FUSE_LOOKUP:
return lookup(h, r, c) out, status := lookup(h, r, c)
return serialize(h, status, out)
case FUSE_RELEASEDIR: case FUSE_RELEASEDIR:
return parseInvoke(releaseDir, fs, h, r, c, new(ReleaseIn)) return parseInvoke(releaseDir, fs, h, r, c, new(ReleaseIn))
default: default:
...@@ -113,11 +114,15 @@ func parse(b *bytes.Buffer, data interface{}) bool { ...@@ -113,11 +114,15 @@ func parse(b *bytes.Buffer, data interface{}) bool {
panic(fmt.Sprintf("Cannot parse %v", data)) panic(fmt.Sprintf("Cannot parse %v", data))
} }
type handler func(fs FileSystem, h *InHeader, ing interface{}, c *managerClient) [][]byte type handler func(fs FileSystem, h *InHeader, ing interface{}, c *managerClient) (out interface{}, status Status)
func parseInvoke(f handler, fs FileSystem, h *InHeader, b *bytes.Buffer, c *managerClient, ing interface{}) [][]byte { func parseInvoke(f handler, fs FileSystem, h *InHeader, b *bytes.Buffer, c *managerClient, ing interface{}) [][]byte {
if parse(b, ing) { if parse(b, ing) {
return f(fs, h, ing, c) out, status := f(fs, h, ing, c)
if status != OK {
out = nil
}
return serialize(h, status, out)
} }
return serialize(h, EIO, nil) return serialize(h, EIO, nil)
} }
...@@ -150,16 +155,16 @@ func serialize(h *InHeader, res Status, out interface{}) (data [][]byte) { ...@@ -150,16 +155,16 @@ func serialize(h *InHeader, res Status, out interface{}) (data [][]byte) {
return return
} }
func initFuse(fs FileSystem, h *InHeader, ing interface{}, c *managerClient) (data [][]byte) { func initFuse(fs FileSystem, h *InHeader, ing interface{}, c *managerClient) (interface{}, Status) {
in, _ := ing.(*InitIn) in, _ := ing.(*InitIn)
fmt.Printf("in: %v\n", in) fmt.Printf("in: %v\n", in)
if in.Major != FUSE_KERNEL_VERSION { if in.Major != FUSE_KERNEL_VERSION {
fmt.Printf("Major versions does not match. Given %d, want %d\n", in.Major, FUSE_KERNEL_VERSION) fmt.Printf("Major versions does not match. Given %d, want %d\n", in.Major, FUSE_KERNEL_VERSION)
return serialize(h, EIO, nil) return nil, EIO
} }
if in.Minor < FUSE_KERNEL_MINOR_VERSION { if in.Minor < FUSE_KERNEL_MINOR_VERSION {
fmt.Printf("Minor version is less than we support. Given %d, want at least %d\n", in.Minor, FUSE_KERNEL_MINOR_VERSION) fmt.Printf("Minor version is less than we support. Given %d, want at least %d\n", in.Minor, FUSE_KERNEL_MINOR_VERSION)
return serialize(h, EIO, nil) return nil, EIO
} }
out := new(InitOut) out := new(InitOut)
out.Major = FUSE_KERNEL_VERSION out.Major = FUSE_KERNEL_VERSION
...@@ -167,53 +172,53 @@ func initFuse(fs FileSystem, h *InHeader, ing interface{}, c *managerClient) (da ...@@ -167,53 +172,53 @@ func initFuse(fs FileSystem, h *InHeader, ing interface{}, c *managerClient) (da
out.MaxReadAhead = in.MaxReadAhead out.MaxReadAhead = in.MaxReadAhead
out.Flags = FUSE_ASYNC_READ | FUSE_POSIX_LOCKS out.Flags = FUSE_ASYNC_READ | FUSE_POSIX_LOCKS
out.MaxWrite = 65536 out.MaxWrite = 65536
return serialize(h, OK, out) return out, OK
} }
func getAttr(fs FileSystem, h *InHeader, ing interface{}, c *managerClient) (data [][]byte) { func getAttr(fs FileSystem, h *InHeader, ing interface{}, c *managerClient) (interface{}, Status) {
in := ing.(*GetAttrIn) in := ing.(*GetAttrIn)
fmt.Printf("FUSE_GETATTR: %v, Fh: %d\n", in, in.Fh) fmt.Printf("FUSE_GETATTR: %v, Fh: %d\n", in, in.Fh)
out := new(AttrOut) out := new(AttrOut)
resp := c.getPath(in.Fh) resp := c.getPath(in.Fh)
if resp.status != OK { if resp.status != OK {
return serialize(h, resp.status, nil) return nil, resp.status
} }
attr, res := fs.GetAttr(resp.path) attr, res := fs.GetAttr(resp.path)
if res != OK { if res != OK {
return serialize(h, res, nil) return nil, res
} }
if attr != nil { if attr != nil {
out.Attr = *attr out.Attr = *attr
} else { } else {
return serialize(h, EIO, nil) return nil, EIO
} }
out.Ino = h.NodeId out.Ino = h.NodeId
return serialize(h, res, out) return out, OK
} }
func getXAttr(fs FileSystem, h *InHeader, ing interface{}, c *managerClient) (data [][]byte) { func getXAttr(fs FileSystem, h *InHeader, ing interface{}, c *managerClient) (interface{}, Status) {
out := new(GetXAttrOut) out := new(GetXAttrOut)
return serialize(h, OK, out) return out, OK
} }
func openDir(fs FileSystem, h *InHeader, ing interface{}, c *managerClient) (data [][]byte) { func openDir(fs FileSystem, h *InHeader, ing interface{}, c *managerClient) (interface{}, Status) {
in := ing.(*OpenIn) in := ing.(*OpenIn)
fmt.Printf("FUSE_OPENDIR: %v\n", in) fmt.Printf("FUSE_OPENDIR: %v\n", in)
resp := c.openDir(h.NodeId) resp := c.openDir(h.NodeId)
if resp.status != OK { if resp.status != OK {
return serialize(h, resp.status, nil) return nil, resp.status
} }
out := new(OpenOut) out := new(OpenOut)
out.Fh = resp.fh out.Fh = resp.fh
return serialize(h, OK, out) return out, OK
} }
func readDir(fs FileSystem, h *InHeader, ing interface{}, c *managerClient) (data [][]byte) { func readDir(fs FileSystem, h *InHeader, ing interface{}, c *managerClient) (interface{}, Status) {
in := ing.(*ReadIn) in := ing.(*ReadIn)
fmt.Printf("FUSE_READDIR: %v\n", in) fmt.Printf("FUSE_READDIR: %v\n", in)
resp := c.getDirReader(h.NodeId, in.Fh) resp := c.getDirReader(h.NodeId, in.Fh)
if resp.status != OK { if resp.status != OK {
return serialize(h, resp.status, nil) return nil, resp.status
} }
dirRespChan := make(chan *dirResponse, 1) dirRespChan := make(chan *dirResponse, 1)
fmt.Printf("Sending dir request, in.Offset: %v\n", in.Offset) fmt.Printf("Sending dir request, in.Offset: %v\n", in.Offset)
...@@ -222,10 +227,10 @@ func readDir(fs FileSystem, h *InHeader, ing interface{}, c *managerClient) (dat ...@@ -222,10 +227,10 @@ func readDir(fs FileSystem, h *InHeader, ing interface{}, c *managerClient) (dat
dirResp := <-dirRespChan dirResp := <-dirRespChan
fmt.Printf("received %v\n", dirResp) fmt.Printf("received %v\n", dirResp)
if dirResp.status != OK { if dirResp.status != OK {
return serialize(h, dirResp.status, nil) return nil, dirResp.status
} }
if dirResp.entries == nil { if dirResp.entries == nil {
return serialize(h, OK, nil) return nil, OK
} }
buf := new(bytes.Buffer) buf := new(bytes.Buffer)
...@@ -249,32 +254,32 @@ func readDir(fs FileSystem, h *InHeader, ing interface{}, c *managerClient) (dat ...@@ -249,32 +254,32 @@ func readDir(fs FileSystem, h *InHeader, ing interface{}, c *managerClient) (dat
} }
} }
out := buf.Bytes() out := buf.Bytes()
return serialize(h, OK, out) return out, OK
} }
func lookup(h *InHeader, r *bytes.Buffer, c *managerClient) (data [][]byte) { func lookup(h *InHeader, r *bytes.Buffer, c *managerClient) (interface{}, Status) {
filename := string(r.Bytes()) filename := string(r.Bytes())
fmt.Printf("filename: %s\n", filename) fmt.Printf("filename: %s\n", filename)
resp := c.lookup(h.NodeId, filename) resp := c.lookup(h.NodeId, filename)
if resp.status != OK { if resp.status != OK {
return serialize(h, resp.status, nil) return nil, resp.status
} }
out := new(EntryOut) out := new(EntryOut)
out.NodeId = resp.nodeId out.NodeId = resp.nodeId
out.Attr = *resp.attr out.Attr = *resp.attr
out.AttrValid = 60 out.AttrValid = 60
out.EntryValid = 60 out.EntryValid = 60
return serialize(h, OK, out) return out, OK
} }
func releaseDir(fs FileSystem, h *InHeader, ing interface{}, c *managerClient) (data [][]byte) { func releaseDir(fs FileSystem, h *InHeader, ing interface{}, c *managerClient) (interface{}, Status) {
in := ing.(*ReleaseIn) in := ing.(*ReleaseIn)
fmt.Printf("FUSE_RELEASEDIR: %v\n", in) fmt.Printf("FUSE_RELEASEDIR: %v\n", in)
resp := c.closeDir(h.NodeId, in.Fh) resp := c.closeDir(h.NodeId, in.Fh)
if resp.status != OK { if resp.status != OK {
return serialize(h, resp.status, nil) return nil, resp.status
} }
return serialize(h, OK, nil) return nil, OK
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment