diff options
author | Luke Shumaker <lukeshu@lukeshu.com> | 2022-07-01 00:00:19 -0600 |
---|---|---|
committer | Luke Shumaker <lukeshu@lukeshu.com> | 2022-07-01 00:00:19 -0600 |
commit | aee0fa4cf09ef5af90e28441d673ce440e4c2c16 (patch) | |
tree | 5a87486e5bd4f0af400d633d3040edd5ed03bf5c | |
parent | df3e7ef9c5fd0ceb2e89d5afd4e981652f9a8bdd (diff) |
add open/close utility functions
-rw-r--r-- | cmd/btrfs-dbg/main.go | 33 | ||||
-rw-r--r-- | cmd/btrfs-dump-tree/main.go | 9 | ||||
-rw-r--r-- | cmd/btrfs-fsck/main.go | 17 | ||||
-rw-r--r-- | cmd/btrfs-fsck/pass0.go | 18 | ||||
-rw-r--r-- | pkg/btrfs/io2_fs.go | 13 | ||||
-rw-r--r-- | pkg/btrfsmisc/open.go | 24 |
6 files changed, 70 insertions, 44 deletions
diff --git a/cmd/btrfs-dbg/main.go b/cmd/btrfs-dbg/main.go index 3f30915..4b4a7a2 100644 --- a/cmd/btrfs-dbg/main.go +++ b/cmd/btrfs-dbg/main.go @@ -25,20 +25,13 @@ func Main(imgfilename string) (err error) { } } - fh, err := os.Open(imgfilename) + fs, err := btrfsmisc.Open(os.O_RDONLY, imgfilename) if err != nil { return err } defer func() { - maybeSetErr(fh.Close()) + maybeSetErr(fs.Close()) }() - dev := &btrfs.Device{ - File: fh, - } - fs := new(btrfs.FS) - if err := fs.AddDevice(dev); err != nil { - return err - } superblocks, err := fs.Superblocks() if err != nil { @@ -61,17 +54,19 @@ func Main(imgfilename string) (err error) { } spew.Dump(syschunks) - if err := btrfsmisc.ScanForNodes(dev, superblocks[0].Data, func(nodeRef *util.Ref[btrfs.PhysicalAddr, btrfs.Node], err error) { - if err != nil { - fmt.Println(err) - } else { - fmt.Printf("node@%v: physical_addr=%v logical_addr=%v generation=%v owner=%v level=%v\n", - nodeRef.Addr, - nodeRef.Addr, nodeRef.Data.Head.Addr, - nodeRef.Data.Head.Generation, nodeRef.Data.Head.Owner, nodeRef.Data.Head.Level) + for _, dev := range fs.LV.PhysicalVolumes() { + if err := btrfsmisc.ScanForNodes(dev, superblocks[0].Data, func(nodeRef *util.Ref[btrfs.PhysicalAddr, btrfs.Node], err error) { + if err != nil { + fmt.Println(err) + } else { + fmt.Printf("node@%v: physical_addr=%v logical_addr=%v generation=%v owner=%v level=%v\n", + nodeRef.Addr, + nodeRef.Addr, nodeRef.Data.Head.Addr, + nodeRef.Data.Head.Generation, nodeRef.Data.Head.Owner, nodeRef.Data.Head.Level) + } + }, nil); err != nil { + return err } - }, nil); err != nil { - return err } return nil diff --git a/cmd/btrfs-dump-tree/main.go b/cmd/btrfs-dump-tree/main.go index ded7a39..b226af3 100644 --- a/cmd/btrfs-dump-tree/main.go +++ b/cmd/btrfs-dump-tree/main.go @@ -25,19 +25,14 @@ func Main(imgfilename string) (err error) { } } - fh, err := os.Open(imgfilename) + fs, err := btrfsmisc.Open(os.O_RDONLY, imgfilename) if err != nil { return err } defer func() { - maybeSetErr(fh.Close()) + maybeSetErr(fs.Close()) }() - fs := new(btrfs.FS) - if err := fs.AddDevice(&btrfs.Device{File: fh}); err != nil { - fmt.Printf("(error) %v\n", err) - } - superblock, err := fs.Superblock() if err != nil { return err diff --git a/cmd/btrfs-fsck/main.go b/cmd/btrfs-fsck/main.go index e51aae9..ebbaff7 100644 --- a/cmd/btrfs-fsck/main.go +++ b/cmd/btrfs-fsck/main.go @@ -19,22 +19,13 @@ func Main(imgfilenames ...string) (err error) { } } - var imgfiles []*os.File - for _, imgfilename := range imgfilenames { - fh, err := os.OpenFile(imgfilename, os.O_RDWR, 0) - if err != nil { - return err - } - defer func() { - maybeSetErr(fh.Close()) - }() - imgfiles = append(imgfiles, fh) - } - - fs, sb, err := pass0(imgfiles...) + fs, sb, err := pass0(imgfilenames...) if err != nil { return err } + defer func() { + maybeSetErr(fs.Close()) + }() foundNodes, err := pass1(fs, sb) if err != nil { diff --git a/cmd/btrfs-fsck/pass0.go b/cmd/btrfs-fsck/pass0.go index 2a8e20a..c0c872b 100644 --- a/cmd/btrfs-fsck/pass0.go +++ b/cmd/btrfs-fsck/pass0.go @@ -8,19 +8,27 @@ import ( "lukeshu.com/btrfs-tools/pkg/util" ) -func pass0(imgfiles ...*os.File) (*btrfs.FS, *util.Ref[btrfs.PhysicalAddr, btrfs.Superblock], error) { +func pass0(filenames ...string) (*btrfs.FS, *util.Ref[btrfs.PhysicalAddr, btrfs.Superblock], error) { fmt.Printf("\nPass 0: init and superblocks...\n") fs := new(btrfs.FS) - for _, imgfile := range imgfiles { - fmt.Printf("Pass 0: ... adding device %q...\n", imgfile.Name()) - if err := fs.AddDevice(&btrfs.Device{File: imgfile}); err != nil { - fmt.Printf("Pass 0: ... add device %q: error: %v\n", imgfile.Name(), err) + for _, filename := range filenames { + fmt.Printf("Pass 0: ... adding device %q...\n", filename) + + fh, err := os.OpenFile(filename, os.O_RDWR, 0) + if err != nil { + _ = fs.Close() + return nil, nil, fmt.Errorf("device %q: %w", filename, err) + } + + if err := fs.AddDevice(&btrfs.Device{File: fh}); err != nil { + fmt.Printf("Pass 0: ... add device %q: error: %v\n", filename, err) } } sb, err := fs.Superblock() if err != nil { + _ = fs.Close() return nil, nil, err } diff --git a/pkg/btrfs/io2_fs.go b/pkg/btrfs/io2_fs.go index dcf7df8..740e6e6 100644 --- a/pkg/btrfs/io2_fs.go +++ b/pkg/btrfs/io2_fs.go @@ -2,6 +2,7 @@ package btrfs import ( "fmt" + "io" "lukeshu.com/btrfs-tools/pkg/btrfs/btrfsitem" "lukeshu.com/btrfs-tools/pkg/btrfs/btrfsvol" @@ -166,3 +167,15 @@ func (fs *FS) initDev(sb *util.Ref[PhysicalAddr, Superblock]) error { } return nil } + +func (fs *FS) Close() error { + var err error + for _, dev := range fs.LV.PhysicalVolumes() { + if _err := dev.Close(); _err != nil && err == nil { + err = _err + } + } + return err +} + +var _ io.Closer = (*FS)(nil) diff --git a/pkg/btrfsmisc/open.go b/pkg/btrfsmisc/open.go new file mode 100644 index 0000000..bf72670 --- /dev/null +++ b/pkg/btrfsmisc/open.go @@ -0,0 +1,24 @@ +package btrfsmisc + +import ( + "fmt" + "os" + + "lukeshu.com/btrfs-tools/pkg/btrfs" +) + +func Open(flag int, filenames ...string) (*btrfs.FS, error) { + fs := new(btrfs.FS) + for _, filename := range filenames { + fh, err := os.OpenFile(filename, flag, 0) + if err != nil { + _ = fs.Close() + return nil, fmt.Errorf("file %q: %w", filename, err) + } + if err := fs.AddDevice(&btrfs.Device{File: fh}); err != nil { + _ = fs.Close() + return nil, fmt.Errorf("file %q: %w", filename, err) + } + } + return fs, nil +} |