diff options
author | Luke Shumaker <lukeshu@lukeshu.com> | 2023-03-24 21:49:26 -0600 |
---|---|---|
committer | Luke Shumaker <lukeshu@lukeshu.com> | 2023-03-28 12:38:10 -0600 |
commit | f6f0a251ed962374f69e9fd7722dcd5c44aa58ad (patch) | |
tree | d5e8802ad7b62f5222d3d88a0c592ff6cbb6b4ba /cmd/btrfs-rec/inspect/lsfiles | |
parent | 8a8f276d2c0113fc93a77d77213665a5fb112b20 (diff) |
containers: Rethink the caching libraries
Diffstat (limited to 'cmd/btrfs-rec/inspect/lsfiles')
-rw-r--r-- | cmd/btrfs-rec/inspect/lsfiles/lsfiles.go | 30 |
1 files changed, 20 insertions, 10 deletions
diff --git a/cmd/btrfs-rec/inspect/lsfiles/lsfiles.go b/cmd/btrfs-rec/inspect/lsfiles/lsfiles.go index e42050f..af8f690 100644 --- a/cmd/btrfs-rec/inspect/lsfiles/lsfiles.go +++ b/cmd/btrfs-rec/inspect/lsfiles/lsfiles.go @@ -84,12 +84,14 @@ func printSubvol(out io.Writer, prefix string, isLast bool, name string, subvol subvol.TreeID, fmtErr(err))) return } - dir, err := subvol.LoadDir(rootInode) + + dir, err := subvol.AcquireDir(rootInode) if err != nil { printText(out, prefix, isLast, name+"/", textui.Sprintf("subvol_id=%v err=%v", subvol.TreeID, fmtErr(err))) return } + if name == "/" { printDir(out, prefix, isLast, name, dir) return @@ -127,19 +129,23 @@ func fmtInode(inode btrfs.BareInode) string { func printDir(out io.Writer, prefix string, isLast bool, name string, dir *btrfs.Dir) { printText(out, prefix, isLast, name+"/", fmtInode(dir.BareInode)) + childrenByName := dir.ChildrenByName + subvol := dir.SV + subvol.ReleaseDir(dir.Inode) + if isLast { prefix += tS } else { prefix += tl } - for i, childName := range maps.SortedKeys(dir.ChildrenByName) { + for i, childName := range maps.SortedKeys(childrenByName) { printDirEntry( out, prefix, - i == len(dir.ChildrenByName)-1, - dir.SV, + i == len(childrenByName)-1, + subvol, path.Join(name, childName), - dir.ChildrenByName[childName]) + childrenByName[childName]) } } @@ -151,7 +157,7 @@ func printDirEntry(out io.Writer, prefix string, isLast bool, subvol *btrfs.Subv case btrfsitem.FT_DIR: switch entry.Location.ItemType { case btrfsitem.INODE_ITEM_KEY: - dir, err := subvol.LoadDir(entry.Location.ObjectID) + dir, err := subvol.AcquireDir(entry.Location.ObjectID) if err != nil { printText(out, prefix, isLast, name, textui.Sprintf("%v err=%v", entry.Type, fmtErr(err))) return @@ -168,44 +174,48 @@ func printDirEntry(out io.Writer, prefix string, isLast bool, subvol *btrfs.Subv panic(fmt.Errorf("TODO: I don't know how to handle an FT_SYMLINK with location.ItemType=%v: %q", entry.Location.ItemType, name)) } - file, err := subvol.LoadFile(entry.Location.ObjectID) + file, err := subvol.AcquireFile(entry.Location.ObjectID) if err != nil { printText(out, prefix, isLast, name, textui.Sprintf("%v err=%v", entry.Type, fmtErr(err))) return } + defer subvol.ReleaseFile(entry.Location.ObjectID) printSymlink(out, prefix, isLast, name, file) case btrfsitem.FT_REG_FILE: if entry.Location.ItemType != btrfsitem.INODE_ITEM_KEY { panic(fmt.Errorf("TODO: I don't know how to handle an FT_REG_FILE with location.ItemType=%v: %q", entry.Location.ItemType, name)) } - file, err := subvol.LoadFile(entry.Location.ObjectID) + file, err := subvol.AcquireFile(entry.Location.ObjectID) if err != nil { printText(out, prefix, isLast, name, textui.Sprintf("%v err=%v", entry.Type, fmtErr(err))) return } + defer subvol.ReleaseFile(entry.Location.ObjectID) printFile(out, prefix, isLast, name, file) case btrfsitem.FT_SOCK: if entry.Location.ItemType != btrfsitem.INODE_ITEM_KEY { panic(fmt.Errorf("TODO: I don't know how to handle an FT_SOCK with location.ItemType=%v: %q", entry.Location.ItemType, name)) } - file, err := subvol.LoadFile(entry.Location.ObjectID) + file, err := subvol.AcquireFile(entry.Location.ObjectID) if err != nil { printText(out, prefix, isLast, name, textui.Sprintf("%v err=%v", entry.Type, fmtErr(err))) return } + defer subvol.ReleaseFile(entry.Location.ObjectID) printSocket(out, prefix, isLast, name, file) case btrfsitem.FT_FIFO: if entry.Location.ItemType != btrfsitem.INODE_ITEM_KEY { panic(fmt.Errorf("TODO: I don't know how to handle an FT_FIFO with location.ItemType=%v: %q", entry.Location.ItemType, name)) } - file, err := subvol.LoadFile(entry.Location.ObjectID) + file, err := subvol.AcquireFile(entry.Location.ObjectID) if err != nil { printText(out, prefix, isLast, name, textui.Sprintf("%v err=%v", entry.Type, fmtErr(err))) return } + defer subvol.ReleaseFile(entry.Location.ObjectID) printPipe(out, prefix, isLast, name, file) default: panic(fmt.Errorf("TODO: I don't know how to handle a fileType=%v: %q", |