commit 8a84f2d965a87e77b329f5ee8fc36bb770396eff
parent 9964bc7bfd0998c5e29e623ad1ce799ab103b178
Author: Matsuda Kenji <info@mtkn.jp>
Date: Mon, 25 Dec 2023 16:41:32 +0900
delete rOpen
Diffstat:
| M | server.go | | | 65 | ++++++++++++++++++++--------------------------------------------- |
1 file changed, 20 insertions(+), 45 deletions(-)
diff --git a/server.go b/server.go
@@ -436,9 +436,6 @@ func sWalk(ctx context.Context, s *Server, c <-chan *Req) {
}
func sOpen(ctx context.Context, s *Server, c <-chan *Req) {
- rc := make(chan *Req)
- defer close(rc)
- go rOpen(ctx, rc)
for {
select {
case <-ctx.Done():
@@ -447,31 +444,29 @@ func sOpen(ctx context.Context, s *Server, c <-chan *Req) {
if !ok {
return
}
+ var (
+ p fs.FileMode
+ err error
+ qid Qid
+ st fs.FileInfo
+ )
ifcall := r.Ifcall.(*TOpen)
r.Fid, ok = s.fPool.lookup(ifcall.Fid)
if !ok {
r.err = ErrUnknownFid
- rc <- r
- continue
+ goto resp
}
if r.Fid.OMode != -1 {
r.err = ErrBotch
- rc <- r
- continue
+ goto resp
}
- var (
- err error
- qid Qid
- st fs.FileInfo
- )
if afile, ok := r.Fid.File.(*AuthFile); ok {
// s.Auth should set r.Fid.File to a valid *AuthFile,
// so r.Fid.File should not be nil.
st, err = r.Fid.File.Stat()
if err != nil {
r.err = fmt.Errorf("stat: %v", err)
- rc <- r
- continue
+ goto resp
}
qid = afile.Qid
} else {
@@ -482,17 +477,14 @@ func sOpen(ctx context.Context, s *Server, c <-chan *Req) {
st, err = fs.Stat(ExportFS{s.fs}, r.Fid.path)
if err != nil {
r.err = fmt.Errorf("stat: %v", err)
- rc <- r
- continue
+ goto resp
}
qid = st.Sys().(*Stat).Qid
}
if qid.Type == QTDIR && ifcall.Mode != OREAD {
r.err = fmt.Errorf("is a directory")
- rc <- r
- continue
+ goto resp
}
- var p fs.FileMode
switch ifcall.Mode & 3 {
default:
panic("invalid mode")
@@ -510,64 +502,47 @@ func sOpen(ctx context.Context, s *Server, c <-chan *Req) {
}
if qid.Type&QTDIR != 0 && p != AREAD {
r.err = ErrPerm
- rc <- r
- continue
+ goto resp
}
if !hasPerm(s.fs, st, r.Fid.Uid, p) {
r.err = ErrPerm
- rc <- r
- continue
+ goto resp
}
if ifcall.Mode&ORCLOSE != 0 {
parentPath := path.Dir(r.Fid.path)
st, err := fs.Stat(ExportFS{s.fs}, parentPath)
if err != nil {
r.err = fmt.Errorf("stat parent: %v", err)
- rc <- r
- continue
+ goto resp
}
if !hasPerm(s.fs, st, r.Fid.Uid, AWRITE) {
r.err = ErrPerm
- rc <- r
- continue
+ goto resp
}
}
r.Ofcall = &ROpen{
Qid: qid,
Iounit: s.mSize() - IOHDRSZ,
}
- rc <- r
- }
- }
-}
-
-func rOpen(ctx context.Context, c <-chan *Req) {
- for {
- select {
- case <-ctx.Done():
- return
- case r, ok := <-c:
- if !ok {
- return
- }
+ resp:
if r.err != nil {
setError(r, r.err)
- r.Srv.respChan <- r
+ s.respChan <- r
continue
}
r.Fid.OMode = r.Ifcall.(*TOpen).Mode
if _, ok := r.Fid.File.(*AuthFile); ok {
- r.Srv.respChan <- r
+ s.respChan <- r
continue
}
f, err := r.Srv.fs.OpenFile(r.Fid.path, r.Fid.OMode)
if err != nil {
setError(r, err)
- r.Srv.respChan <- r
+ s.respChan <- r
continue
}
r.Fid.File = f
- r.Srv.respChan <- r
+ s.respChan <- r
}
}
}