summaryrefslogtreecommitdiff
path: root/cmd/btrfs-rec/inspect/lsfiles
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2023-03-28 14:47:09 -0600
committerLuke Shumaker <lukeshu@lukeshu.com>2023-03-28 14:47:09 -0600
commit0b092a27122fcf19479d6cdeae5f7c9493d9741a (patch)
treed5e8802ad7b62f5222d3d88a0c592ff6cbb6b4ba /cmd/btrfs-rec/inspect/lsfiles
parentbf5eed5af5c34b8cf9dc2985a7c4475602929bb1 (diff)
parentf6f0a251ed962374f69e9fd7722dcd5c44aa58ad (diff)
Merge branch 'lukeshu/node-cache'
Diffstat (limited to 'cmd/btrfs-rec/inspect/lsfiles')
-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",