commit a4b7793e6aa51b61b1a62c1e47de896c352fa1b2
parent de042609aceb41a20f8c18eac743d73900714558
Author: Matsuda Kenji <info@mtkn.jp>
Date: Mon, 4 Sep 2023 09:06:01 +0900
implement qid vers for iofs
Diffstat:
4 files changed, 28 insertions(+), 13 deletions(-)
diff --git a/iofs/file.go b/iofs/file.go
@@ -41,7 +41,6 @@ func (f *File) Qid() lib9p.Qid {
qid, err := f.fs.qidPool.alloc(f)
if err != nil {
panic(fmt.Errorf("alloc qid: %v", err))
- return lib9p.Qid{}
}
return qid
}
diff --git a/iofs/qid.go b/iofs/qid.go
@@ -2,14 +2,20 @@ package iofs
import (
"fmt"
+ "time"
"lib9p"
)
type fileID string
+type qidRec struct {
+ qid *lib9p.Qid
+ mtime time.Time
+}
+
type QidPool struct {
- m map[fileID]lib9p.Qid
+ m map[fileID]*qidRec
nextQid uint64
}
@@ -24,7 +30,7 @@ func (f *File) id() (fileID, error) {
func allocQidPool() *QidPool {
return &QidPool{
- m: make(map[fileID]lib9p.Qid),
+ m: make(map[fileID]*qidRec),
}
}
@@ -33,8 +39,17 @@ func (pool *QidPool) lookup(f *File) (lib9p.Qid, bool) {
if err != nil {
return lib9p.Qid{}, false
}
- qid, ok := pool.m[id]
- return qid, ok
+ qreq, ok := pool.m[id]
+ if !ok {
+ return lib9p.Qid{}, false
+ }
+
+ mtime := time.Unix(int64(f.Mtime()), 0)
+ if qreq.mtime.Before(mtime) {
+ qreq.qid.Vers++
+ qreq.mtime = mtime
+ }
+ return *qreq.qid, ok
}
func (pool *QidPool) alloc(f *File) (lib9p.Qid, error) {
@@ -47,13 +62,13 @@ func (pool *QidPool) alloc(f *File) (lib9p.Qid, error) {
return lib9p.Qid{}, fmt.Errorf("stat %v: %v", f, err)
}
qtype := lib9p.FSModeToQidType(fi.Mode())
- qid := lib9p.Qid{
+ qid := &lib9p.Qid{
Path: pool.nextQid,
Type: qtype,
}
- pool.m[id] = qid
+ pool.m[id] = &qidRec{qid: qid, mtime: fi.ModTime()}
pool.nextQid++
- return qid, nil
+ return *qid, nil
}
func (pool *QidPool) delete(f *File) {
diff --git a/iofs/stat.go b/iofs/stat.go
@@ -18,18 +18,18 @@ func fiGid(fi fs.FileInfo) string { return "" }
func fiMuid(fi fs.FileInfo) string { return "" }
func fiQid(pool *QidPool, id fileID, fi fs.FileInfo) (lib9p.Qid, error) {
- qid, ok := pool.m[id]
+ qrec, ok := pool.m[id]
if ok {
- return qid, nil
+ return *qrec.qid, nil
}
qtype := lib9p.FSModeToQidType(fi.Mode())
- qid = lib9p.Qid{
+ qid := &lib9p.Qid{
Path: pool.nextQid,
Type: qtype,
}
- pool.m[id] = qid
+ pool.m[id] = &qidRec{qid: qid, mtime: fi.ModTime()}
pool.nextQid++
- return qid, nil
+ return *qid, nil
}
func fiStat(pool *QidPool, id fileID, fi fs.FileInfo) *lib9p.Stat {
diff --git a/testdir/b b/testdir/b
@@ -0,0 +1 @@
+update