commit ae000ecdadca76c8206f5451f980f4b173d8f568
parent e9ee50f736c593762580dec92f9d4f2e8c2a401a
Author: Matsuda Kenji <info@mtkn.jp>
Date: Wed, 10 Jan 2024 16:33:44 +0900
review
Diffstat:
1 file changed, 14 insertions(+), 14 deletions(-)
diff --git a/server.go b/server.go
@@ -623,7 +623,6 @@ func sCreate(ctx context.Context, c *conn, rc <-chan *request) {
st fs.FileInfo
dirstat fs.FileInfo
err error
- file File
cfs CreaterFS
cpath string
perm FileMode
@@ -665,12 +664,11 @@ func sCreate(ctx context.Context, c *conn, rc <-chan *request) {
perm &= ^FileMode(0777) | (dirperm & FileMode(0777))
}
cpath = path.Join(r.fid.path, ifcall.Name)
- file, err = cfs.Create(cpath, r.fid.uid, ifcall.Mode, perm)
+ r.fid.file, err = cfs.Create(cpath, r.fid.uid, ifcall.Mode, perm)
if err != nil {
r.err = fmt.Errorf("create: %v", err)
goto resp
}
- r.fid.file = file
r.fid.path = cpath
r.fid.omode = ifcall.Mode
st, err = r.fid.file.Stat()
@@ -703,6 +701,9 @@ func sRead(ctx context.Context, c *conn, rc <-chan *request) {
case <-ctx.Done():
return
case r, ok := <-rc:
+ if !ok {
+ return
+ }
var (
fi fs.FileInfo
err error
@@ -710,9 +711,6 @@ func sRead(ctx context.Context, c *conn, rc <-chan *request) {
done chan struct{}
n int
)
- if !ok {
- return
- }
ifcall := r.ifcall.(*TRead)
r.fid, ok = c.fPool.lookup(ifcall.Fid)
if !ok {
@@ -732,6 +730,9 @@ func sRead(ctx context.Context, c *conn, rc <-chan *request) {
r.err = fmt.Errorf("stat: %v", err)
goto resp
}
+ if c.mSize() - IOHDRSZ < ifcall.Count {
+ ifcall.Count = c.mSize() - IOHDRSZ
+ }
data = make([]byte, ifcall.Count)
done = make(chan struct{})
go func() {
@@ -779,14 +780,13 @@ func sRead(ctx context.Context, c *conn, rc <-chan *request) {
r.fid.dirOffset += uint64(n)
r.fid.dirIndex += k
} else {
- var err error
if reader, ok := r.fid.file.(io.ReaderAt); ok {
n, err = reader.ReadAt(data, int64(ifcall.Offset))
} else {
n, err = r.fid.file.Read(data)
}
- if err != io.EOF && err != nil {
- return
+ if err == io.EOF {
+ err = nil
}
}
}()
@@ -840,7 +840,7 @@ func sWrite(ctx context.Context, c *conn, rc <-chan *request) {
r.err = ErrUnknownFid
goto resp
}
- if ifcall.Count > c.mSize()-IOHDRSZ {
+ if c.mSize()-IOHDRSZ < ifcall.Count {
ifcall.Count = c.mSize() - IOHDRSZ
}
omode = r.fid.omode & 3
@@ -906,14 +906,14 @@ func sClunk(ctx context.Context, c *conn, rc <-chan *request) {
return
}
ifcall := r.ifcall.(*TClunk)
- fid, ok := c.fPool.lookup(ifcall.Fid)
+ r.fid, ok = c.fPool.lookup(ifcall.Fid)
if !ok {
r.err = ErrUnknownFid
goto resp
}
c.fPool.delete(ifcall.Fid)
- if fid.omode != -1 {
- if err := fid.file.Close(); err != nil {
+ if r.fid.omode != -1 {
+ if err := r.fid.file.Close(); err != nil {
r.err = fmt.Errorf("close: %v", err)
goto resp
}
@@ -972,7 +972,7 @@ func sRemove(ctx context.Context, c *conn, rc <-chan *request) {
r.err = ErrOperation
goto resp
}
- // TODO: this assumes the file can be identified by its path.
+ // TODO: this assumes files can be identified by its path.
// I think the argument of RemoverFS.Remove should be Qid.Path.
if err = rfs.Remove(r.fid.path); err != nil {
r.err = fmt.Errorf("remove: %v", err)