diff options
-rw-r--r-- | cmd/btrfs-dump-tree/main.go | 33 | ||||
-rw-r--r-- | pkg/btrfs/Makefile | 2 | ||||
-rw-r--r-- | pkg/btrfs/btrfsitem/item_chunk.go | 1 | ||||
-rw-r--r-- | pkg/btrfs/btrfsitem/item_dir.go | 1 | ||||
-rw-r--r-- | pkg/btrfs/btrfsitem/item_inoderef.go | 1 | ||||
-rw-r--r-- | pkg/btrfs/btrfsitem/item_uuid.go | 10 | ||||
-rw-r--r-- | pkg/btrfs/internal/itemtype.go | 4 |
7 files changed, 37 insertions, 15 deletions
diff --git a/cmd/btrfs-dump-tree/main.go b/cmd/btrfs-dump-tree/main.go index 52ee441..d96170b 100644 --- a/cmd/btrfs-dump-tree/main.go +++ b/cmd/btrfs-dump-tree/main.go @@ -263,20 +263,41 @@ func printTree(fs *btrfs.FS, root btrfs.LogicalAddr) error { body.SeekSpeed, body.Bandwidth, body.DevUUID, body.FSUUID) - //case btrfsitem.DEV_EXTENT_KEY: - // // TODO + case btrfsitem.DevExtent: + fmt.Printf(""+ + "\t\tdev extent chunk_tree %d\n"+ + "\t\tchunk_objectid %d chunk_offset %d length %d\n"+ + "\t\tchunk_tree_uuid %s\n", + body.ChunkTree, body.ChunkObjectID, body.ChunkOffset, body.Length, + body.ChunkTreeUUID) //case btrfsitem.QGROUP_STATUS_KEY: // // TODO //case btrfsitem.QGROUP_RELATION_KEY, btrfsitem.QGROUP_INFO_KEY: // // TODO //case btrfsitem.QGROUP_LIMIT_KEY: // // TODO - //case btrfsitem.UUIDMap: - // // TODO + case btrfsitem.UUIDMap: + for _, subvolID := range body { + fmt.Printf("\t\tsubvol_id %d\n", + subvolID) + } //case btrfsitem.STRING_ITEM_KEY: // // TODO - //case btrfsitem.PERSISTENT_ITEM_KEY: - // // TODO + case btrfsitem.DevStats: + fmt.Printf("\t\tpersistent item objectid %s offset %d\n", + item.Head.Key.ObjectID.Format(item.Head.Key.ItemType), item.Head.Key.Offset) + switch item.Head.Key.ObjectID { + case btrfs.DEV_STATS_OBJECTID: + fmt.Printf("\t\tdevice stats\n") + fmt.Printf("\t\twrite_errs %d read_errs %d flush_errs %d corruption_errs %d generation %d\n", + body.Values[btrfsitem.DEV_STAT_WRITE_ERRS], + body.Values[btrfsitem.DEV_STAT_READ_ERRS], + body.Values[btrfsitem.DEV_STAT_FLUSH_ERRS], + body.Values[btrfsitem.DEV_STAT_CORRUPTION_ERRS], + body.Values[btrfsitem.DEV_STAT_GENERATION_ERRS]) + default: + fmt.Printf("\t\tunknown persistent item objectid %d\n", item.Head.Key.ObjectID) + } //case btrfsitem.TEMPORARY_ITEM_KEY: // // TODO case btrfsitem.Empty: diff --git a/pkg/btrfs/Makefile b/pkg/btrfs/Makefile index 9777cbe..c79b271 100644 --- a/pkg/btrfs/Makefile +++ b/pkg/btrfs/Makefile @@ -38,7 +38,7 @@ internal/itemtype.go: btrfsitem/items.txt $(MAKEFILE_LIST) echo ')'; \ echo 'func (t ItemType) String() string {'; \ echo ' names := map[ItemType]string{'; \ - sed -E 's@(.*)=(.*) (.*)@\1_KEY: "\1",@' $<; \ + sed -E 's@(.*)=(.*) (.*)@\1_KEY: "\1",@' $< | sed 's/"UUID_/&KEY_/'; \ echo ' }'; \ echo ' if name, ok := names[t]; ok {'; \ echo ' return name'; \ diff --git a/pkg/btrfs/btrfsitem/item_chunk.go b/pkg/btrfs/btrfsitem/item_chunk.go index 826ecc6..eae8339 100644 --- a/pkg/btrfs/btrfsitem/item_chunk.go +++ b/pkg/btrfs/btrfsitem/item_chunk.go @@ -34,6 +34,7 @@ func (chunk *Chunk) UnmarshalBinary(dat []byte) (int, error) { if err != nil { return n, err } + chunk.Stripes = nil for i := 0; i < int(chunk.NumStripes); i++ { var stripe ChunkStripe _n, err := binstruct.Unmarshal(dat[n:], &stripe) diff --git a/pkg/btrfs/btrfsitem/item_dir.go b/pkg/btrfs/btrfsitem/item_dir.go index afef12d..6814041 100644 --- a/pkg/btrfs/btrfsitem/item_dir.go +++ b/pkg/btrfs/btrfsitem/item_dir.go @@ -10,6 +10,7 @@ import ( type DirList []Dir // DIR_ITEM=84, DIR_INDEX=96, XATTR_ITEM=24 func (o *DirList) UnmarshalBinary(dat []byte) (int, error) { + *o = nil n := 0 for n < len(dat) { var ref Dir diff --git a/pkg/btrfs/btrfsitem/item_inoderef.go b/pkg/btrfs/btrfsitem/item_inoderef.go index e59c4b3..39b7738 100644 --- a/pkg/btrfs/btrfsitem/item_inoderef.go +++ b/pkg/btrfs/btrfsitem/item_inoderef.go @@ -7,6 +7,7 @@ import ( type InodeRefList []InodeRef // INODE_REF=12 func (o *InodeRefList) UnmarshalBinary(dat []byte) (int, error) { + *o = nil n := 0 for n < len(dat) { var ref InodeRef diff --git a/pkg/btrfs/btrfsitem/item_uuid.go b/pkg/btrfs/btrfsitem/item_uuid.go index 894ccff..d66e102 100644 --- a/pkg/btrfs/btrfsitem/item_uuid.go +++ b/pkg/btrfs/btrfsitem/item_uuid.go @@ -7,12 +7,10 @@ import ( // The Key for this item is a UUID, and the item is a list of // subvolume IDs (ObjectIDs) that that UUID maps to. -type UUIDMap struct { // UUID_SUBVOL=251 UUID_RECEIVED_SUBVOL=252 - SubvolIDs []internal.ObjID -} +type UUIDMap []internal.ObjID // UUID_SUBVOL=251 UUID_RECEIVED_SUBVOL=252 func (o *UUIDMap) UnmarshalBinary(dat []byte) (int, error) { - o.SubvolIDs = nil + *o = nil var n int for len(dat) > n { var subvolID internal.ObjID @@ -21,14 +19,14 @@ func (o *UUIDMap) UnmarshalBinary(dat []byte) (int, error) { if err != nil { return n, err } - o.SubvolIDs = append(o.SubvolIDs, subvolID) + *o = append(*o, subvolID) } return n, nil } func (o UUIDMap) MarshalBinary() ([]byte, error) { var ret []byte - for _, subvolID := range o.SubvolIDs { + for _, subvolID := range o { bs, err := binstruct.Marshal(subvolID) ret = append(ret, bs...) if err != nil { diff --git a/pkg/btrfs/internal/itemtype.go b/pkg/btrfs/internal/itemtype.go index 7f16889..c046ea3 100644 --- a/pkg/btrfs/internal/itemtype.go +++ b/pkg/btrfs/internal/itemtype.go @@ -53,8 +53,8 @@ func (t ItemType) String() string { PERSISTENT_ITEM_KEY: "PERSISTENT_ITEM", ROOT_ITEM_KEY: "ROOT_ITEM", SHARED_DATA_REF_KEY: "SHARED_DATA_REF", - UUID_SUBVOL_KEY: "UUID_SUBVOL", - UUID_RECEIVED_SUBVOL_KEY: "UUID_RECEIVED_SUBVOL", + UUID_SUBVOL_KEY: "UUID_KEY_SUBVOL", + UUID_RECEIVED_SUBVOL_KEY: "UUID_KEY_RECEIVED_SUBVOL", } if name, ok := names[t]; ok { return name |