summaryrefslogtreecommitdiff
path: root/cmd/btrfs-rec/inspect/lsfiles/lsfiles.go
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2023-03-24 21:49:26 -0600
committerLuke Shumaker <lukeshu@lukeshu.com>2023-03-28 12:38:10 -0600
commitf6f0a251ed962374f69e9fd7722dcd5c44aa58ad (patch)
treed5e8802ad7b62f5222d3d88a0c592ff6cbb6b4ba /cmd/btrfs-rec/inspect/lsfiles/lsfiles.go
parent8a8f276d2c0113fc93a77d77213665a5fb112b20 (diff)
containers: Rethink the caching libraries
Diffstat (limited to 'cmd/btrfs-rec/inspect/lsfiles/lsfiles.go')
-rw-r--r--cmd/btrfs-rec/inspect/lsfiles/lsfiles.go30
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",