lib9p

Go 9P library.
Log | Files | Refs

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:
Miofs/file.go | 1-
Miofs/qid.go | 29++++++++++++++++++++++-------
Miofs/stat.go | 10+++++-----
Mtestdir/b | 1+
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