lib9p

Go 9P library.
Log | Files | Refs

commit 336aea64a494009030a0fd023d7ce109526c9c84
parent f6b24e721004e3fa235451604e701c3eb86c5db6
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Thu, 14 Sep 2023 08:03:04 +0900

close os.File every time

Diffstat:
Mdiskfs/file.go | 67++++++++++++++++++++++++++++++-------------------------------------
Mdiskfs/qid_unix.go | 21++++++++++++++++++---
Mdiskfs/stat_unix.go | 14++++++++++----
Mtestdir/a | 1+
4 files changed, 59 insertions(+), 44 deletions(-)

diff --git a/diskfs/file.go b/diskfs/file.go @@ -13,7 +13,6 @@ import ( type File struct { fs *FS // file system to which this file belongs - file *os.File // underlying file path string // absolute path from the root of the fs. } @@ -54,33 +53,10 @@ func openFile(fsys *FS, fpath string, mode lib9p.OpenMode) (*File, error) { if err != nil { return nil, fmt.Errorf("fs open: %v", err) } - fsfi, err := fsfile.Stat() - if err != nil { - return nil, fmt.Errorf("stat: %v", err) - } - - var file *os.File - if fsfi.IsDir() { - file = fsfile.(*os.File) - } else { - var osmode int - switch mode { - case lib9p.OREAD: - osmode = os.O_RDONLY - case lib9p.OWRITE: - osmode = os.O_WRONLY - case lib9p.ORDWR: - osmode = os.O_RDWR - } - file, err = os.OpenFile(path.Join(fsys.rootPath, fpath), osmode, 0) - if err != nil { - return nil, fmt.Errorf("open fs: %v", err) - } - } + fsfile.Close() f := &File{ fs: fsys, - file: file, path: fpath, } return f, nil @@ -91,7 +67,13 @@ func (f *File) Fsys() lib9p.FS { } func (f *File) Stat() (*lib9p.FileInfo, error) { - fsfi, err := f.file.Stat() + file, err := f.fs.fs.Open(f.path) + if err != nil { + return nil, fmt.Errorf("open: %v", err) + } + defer file.Close() + + fsfi, err := file.Stat() if err != nil { return nil, fmt.Errorf("stat: %v", err) } @@ -128,11 +110,16 @@ func (f *File) Stat() (*lib9p.FileInfo, error) { } func (f *File) Close() error { - return f.file.Close() + return nil } func (f *File) Read(b []byte) (int, error) { - return f.file.Read(b) + file, err := f.fs.fs.Open(f.path) + if err != nil { + return 0, fmt.Errorf("open: %v", err) + } + defer file.Close() + return file.Read(b) } func (f *File) Parent() (lib9p.File, error) { @@ -145,17 +132,13 @@ func (f *File) Parent() (lib9p.File, error) { } func (f *File) Child() ([]lib9p.File, error) { - if err := f.file.Close(); err != nil { - return nil, err - } - var err error dir, err := f.fs.fs.Open(f.path) if err != nil { return nil, err } - f.file = dir.(*os.File) - childEntry, err := getChildEntry(f.fs, f.file) + file := dir.(*os.File) + childEntry, err := getChildEntry(f.fs, file) if err != nil { return nil, err } @@ -165,7 +148,7 @@ func (f *File) Child() ([]lib9p.File, error) { cpath := path.Join(f.path, childEntry[i].Name()) child, err := f.fs.Open(cpath) if err != nil { - return files, fmt.Errorf("open child unko: %v", err) + return files, fmt.Errorf("open child: %v", err) } files[i] = child } @@ -173,11 +156,21 @@ func (f *File) Child() ([]lib9p.File, error) { } func (f *File) ReadAt(p []byte, off int64) (int, error) { - return f.file.ReadAt(p, off) + file, err := f.fs.fs.Open(f.path) + if err != nil { + return 0, fmt.Errorf("open: %v", err) + } + defer file.Close() + return file.(*os.File).ReadAt(p, off) } func (f *File) WriteAt(p []byte, off int64) (int, error) { - n, err := f.file.WriteAt(p, off) + file, err := os.OpenFile(path.Join(f.fs.rootPath, f.path), os.O_WRONLY , 0) + if err != nil { + return 0, fmt.Errorf("open: %v", err) + } + defer file.Close() + n, err := file.WriteAt(p, off) return n, err } diff --git a/diskfs/qid_unix.go b/diskfs/qid_unix.go @@ -25,7 +25,12 @@ type QidPool struct { } func (f *File) id() (fileID, error) { - fi, err := f.file.Stat() + file, err := f.fs.fs.Open(f.path) + if err != nil { + return fileID{}, fmt.Errorf("open: %v", err) + } + defer file.Close() + fi, err := file.Stat() if err != nil { return fileID{}, err } @@ -53,7 +58,12 @@ func (pool *QidPool) lookup(f *File) (lib9p.Qid, bool) { if err != nil { return lib9p.Qid{}, false } - fsfi, err := f.file.Stat() + file, err := f.fs.fs.Open(f.path) + if err != nil { + return lib9p.Qid{}, false + } + defer file.Close() + fsfi, err := file.Stat() if err != nil { return lib9p.Qid{}, false } @@ -77,7 +87,12 @@ func (pool *QidPool) alloc(f *File) (lib9p.Qid, error) { if err != nil { return lib9p.Qid{}, fmt.Errorf("get id: %v", err) } - fi, err := f.file.Stat() + file, err := f.fs.fs.Open(f.path) + if err != nil { + return lib9p.Qid{}, fmt.Errorf("open: %v", err) + } + defer file.Close() + fi, err := file.Stat() if err != nil { return lib9p.Qid{}, fmt.Errorf("stat %v: %v", f, err) } diff --git a/diskfs/stat_unix.go b/diskfs/stat_unix.go @@ -5,6 +5,7 @@ import ( "io/fs" "os" "os/user" + "path" "strconv" "syscall" "time" @@ -49,6 +50,12 @@ func fiStat(pool *QidPool, id fileID, info fs.FileInfo) *lib9p.Stat { // TODO: when error occur, file stat should be restored. func (f *File) WStat(s *lib9p.Stat) error { + file, err := os.Open(path.Join(f.fs.rootPath, f.path)) + if err != nil { + return err + } + defer file.Close() + fi, err := f.Stat() if err != nil { return fmt.Errorf("stat: %v", err) @@ -62,12 +69,12 @@ func (f *File) WStat(s *lib9p.Stat) error { } } if s.Length != oldStat.Length { - if err := f.file.Truncate(s.Length); err != nil { + if err := file.Truncate(s.Length); err != nil { return fmt.Errorf("truncate: %v", err) } } if s.Mode != oldStat.Mode { - if err := f.file.Chmod(lib9p.Mode9ToFSMode(s.Mode)); err != nil { + if err := file.Chmod(lib9p.Mode9ToFSMode(s.Mode)); err != nil { return fmt.Errorf("chmod: %v", err) } } @@ -96,10 +103,9 @@ func (f *File) WStat(s *lib9p.Stat) error { return fmt.Errorf("convert gid: %v", err) } - if err := f.file.Chown(u, g); err != nil { + if err := file.Chown(u, g); err != nil { return fmt.Errorf("chown: %v", err) } - return fmt.Errorf("chgroup unimplemented") } return nil diff --git a/testdir/a b/testdir/a @@ -0,0 +1 @@ +a