commit 3b209d1b8a0ca38028a80a06ce3bbf7a97809099
parent a4b7793e6aa51b61b1a62c1e47de896c352fa1b2
Author: Matsuda Kenji <info@mtkn.jp>
Date: Mon, 4 Sep 2023 10:51:20 +0900
imcrement qid vers for diskfs
Diffstat:
2 files changed, 23 insertions(+), 10 deletions(-)
diff --git a/diskfs/qid_unix.go b/diskfs/qid_unix.go
@@ -4,6 +4,7 @@ import (
"fmt"
"io/fs"
"syscall"
+ "time"
"lib9p"
)
@@ -13,8 +14,13 @@ type fileID struct {
inode uint64
}
+type qidRec struct {
+ qid *lib9p.Qid
+ mtime time.Time
+}
+
type QidPool struct {
- m map[fileID]lib9p.Qid
+ m map[fileID]*qidRec
nextQid uint64
}
@@ -38,7 +44,7 @@ func idFromInfo(info fs.FileInfo) fileID {
func allocQidPool() *QidPool {
return &QidPool{
- m: make(map[fileID]lib9p.Qid),
+ m: make(map[fileID]*qidRec),
}
}
@@ -47,12 +53,19 @@ func (pool *QidPool) lookup(f *File) (lib9p.Qid, bool) {
if err != nil {
return lib9p.Qid{}, false
}
- return pool.lookupID(id)
+ return pool.lookupID(id, time.Unix(int64(f.Mtime()), 0))
}
-func (pool *QidPool) lookupID(id fileID) (lib9p.Qid, bool) {
- qid, ok := pool.m[id]
- return qid, ok
+func (pool *QidPool) lookupID(id fileID, mtime time.Time) (lib9p.Qid, bool) {
+ qrec, ok := pool.m[id]
+ if !ok {
+ return lib9p.Qid{}, false
+ }
+ if qrec.mtime.Before(mtime) {
+ qrec.qid.Vers++
+ qrec.mtime = mtime
+ }
+ return *qrec.qid, ok
}
func (pool *QidPool) alloc(f *File) (lib9p.Qid, error) {
@@ -69,13 +82,13 @@ func (pool *QidPool) alloc(f *File) (lib9p.Qid, error) {
func (pool *QidPool) allocID(id fileID, info fs.FileInfo) (lib9p.Qid, error) {
qtype := lib9p.FSModeToQidType(info.Mode())
- qid := lib9p.Qid{
+ qid := &lib9p.Qid{
Path: pool.nextQid,
Type: qtype,
}
- pool.m[id] = qid
+ pool.m[id] = &qidRec{qid: qid, mtime: info.ModTime()}
pool.nextQid++
- return qid, nil
+ return *qid, nil
}
func (pool *QidPool) delete(f *File) {
diff --git a/diskfs/stat.go b/diskfs/stat.go
@@ -11,7 +11,7 @@ import (
)
func fiStat(pool *QidPool, id fileID, info fs.FileInfo) *lib9p.Stat {
- qid, ok := pool.lookupID(id)
+ qid, ok := pool.lookupID(id, info.ModTime())
if !ok {
var err error
qid, err = pool.allocID(id, info)