lib9p

Go 9P library.
Log | Files | Refs

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:
Mdiskfs/qid_unix.go | 31++++++++++++++++++++++---------
Mdiskfs/stat.go | 2+-
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)