summaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2022-07-08 00:05:52 -0600
committerLuke Shumaker <lukeshu@lukeshu.com>2022-07-08 01:29:21 -0600
commit8e27c43c1b882c8f2f759eec556f90229c067cc9 (patch)
tree7a94a92d19f6639c07263537f49226406dd5b4e5 /cmd
parent7e09476e6cf9922baa3c3a49b559b5b9af970561 (diff)
get initial expected levels from the superblock
Diffstat (limited to 'cmd')
-rw-r--r--cmd/btrfs-clear-bad-nodes/main.go26
-rw-r--r--cmd/btrfs-dump-tree/main.go12
-rw-r--r--cmd/btrfs-fsck/pass1.go2
-rw-r--r--cmd/btrfs-fsck/pass2.go45
-rw-r--r--cmd/btrfs-ls-files/main.go15
-rw-r--r--cmd/btrfs-ls-trees/main.go9
6 files changed, 53 insertions, 56 deletions
diff --git a/cmd/btrfs-clear-bad-nodes/main.go b/cmd/btrfs-clear-bad-nodes/main.go
index 44f6697..0bad792 100644
--- a/cmd/btrfs-clear-bad-nodes/main.go
+++ b/cmd/btrfs-clear-bad-nodes/main.go
@@ -1,8 +1,8 @@
package main
import (
+ "errors"
"fmt"
- "math"
"os"
"lukeshu.com/btrfs-tools/pkg/btrfs"
@@ -38,8 +38,8 @@ func Main(imgfilenames ...string) (err error) {
var treeName string
var treeID btrfs.ObjID
- btrfsmisc.WalkFS(fs, btrfsmisc.WalkFSHandler{
- PreTree: func(name string, id btrfs.ObjID, _ btrfsvol.LogicalAddr) {
+ btrfsmisc.WalkAllTrees(fs, btrfsmisc.WalkAllTreesHandler{
+ PreTree: func(name string, id btrfs.ObjID) {
treeName = name
treeID = id
},
@@ -49,7 +49,7 @@ func Main(imgfilenames ...string) (err error) {
UnsafeNodes: true,
TreeWalkHandler: btrfs.TreeWalkHandler{
Node: func(path btrfs.TreePath, node *util.Ref[btrfsvol.LogicalAddr, btrfs.Node], err error) error {
- if node == nil || err == nil {
+ if err == nil {
if !uuidsInited {
metadataUUID = node.Data.Head.MetadataUUID
chunkTreeUUID = node.Data.Head.ChunkTreeUUID
@@ -57,17 +57,21 @@ func Main(imgfilenames ...string) (err error) {
}
return nil
}
+ if !errors.Is(err, btrfs.ErrNotANode) {
+ err = btrfsmisc.WalkErr{
+ TreeName: treeName,
+ Path: path,
+ Err: err,
+ }
+ fmt.Printf("error: %v\n", err)
+ return nil
+ }
origErr := err
if !uuidsInited {
// TODO(lukeshu): Is there a better way to get the chunk
- // tree UUID.
+ // tree UUID?
return fmt.Errorf("cannot repair node@%v: not (yet?) sure what the chunk tree UUID is", node.Addr)
}
- nodeLevel := path[len(path)-1].NodeLevel
- if nodeLevel == math.MaxUint8 {
- // TODO(lukeshu): Use level from the superblock or whatever.
- nodeLevel = 0
- }
node.Data = btrfs.Node{
Size: node.Data.Size,
ChecksumType: node.Data.ChecksumType,
@@ -81,7 +85,7 @@ func Main(imgfilenames ...string) (err error) {
Generation: 0,
Owner: treeID,
NumItems: 0,
- Level: nodeLevel,
+ Level: path[len(path)-1].NodeLevel,
},
}
node.Data.Head.Checksum, err = node.Data.CalculateChecksum()
diff --git a/cmd/btrfs-dump-tree/main.go b/cmd/btrfs-dump-tree/main.go
index 7f1aba4..56727d4 100644
--- a/cmd/btrfs-dump-tree/main.go
+++ b/cmd/btrfs-dump-tree/main.go
@@ -41,29 +41,29 @@ func Main(imgfilename string) (err error) {
fmt.Printf("btrfs-progs v%v\n", version)
if superblock.Data.RootTree != 0 {
fmt.Printf("root tree\n")
- if err := btrfsmisc.PrintTree(fs, superblock.Data.RootTree); err != nil {
+ if err := btrfsmisc.PrintTree(fs, btrfs.ROOT_TREE_OBJECTID); err != nil {
return err
}
}
if superblock.Data.ChunkTree != 0 {
fmt.Printf("chunk tree\n")
- if err := btrfsmisc.PrintTree(fs, superblock.Data.ChunkTree); err != nil {
+ if err := btrfsmisc.PrintTree(fs, btrfs.CHUNK_TREE_OBJECTID); err != nil {
return err
}
}
if superblock.Data.LogTree != 0 {
fmt.Printf("log root tree\n")
- if err := btrfsmisc.PrintTree(fs, superblock.Data.LogTree); err != nil {
+ if err := btrfsmisc.PrintTree(fs, btrfs.TREE_LOG_OBJECTID); err != nil {
return err
}
}
if superblock.Data.BlockGroupRoot != 0 {
fmt.Printf("block group tree\n")
- if err := btrfsmisc.PrintTree(fs, superblock.Data.BlockGroupRoot); err != nil {
+ if err := btrfsmisc.PrintTree(fs, btrfs.BLOCK_GROUP_TREE_OBJECTID); err != nil {
return err
}
}
- if err := fs.TreeWalk(superblock.Data.RootTree, btrfs.TreeWalkHandler{
+ if err := fs.TreeWalk(btrfs.ROOT_TREE_OBJECTID, btrfs.TreeWalkHandler{
Item: func(_ btrfs.TreePath, item btrfs.Item) error {
if item.Head.Key.ItemType != btrfsitem.ROOT_ITEM_KEY {
return nil
@@ -92,7 +92,7 @@ func Main(imgfilename string) (err error) {
treeName = "file"
}
fmt.Printf("%v tree %v \n", treeName, btrfsmisc.FmtKey(item.Head.Key))
- return btrfsmisc.PrintTree(fs, item.Body.(btrfsitem.Root).ByteNr)
+ return btrfsmisc.PrintTree(fs, item.Head.Key.ObjectID)
},
}); err != nil {
return err
diff --git a/cmd/btrfs-fsck/pass1.go b/cmd/btrfs-fsck/pass1.go
index f8626af..a674b30 100644
--- a/cmd/btrfs-fsck/pass1.go
+++ b/cmd/btrfs-fsck/pass1.go
@@ -22,7 +22,7 @@ func pass1(fs *btrfs.FS, superblock *util.Ref[btrfsvol.PhysicalAddr, btrfs.Super
fmt.Printf("Pass 1: ... walking fs\n")
visitedNodes := make(map[btrfsvol.LogicalAddr]struct{})
- btrfsmisc.WalkFS(fs, btrfsmisc.WalkFSHandler{
+ btrfsmisc.WalkAllTrees(fs, btrfsmisc.WalkAllTreesHandler{
TreeWalkHandler: btrfs.TreeWalkHandler{
Node: func(path btrfs.TreePath, node *util.Ref[btrfsvol.LogicalAddr, btrfs.Node], err error) error {
if err != nil {
diff --git a/cmd/btrfs-fsck/pass2.go b/cmd/btrfs-fsck/pass2.go
index 95a307c..a8c0c9b 100644
--- a/cmd/btrfs-fsck/pass2.go
+++ b/cmd/btrfs-fsck/pass2.go
@@ -2,7 +2,6 @@ package main
import (
"fmt"
- iofs "io/fs"
"lukeshu.com/btrfs-tools/pkg/btrfs"
"lukeshu.com/btrfs-tools/pkg/btrfs/btrfsvol"
@@ -14,7 +13,7 @@ func pass2(fs *btrfs.FS, foundNodes map[btrfsvol.LogicalAddr]struct{}) {
fmt.Printf("\nPass 2: orphaned nodes\n")
visitedNodes := make(map[btrfsvol.LogicalAddr]struct{})
- btrfsmisc.WalkFS(fs, btrfsmisc.WalkFSHandler{
+ btrfsmisc.WalkAllTrees(fs, btrfsmisc.WalkAllTreesHandler{
TreeWalkHandler: btrfs.TreeWalkHandler{
Node: func(path btrfs.TreePath, node *util.Ref[btrfsvol.LogicalAddr, btrfs.Node], err error) error {
visitedNodes[node.Addr] = struct{}{}
@@ -37,26 +36,28 @@ func pass2(fs *btrfs.FS, foundNodes map[btrfsvol.LogicalAddr]struct{}) {
for node := range orphanedNodes {
orphanedRoots[node] = struct{}{}
}
- for potentialRoot := range orphanedRoots {
- if err := fs.TreeWalk(potentialRoot, btrfs.TreeWalkHandler{
- Node: func(path btrfs.TreePath, _ *util.Ref[btrfsvol.LogicalAddr, btrfs.Node], _ error) error {
- nodeAddr := path[len(path)-1].NodeAddr
- if nodeAddr != potentialRoot {
- delete(orphanedRoots, nodeAddr)
- }
- orphanedNodes[nodeAddr] = orphanedNodes[nodeAddr] + 1
- visitCnt := orphanedNodes[nodeAddr]
- if visitCnt > 1 {
- return iofs.SkipDir
- }
- return nil
- },
- }); err != nil {
- fmt.Printf("Pass 2: walk orphans: error: %v\n", err)
+ /*
+ for potentialRoot := range orphanedRoots {
+ if err := fs.TreeWalk(potentialRoot, btrfs.TreeWalkHandler{
+ Node: func(path btrfs.TreePath, _ *util.Ref[btrfsvol.LogicalAddr, btrfs.Node], _ error) error {
+ nodeAddr := path[len(path)-1].NodeAddr
+ if nodeAddr != potentialRoot {
+ delete(orphanedRoots, nodeAddr)
+ }
+ orphanedNodes[nodeAddr] = orphanedNodes[nodeAddr] + 1
+ visitCnt := orphanedNodes[nodeAddr]
+ if visitCnt > 1 {
+ return iofs.SkipDir
+ }
+ return nil
+ },
+ }); err != nil {
+ fmt.Printf("Pass 2: walk orphans: error: %v\n", err)
+ }
}
- }
- for _, node := range util.SortedMapKeys(orphanedRoots) {
- fmt.Printf("Pass 2: orphaned root: %v\n", node)
- }
+ for _, node := range util.SortedMapKeys(orphanedRoots) {
+ fmt.Printf("Pass 2: orphaned root: %v\n", node)
+ }
+ */
}
diff --git a/cmd/btrfs-ls-files/main.go b/cmd/btrfs-ls-files/main.go
index 22eefcb..c2e9e06 100644
--- a/cmd/btrfs-ls-files/main.go
+++ b/cmd/btrfs-ls-files/main.go
@@ -10,7 +10,6 @@ import (
"lukeshu.com/btrfs-tools/pkg/btrfs"
"lukeshu.com/btrfs-tools/pkg/btrfs/btrfsitem"
- "lukeshu.com/btrfs-tools/pkg/btrfs/btrfsvol"
"lukeshu.com/btrfs-tools/pkg/btrfsmisc"
"lukeshu.com/btrfs-tools/pkg/util"
)
@@ -54,23 +53,17 @@ const (
)
func printSubvol(fs *btrfs.FS, prefix0, prefix1, name string, key btrfs.Key) {
- sb, err := fs.Superblock()
- if err != nil {
- fmt.Printf("%s%q error: could not read superblock: %v\n", prefix0, name, err)
- return
- }
-
- root, err := fs.TreeLookup(sb.Data.RootTree, key)
+ root, err := fs.TreeLookup(btrfs.ROOT_TREE_OBJECTID, key)
if err != nil {
fmt.Printf("%s%q error: could not look up root %v: %v\n", prefix0, name, key, err)
return
}
rootBody := root.Body.(btrfsitem.Root)
- printDir(fs, rootBody.ByteNr, prefix0, prefix1, name, rootBody.RootDirID)
+ printDir(fs, root.Head.Key.ObjectID, prefix0, prefix1, name, rootBody.RootDirID)
}
-func printDir(fs *btrfs.FS, fsTree btrfsvol.LogicalAddr, prefix0, prefix1, dirName string, dirInode btrfs.ObjID) {
+func printDir(fs *btrfs.FS, fsTree btrfs.ObjID, prefix0, prefix1, dirName string, dirInode btrfs.ObjID) {
var errs derror.MultiError
items, err := fs.TreeSearchAll(fsTree, func(key btrfs.Key) int {
return util.CmpUint(dirInode, key.ObjectID)
@@ -190,7 +183,7 @@ func printDir(fs *btrfs.FS, fsTree btrfsvol.LogicalAddr, prefix0, prefix1, dirNa
}
}
-func printDirEntry(fs *btrfs.FS, fsTree btrfsvol.LogicalAddr, prefix0, prefix1 string, entry btrfsitem.DirEntry) {
+func printDirEntry(fs *btrfs.FS, fsTree btrfs.ObjID, prefix0, prefix1 string, entry btrfsitem.DirEntry) {
if len(entry.Data) != 0 {
fmt.Printf("%s%q: error: TODO: I don't know how to handle dirent.data\n",
prefix0, entry.Name)
diff --git a/cmd/btrfs-ls-trees/main.go b/cmd/btrfs-ls-trees/main.go
index a444e34..534b095 100644
--- a/cmd/btrfs-ls-trees/main.go
+++ b/cmd/btrfs-ls-trees/main.go
@@ -8,7 +8,6 @@ import (
"lukeshu.com/btrfs-tools/pkg/btrfs"
"lukeshu.com/btrfs-tools/pkg/btrfs/btrfsitem"
- "lukeshu.com/btrfs-tools/pkg/btrfs/btrfsvol"
"lukeshu.com/btrfs-tools/pkg/btrfsmisc"
"lukeshu.com/btrfs-tools/pkg/util"
)
@@ -37,11 +36,11 @@ func Main(imgfilenames ...string) (err error) {
var treeErrCnt int
var treeItemCnt map[btrfsitem.Type]int
- btrfsmisc.WalkFS(fs, btrfsmisc.WalkFSHandler{
- PreTree: func(name string, _ btrfs.ObjID, laddr btrfsvol.LogicalAddr) {
+ btrfsmisc.WalkAllTrees(fs, btrfsmisc.WalkAllTreesHandler{
+ PreTree: func(name string, treeID btrfs.ObjID) {
treeErrCnt = 0
treeItemCnt = make(map[btrfsitem.Type]int)
- fmt.Printf("tree laddr=%v name=%q\n", laddr, name)
+ fmt.Printf("tree id=%v name=%q\n", treeID, name)
},
Err: func(_ error) {
treeErrCnt++
@@ -53,7 +52,7 @@ func Main(imgfilenames ...string) (err error) {
return nil
},
},
- PostTree: func(name string, _ btrfs.ObjID, laddr btrfsvol.LogicalAddr) {
+ PostTree: func(_ string, _ btrfs.ObjID) {
totalItems := 0
for _, cnt := range treeItemCnt {
totalItems += cnt