Skip to content
Permalink
Browse files

Show Dev Extents

The DEV TREE shows a mapping from all allocated blocks on the physical
storage back to chunks and their stripes.

    >>> import btrfs
    >>> from __future__ import print_function
    >>> fs=btrfs.FileSystem('/mnt/extents')
    >>> map(print, fs.dev_extents())
    dev extent devid 1 paddr 1048576 length 134217728 chunk 14348713984
    dev extent devid 1 paddr 135266304 length 33554432 chunk 14617149440
    dev extent devid 1 paddr 168820736 length 1073741824 chunk 16831741952
    dev extent devid 1 paddr 2436890624 length 1073741824 chunk 12201230336
    dev extent devid 2 paddr 1048576 length 1073741824 chunk 12201230336
    dev extent devid 2 paddr 1074790400 length 134217728 chunk 14348713984
    dev extent devid 2 paddr 1209008128 length 33554432 chunk 14617149440
    dev extent devid 2 paddr 1242562560 length 1073741824 chunk 16831741952

Or, with some information about the chunk they refer to:

    # ./show_dev_extents.py /mnt/extents/
    devid 1 type METADATA|RAID0 pstart 1.00MiB length 128.00MiB pend 129.00MiB vaddr 13.36GiB
    devid 1 type SYSTEM|RAID0 pstart 129.00MiB length 32.00MiB pend 161.00MiB vaddr 13.61GiB
    devid 1 type DATA|RAID0 pstart 161.00MiB length 1.00GiB pend 1.16GiB vaddr 15.68GiB
    devid 1 type DATA|RAID0 pstart 2.27GiB length 1.00GiB pend 3.27GiB vaddr 11.36GiB
    devid 2 type DATA|RAID0 pstart 1.00MiB length 1.00GiB pend 1.00GiB vaddr 11.36GiB
    devid 2 type METADATA|RAID0 pstart 1.00GiB length 128.00MiB pend 1.13GiB vaddr 13.36GiB
    devid 2 type SYSTEM|RAID0 pstart 1.13GiB length 32.00MiB pend 1.16GiB vaddr 13.61GiB
    devid 2 type DATA|RAID0 pstart 1.16GiB length 1.00GiB pend 2.16GiB vaddr 15.68GiB
  • Loading branch information
knorrie committed Jun 23, 2016
1 parent ab3310f commit be85c2a0e2774909b532326e99e0c23ab8467263
Showing with 43 additions and 0 deletions.
  1. +26 −0 btrfs/ctree.py
  2. +17 −0 examples/show_dev_extents.py
@@ -35,6 +35,7 @@ def ULL(n):
ROOT_TREE_OBJECTID = 1
EXTENT_TREE_OBJECTID = 2
CHUNK_TREE_OBJECTID = 3
DEV_TREE_OBJECTID = 4
FIRST_CHUNK_TREE_OBJECTID = 256
ORPHAN_OBJECTID = ULL(-5)

@@ -43,6 +44,7 @@ def ULL(n):
EXTENT_DATA_REF_KEY = 178
SHARED_DATA_REF_KEY = 184
BLOCK_GROUP_ITEM_KEY = 192
DEV_EXTENT_KEY = 204
DEV_ITEM_KEY = 216
CHUNK_ITEM_KEY = 228

@@ -103,6 +105,7 @@ def key_objectid_str(objectid, _type):
EXTENT_DATA_REF_KEY: 'EXTENT_DATA_REF',
SHARED_DATA_REF_KEY: 'SHARED_DATA_REF',
BLOCK_GROUP_ITEM_KEY: 'BLOCK_GROUP_ITEM',
DEV_EXTENT_KEY: 'DEV_EXTENT',
DEV_ITEM_KEY: 'DEV_ITEM',
CHUNK_ITEM_KEY: 'CHUNK_ITEM',
}
@@ -234,6 +237,12 @@ def chunks(self, min_vaddr=0, max_vaddr=ULLONG_MAX, nr_items=ULONG_MAX):
nr_items=nr_items):
yield Chunk(header, data)

def dev_extents(self):
tree = DEV_TREE_OBJECTID
for header, data in btrfs.ioctl.search(self.fd, tree):
if header.type == DEV_EXTENT_KEY:
yield DevExtent(header, data)

def block_group(self, vaddr, length=None):
tree = EXTENT_TREE_OBJECTID
min_offset = length if length is not None else 0
@@ -324,6 +333,23 @@ def __str__(self):
return "stripe devid {0} offset {1}".format(self.devid, self.offset)


class DevExtent(object):
dev_extent = struct.Struct("<4Q16s")

def __init__(self, header, data):
self.key = Key(header.objectid, header.type, header.offset)
self.devid = header.objectid
self.paddr = header.offset
self.chunk_tree, self.chunk_objectid, self.chunk_offset, self.length, uuid_bytes = \
DevExtent.dev_extent.unpack_from(data, 0)
self.vaddr = self.chunk_offset
self.uuid = uuid.UUID(bytes=uuid_bytes)

def __str__(self):
return "dev extent devid {0} paddr {1} length {2} chunk {3}".format(
self.devid, self.paddr, self.length, self.chunk_offset)


class BlockGroup(object):
block_group_item = struct.Struct("<3Q")

@@ -0,0 +1,17 @@
#!/usr/bin/python

from __future__ import print_function
import btrfs
import sys

fs = btrfs.FileSystem(sys.argv[1])
chunks = {chunk.vaddr: chunk for chunk in fs.chunks()}
for d in fs.dev_extents():
print("devid {0} type {1} pstart {2} length {3} pend {4} vaddr {5}".format(
d.devid,
btrfs.utils.block_group_flags_str(chunks[d.vaddr].type),
btrfs.utils.pretty_size(d.paddr),
btrfs.utils.pretty_size(d.length),
btrfs.utils.pretty_size(d.paddr + d.length),
btrfs.utils.pretty_size(d.vaddr)
))

0 comments on commit be85c2a

Please sign in to comment.
You can’t perform that action at this time.