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:
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