diff options
| -rw-r--r-- | cmd/btrfs-dump-tree/main.go | 35 | ||||
| -rw-r--r-- | pkg/btrfs/btrfsitem/item_empty.go | 2 | ||||
| -rw-r--r-- | pkg/btrfs/btrfsitem/item_freespacebitmap.go | 12 | ||||
| -rw-r--r-- | pkg/btrfs/btrfsitem/item_freespaceinfo.go | 11 | ||||
| -rw-r--r-- | pkg/btrfs/btrfsitem/item_orphan.go | 9 | ||||
| -rw-r--r-- | pkg/btrfs/btrfsitem/items.txt | 5 | ||||
| -rw-r--r-- | pkg/btrfs/btrfsitem/items_gen.go | 41 | ||||
| -rw-r--r-- | pkg/btrfs/internal/itemtype.go | 6 | 
8 files changed, 77 insertions, 44 deletions
| diff --git a/cmd/btrfs-dump-tree/main.go b/cmd/btrfs-dump-tree/main.go index d96170b..2428a6c 100644 --- a/cmd/btrfs-dump-tree/main.go +++ b/cmd/btrfs-dump-tree/main.go @@ -211,18 +211,10 @@ func printTree(fs *btrfs.FS, root btrfs.LogicalAddr) error {  					body.Head.Refs, body.Head.Generation, body.Head.Flags)  				fmt.Printf("\t\ttree block skinny level %d\n", item.Head.Key.Offset)  				printExtentInlineRefs(body.Refs) -			//case btrfsitem.TREE_BLOCK_REF_KEY: -			//	fmt.Printf("\t\ttree block backref\n") -			//case btrfsitem.SHARED_BLOCK_REF_KEY: -			//	fmt.Printf("\t\tshared block backref\n")  			//case btrfsitem.EXTENT_DATA_REF_KEY:  			//	// TODO  			//case btrfsitem.SHARED_DATA_REF_KEY:  			//	// TODO -			//case btrfsitem.EXTENT_REF_V0_KEY: -			//	fmt.Printf("\t\textent ref v0 (deprecated)\n") -			//case btrfsitem.CSUM_ITEM_KEY: -			//	fmt.Printf("\t\tcsum item\n")  			//case btrfsitem.EXTENT_CSUM_KEY:  			//	// TODO  			//case btrfsitem.EXTENT_DATA_KEY: @@ -230,12 +222,11 @@ func printTree(fs *btrfs.FS, root btrfs.LogicalAddr) error {  			case btrfsitem.BlockGroup:  				fmt.Printf("\t\tblock group used %d chunk_objectid %d flags %v\n",  					body.Used, body.ChunkObjectID, body.Flags) -			//case btrfsitem.FREE_SPACE_INFO_KEY: -			//	// TODO -			//case btrfsitem.FREE_SPACE_EXTENT_KEY: -			//	fmt.Printf("\t\tfree space extent\n") -			//case btrfsitem.FREE_SPACE_BITMAP_KEY: -			//	fmt.Printf("\t\tfree space bitmap\n") +			case btrfsitem.FreeSpaceInfo: +				fmt.Printf("\t\tfree space info extent count %d flags %d\n", +					body.ExtentCount, body.Flags) +			case btrfsitem.FreeSpaceBitmap: +				fmt.Printf("\t\tfree space bitmap\n")  			case btrfsitem.Chunk:  				fmt.Printf("\t\tlength %d owner %d stripe_len %d type %v\n",  					body.Size, body.Owner, body.StripeLen, body.Type) @@ -272,7 +263,7 @@ func printTree(fs *btrfs.FS, root btrfs.LogicalAddr) error {  					body.ChunkTreeUUID)  			//case btrfsitem.QGROUP_STATUS_KEY:  			//	// TODO -			//case btrfsitem.QGROUP_RELATION_KEY, btrfsitem.QGROUP_INFO_KEY: +			//case btrfsitem.QGROUP_INFO_KEY:  			//	// TODO  			//case btrfsitem.QGROUP_LIMIT_KEY:  			//	// TODO @@ -302,8 +293,20 @@ func printTree(fs *btrfs.FS, root btrfs.LogicalAddr) error {  			//	// TODO  			case btrfsitem.Empty:  				switch item.Head.Key.ItemType { -				case btrfsitem.ORPHAN_ITEM_KEY: +				case btrfsitem.ORPHAN_ITEM_KEY: // 48  					fmt.Printf("\t\torphan item\n") +				case btrfsitem.TREE_BLOCK_REF_KEY: // 176 +					fmt.Printf("\t\ttree block backref\n") +				case btrfsitem.SHARED_BLOCK_REF_KEY: // 182 +					fmt.Printf("\t\tshared block backref\n") +				case btrfsitem.FREE_SPACE_EXTENT_KEY: // 199 +					fmt.Printf("\t\tfree space extent\n") +				case btrfsitem.QGROUP_RELATION_KEY: // 246 +					// do nothing +				//case btrfsitem.EXTENT_REF_V0_KEY: +				//	fmt.Printf("\t\textent ref v0 (deprecated)\n") +				//case btrfsitem.CSUM_ITEM_KEY: +				//	fmt.Printf("\t\tcsum item\n")  				default:  					fmt.Printf("\t\t(error) unhandled empty item type: %v\n", item.Head.Key.ItemType)  				} diff --git a/pkg/btrfs/btrfsitem/item_empty.go b/pkg/btrfs/btrfsitem/item_empty.go index 5a26104..db7053f 100644 --- a/pkg/btrfs/btrfsitem/item_empty.go +++ b/pkg/btrfs/btrfsitem/item_empty.go @@ -4,6 +4,6 @@ import (  	"lukeshu.com/btrfs-tools/pkg/binstruct"  ) -type Empty struct { // UNTYPED=0, TREE_BLOCK_REF=176, SHARED_BLOCK_REF=182, QGROUP_RELATION=246 +type Empty struct { // UNTYPED=0, ORPHAN_ITEM=48, TREE_BLOCK_REF=176, SHARED_BLOCK_REF=182, FREE_SPACE_EXTENT=199, QGROUP_RELATION=246  	binstruct.End `bin:"off=0"`  } diff --git a/pkg/btrfs/btrfsitem/item_freespacebitmap.go b/pkg/btrfs/btrfsitem/item_freespacebitmap.go new file mode 100644 index 0000000..6158eb0 --- /dev/null +++ b/pkg/btrfs/btrfsitem/item_freespacebitmap.go @@ -0,0 +1,12 @@ +package btrfsitem + +type FreeSpaceBitmap []byte // FREE_SPACE_BITMAP=200 + +func (o *FreeSpaceBitmap) UnmarshalBinary(dat []byte) (int, error) { +	*o = dat +	return len(dat), nil +} + +func (o FreeSpaceBitmap) MarshalBinary() ([]byte, error) { +	return []byte(o), nil +} diff --git a/pkg/btrfs/btrfsitem/item_freespaceinfo.go b/pkg/btrfs/btrfsitem/item_freespaceinfo.go new file mode 100644 index 0000000..4931844 --- /dev/null +++ b/pkg/btrfs/btrfsitem/item_freespaceinfo.go @@ -0,0 +1,11 @@ +package btrfsitem + +import ( +	"lukeshu.com/btrfs-tools/pkg/binstruct" +) + +type FreeSpaceInfo struct { // FREE_SPACE_INFO=198 +	ExtentCount   int32  `bin:"off=0, siz=4"` +	Flags         uint32 `bin:"off=4, siz=4"` +	binstruct.End `bin:"off=8"` +} diff --git a/pkg/btrfs/btrfsitem/item_orphan.go b/pkg/btrfs/btrfsitem/item_orphan.go deleted file mode 100644 index 6cf29b0..0000000 --- a/pkg/btrfs/btrfsitem/item_orphan.go +++ /dev/null @@ -1,9 +0,0 @@ -package btrfsitem - -import ( -	"lukeshu.com/btrfs-tools/pkg/binstruct" -) - -type Orphan struct { // ORPHAN_ITEM=48 -	binstruct.End `bin:"off=0"` -} diff --git a/pkg/btrfs/btrfsitem/items.txt b/pkg/btrfs/btrfsitem/items.txt index e713a80..73bdbe8 100644 --- a/pkg/btrfs/btrfsitem/items.txt +++ b/pkg/btrfs/btrfsitem/items.txt @@ -6,10 +6,13 @@ DIR_INDEX=96, DirList  DIR_ITEM=84, DirList  EXTENT_DATA_REF=178 ExtentDataRef  EXTENT_ITEM=168 Extent +FREE_SPACE_BITMAP=200 FreeSpaceBitmap +FREE_SPACE_EXTENT=199, Empty +FREE_SPACE_INFO=198 FreeSpaceInfo  INODE_ITEM=1 Inode  INODE_REF=12 InodeRefList  METADATA_ITEM=169 Metadata -ORPHAN_ITEM=48 Orphan +ORPHAN_ITEM=48, Empty  PERSISTENT_ITEM=249 DevStats  QGROUP_RELATION=246 Empty  ROOT_ITEM=132 Root diff --git a/pkg/btrfs/btrfsitem/items_gen.go b/pkg/btrfs/btrfsitem/items_gen.go index 063c2e7..27fc5c2 100644 --- a/pkg/btrfs/btrfsitem/items_gen.go +++ b/pkg/btrfs/btrfsitem/items_gen.go @@ -17,6 +17,9 @@ const (  	DIR_ITEM_KEY             = internal.DIR_ITEM_KEY  	EXTENT_DATA_REF_KEY      = internal.EXTENT_DATA_REF_KEY  	EXTENT_ITEM_KEY          = internal.EXTENT_ITEM_KEY +	FREE_SPACE_BITMAP_KEY    = internal.FREE_SPACE_BITMAP_KEY +	FREE_SPACE_EXTENT_KEY    = internal.FREE_SPACE_EXTENT_KEY +	FREE_SPACE_INFO_KEY      = internal.FREE_SPACE_INFO_KEY  	INODE_ITEM_KEY           = internal.INODE_ITEM_KEY  	INODE_REF_KEY            = internal.INODE_REF_KEY  	METADATA_ITEM_KEY        = internal.METADATA_ITEM_KEY @@ -42,10 +45,13 @@ var keytype2gotype = map[Type]reflect.Type{  	DIR_ITEM_KEY:             reflect.TypeOf(DirList{}),  	EXTENT_DATA_REF_KEY:      reflect.TypeOf(ExtentDataRef{}),  	EXTENT_ITEM_KEY:          reflect.TypeOf(Extent{}), +	FREE_SPACE_BITMAP_KEY:    reflect.TypeOf(FreeSpaceBitmap{}), +	FREE_SPACE_EXTENT_KEY:    reflect.TypeOf(Empty{}), +	FREE_SPACE_INFO_KEY:      reflect.TypeOf(FreeSpaceInfo{}),  	INODE_ITEM_KEY:           reflect.TypeOf(Inode{}),  	INODE_REF_KEY:            reflect.TypeOf(InodeRefList{}),  	METADATA_ITEM_KEY:        reflect.TypeOf(Metadata{}), -	ORPHAN_ITEM_KEY:          reflect.TypeOf(Orphan{}), +	ORPHAN_ITEM_KEY:          reflect.TypeOf(Empty{}),  	PERSISTENT_ITEM_KEY:      reflect.TypeOf(DevStats{}),  	QGROUP_RELATION_KEY:      reflect.TypeOf(Empty{}),  	ROOT_ITEM_KEY:            reflect.TypeOf(Root{}), @@ -58,19 +64,20 @@ var keytype2gotype = map[Type]reflect.Type{  	XATTR_ITEM_KEY:           reflect.TypeOf(DirList{}),  } -func (BlockGroup) isItem()    {} -func (Chunk) isItem()         {} -func (Dev) isItem()           {} -func (DevExtent) isItem()     {} -func (DevStats) isItem()      {} -func (DirList) isItem()       {} -func (Empty) isItem()         {} -func (Extent) isItem()        {} -func (ExtentDataRef) isItem() {} -func (Inode) isItem()         {} -func (InodeRefList) isItem()  {} -func (Metadata) isItem()      {} -func (Orphan) isItem()        {} -func (Root) isItem()          {} -func (SharedDataRef) isItem() {} -func (UUIDMap) isItem()       {} +func (BlockGroup) isItem()      {} +func (Chunk) isItem()           {} +func (Dev) isItem()             {} +func (DevExtent) isItem()       {} +func (DevStats) isItem()        {} +func (DirList) isItem()         {} +func (Empty) isItem()           {} +func (Extent) isItem()          {} +func (ExtentDataRef) isItem()   {} +func (FreeSpaceBitmap) isItem() {} +func (FreeSpaceInfo) isItem()   {} +func (Inode) isItem()           {} +func (InodeRefList) isItem()    {} +func (Metadata) isItem()        {} +func (Root) isItem()            {} +func (SharedDataRef) isItem()   {} +func (UUIDMap) isItem()         {} diff --git a/pkg/btrfs/internal/itemtype.go b/pkg/btrfs/internal/itemtype.go index cc38d94..aa6e4f9 100644 --- a/pkg/btrfs/internal/itemtype.go +++ b/pkg/btrfs/internal/itemtype.go @@ -15,6 +15,9 @@ const (  	DIR_ITEM_KEY             = ItemType(84)  	EXTENT_DATA_REF_KEY      = ItemType(178)  	EXTENT_ITEM_KEY          = ItemType(168) +	FREE_SPACE_BITMAP_KEY    = ItemType(200) +	FREE_SPACE_EXTENT_KEY    = ItemType(199) +	FREE_SPACE_INFO_KEY      = ItemType(198)  	INODE_ITEM_KEY           = ItemType(1)  	INODE_REF_KEY            = ItemType(12)  	METADATA_ITEM_KEY        = ItemType(169) @@ -41,6 +44,9 @@ func (t ItemType) String() string {  		DIR_ITEM_KEY:             "DIR_ITEM",  		EXTENT_DATA_REF_KEY:      "EXTENT_DATA_REF",  		EXTENT_ITEM_KEY:          "EXTENT_ITEM", +		FREE_SPACE_BITMAP_KEY:    "FREE_SPACE_BITMAP", +		FREE_SPACE_EXTENT_KEY:    "FREE_SPACE_EXTENT", +		FREE_SPACE_INFO_KEY:      "FREE_SPACE_INFO",  		INODE_ITEM_KEY:           "INODE_ITEM",  		INODE_REF_KEY:            "INODE_REF",  		METADATA_ITEM_KEY:        "METADATA_ITEM", | 
