Commit 1e3f6cf9 authored by Han-Wen Nienhuys's avatar Han-Wen Nienhuys

Fix handling of unimplemented opcodes (include IOCTL).

Make MountState.write private.
parent df2ff6a1
...@@ -68,29 +68,6 @@ func (me *MountState) Unmount() os.Error { ...@@ -68,29 +68,6 @@ func (me *MountState) Unmount() os.Error {
return result return result
} }
func (me *MountState) Write(req *request) {
if me.LatencyMap != nil {
req.preWriteNs = time.Nanoseconds()
}
if req.outHeaderBytes == nil {
return
}
var err os.Error
if req.flatData == nil {
_, err = me.mountFile.Write(req.outHeaderBytes)
} else {
_, err = Writev(me.mountFile.Fd(),
[][]byte{req.outHeaderBytes, req.flatData})
}
if err != nil {
log.Printf("writer: Write/Writev %v failed, err: %v. opcode: %v",
req.outHeaderBytes, err, operationName(req.inHeader.opcode))
}
}
func NewMountState(fs RawFileSystem) *MountState { func NewMountState(fs RawFileSystem) *MountState {
me := new(MountState) me := new(MountState)
me.mountPoint = "" me.mountPoint = ""
...@@ -207,29 +184,56 @@ func (me *MountState) handleRequest(req *request) { ...@@ -207,29 +184,56 @@ func (me *MountState) handleRequest(req *request) {
req.parse() req.parse()
if req.handler == nil { if req.handler == nil {
return req.status = ENOSYS
} }
if me.Debug {
if req.status.Ok() && me.Debug {
log.Println(req.InputDebug()) log.Println(req.InputDebug())
} }
if req.handler.Func == nil {
if req.status.Ok() && req.handler.Func == nil {
log.Printf("Unimplemented opcode %v", req.inHeader.opcode) log.Printf("Unimplemented opcode %v", req.inHeader.opcode)
req.status = ENOSYS req.status = ENOSYS
return
} }
if req.status.Ok() { if req.status.Ok() {
req.handler.Func(me, req) req.handler.Func(me, req)
} }
me.write(req)
}
func (me *MountState) write(req *request) {
// If we try to write OK, nil, we will get // If we try to write OK, nil, we will get
// error: writer: Writev [[16 0 0 0 0 0 0 0 17 0 0 0 0 0 0 0]] // error: writer: Writev [[16 0 0 0 0 0 0 0 17 0 0 0 0 0 0 0]]
// failed, err: writev: no such file or directory // failed, err: writev: no such file or directory
if req.inHeader.opcode != _OP_FORGET { if req.inHeader.opcode == _OP_FORGET {
return
}
req.serialize() req.serialize()
if me.Debug { if me.Debug {
log.Println(req.OutputDebug()) log.Println(req.OutputDebug())
} }
me.Write(req)
if me.LatencyMap != nil {
req.preWriteNs = time.Nanoseconds()
}
if req.outHeaderBytes == nil {
return
}
var err os.Error
if req.flatData == nil {
_, err = me.mountFile.Write(req.outHeaderBytes)
} else {
_, err = Writev(me.mountFile.Fd(),
[][]byte{req.outHeaderBytes, req.flatData})
}
if err != nil {
log.Printf("writer: Write/Writev %v failed, err: %v. opcode: %v",
req.outHeaderBytes, err, operationName(req.inHeader.opcode))
} }
} }
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