diff options
author | Luke Shumaker <lukeshu@lukeshu.com> | 2022-07-02 22:10:55 -0600 |
---|---|---|
committer | Luke Shumaker <lukeshu@lukeshu.com> | 2022-07-02 22:10:55 -0600 |
commit | 6b3974fe1c4616d8b9872d88d737623cc48c4368 (patch) | |
tree | a4b795bfbef48aefca949c96b4bd9f14b4a79992 /pkg/btrfs/btrfsitem | |
parent | e43749b899d09b57310240fe3abf0f964b9e0cd0 (diff) |
subvolumes
Diffstat (limited to 'pkg/btrfs/btrfsitem')
-rw-r--r-- | pkg/btrfs/btrfsitem/item_rootref.go | 34 | ||||
-rw-r--r-- | pkg/btrfs/btrfsitem/item_uuid.go | 3 | ||||
-rw-r--r-- | pkg/btrfs/btrfsitem/items.txt | 2 | ||||
-rw-r--r-- | pkg/btrfs/btrfsitem/items_gen.go | 5 |
4 files changed, 44 insertions, 0 deletions
diff --git a/pkg/btrfs/btrfsitem/item_rootref.go b/pkg/btrfs/btrfsitem/item_rootref.go new file mode 100644 index 0000000..567e9c7 --- /dev/null +++ b/pkg/btrfs/btrfsitem/item_rootref.go @@ -0,0 +1,34 @@ +package btrfsitem + +import ( + "lukeshu.com/btrfs-tools/pkg/binstruct" + "lukeshu.com/btrfs-tools/pkg/btrfs/internal" +) + +type RootRef struct { // ROOT_REF=156 ROOT_BACKREF=144 + DirID internal.ObjID `bin:"off=0x00, siz=0x8"` + Sequence int64 `bin:"off=0x08, siz=0x8"` + NameLen uint16 `bin:"off=0x10, siz=0x2"` // [ignored-when-writing] + binstruct.End `bin:"off=0x12"` + Name []byte `bin:"-"` +} + +func (o *RootRef) UnmarshalBinary(dat []byte) (int, error) { + n, err := binstruct.UnmarshalWithoutInterface(dat, o) + if err != nil { + return n, err + } + o.Name = dat[n : n+int(o.NameLen)] + n += int(o.NameLen) + return n, nil +} + +func (o RootRef) MarshalBinary() ([]byte, error) { + o.NameLen = uint16(len(o.Name)) + dat, err := binstruct.MarshalWithoutInterface(o) + if err != nil { + return dat, err + } + dat = append(dat, o.Name...) + return dat, nil +} diff --git a/pkg/btrfs/btrfsitem/item_uuid.go b/pkg/btrfs/btrfsitem/item_uuid.go index d66e102..6b47547 100644 --- a/pkg/btrfs/btrfsitem/item_uuid.go +++ b/pkg/btrfs/btrfsitem/item_uuid.go @@ -7,6 +7,9 @@ import ( // The Key for this item is a UUID, and the item is a list of // subvolume IDs (ObjectIDs) that that UUID maps to. +// +// key.objectid = first half of UUID +// key.offset = second half of UUID type UUIDMap []internal.ObjID // UUID_SUBVOL=251 UUID_RECEIVED_SUBVOL=252 func (o *UUIDMap) UnmarshalBinary(dat []byte) (int, error) { diff --git a/pkg/btrfs/btrfsitem/items.txt b/pkg/btrfs/btrfsitem/items.txt index a5f247f..2820788 100644 --- a/pkg/btrfs/btrfsitem/items.txt +++ b/pkg/btrfs/btrfsitem/items.txt @@ -17,7 +17,9 @@ METADATA_ITEM=169 Metadata ORPHAN_ITEM=48 Empty PERSISTENT_ITEM=249 DevStats QGROUP_RELATION=246 Empty +ROOT_BACKREF=144 RootRef ROOT_ITEM=132 Root +ROOT_REF=156 RootRef SHARED_BLOCK_REF=182 Empty SHARED_DATA_REF=184 SharedDataRef TREE_BLOCK_REF=176 Empty diff --git a/pkg/btrfs/btrfsitem/items_gen.go b/pkg/btrfs/btrfsitem/items_gen.go index 92e2523..030202b 100644 --- a/pkg/btrfs/btrfsitem/items_gen.go +++ b/pkg/btrfs/btrfsitem/items_gen.go @@ -28,7 +28,9 @@ const ( ORPHAN_ITEM_KEY = internal.ORPHAN_ITEM_KEY PERSISTENT_ITEM_KEY = internal.PERSISTENT_ITEM_KEY QGROUP_RELATION_KEY = internal.QGROUP_RELATION_KEY + ROOT_BACKREF_KEY = internal.ROOT_BACKREF_KEY ROOT_ITEM_KEY = internal.ROOT_ITEM_KEY + ROOT_REF_KEY = internal.ROOT_REF_KEY SHARED_BLOCK_REF_KEY = internal.SHARED_BLOCK_REF_KEY SHARED_DATA_REF_KEY = internal.SHARED_DATA_REF_KEY TREE_BLOCK_REF_KEY = internal.TREE_BLOCK_REF_KEY @@ -58,7 +60,9 @@ var keytype2gotype = map[Type]reflect.Type{ ORPHAN_ITEM_KEY: reflect.TypeOf(Empty{}), PERSISTENT_ITEM_KEY: reflect.TypeOf(DevStats{}), QGROUP_RELATION_KEY: reflect.TypeOf(Empty{}), + ROOT_BACKREF_KEY: reflect.TypeOf(RootRef{}), ROOT_ITEM_KEY: reflect.TypeOf(Root{}), + ROOT_REF_KEY: reflect.TypeOf(RootRef{}), SHARED_BLOCK_REF_KEY: reflect.TypeOf(Empty{}), SHARED_DATA_REF_KEY: reflect.TypeOf(SharedDataRef{}), TREE_BLOCK_REF_KEY: reflect.TypeOf(Empty{}), @@ -88,5 +92,6 @@ func (Inode) isItem() {} func (InodeRefList) isItem() {} func (Metadata) isItem() {} func (Root) isItem() {} +func (RootRef) isItem() {} func (SharedDataRef) isItem() {} func (UUIDMap) isItem() {} |