Re: Retrieving

Zygo Blaxell
2019-01-25T21:27:37Z

[-- Attachment #1: Type: text/plain, Size: 1680 bytes --]

On Sun, Jan 13, 2019 at 11:19:04AM +0100, Tobias Reinhard wrote:
> I want to read the complete CSUM-Tree from userspace. I tried it via the
> ioctl. This is what the code looks like:
>
> struct btrfs_sv2_args sv2_args;
> int fd = open(filename, O_RDONLY);
> sv2_args.key.tree_id = BTRFS_CSUM_TREE_OBJECTID;
> sv2_args.key.min_objectid = 0;
> sv2_args.key.max_objectid = -1;
> sv2_args.key.min_offset = 0;
> sv2_args.key.max_offset = -1;
> sv2_args.key.min_transid = 0;
> sv2_args.key.max_transid = -1;
> sv2_args.key.min_type = BTRFS_CSUM_ITEM_KEY;
> sv2_args.key.max_type = BTRFS_CSUM_ITEM_KEY;
> sv2_args.key.nr_items = -1;
> sv2_args.buf_size = sizeof(sv2_args.buf);
> ioctl(fd, BTRFS_IOC_TREE_SEARCH_V2, &sv2_args);
>
> But the device is not small and I hit the limit of the btrfs_sv2_args.buf
> which seems to be 16 MB.
>
> How can I get the *complete* CSUM-Tree?
>
> Limiting to offset does not work (My first idea was to do it this way and
> get it in chunks).

The search key is (objectid, BTRFS_CSUM_ITEM_KEY, offset) and the key is
treated as a single 136-bit integer for filtering and sorting purposes.
According to key order:

(123, BTRFS_CSUM_ITEM_KEY, 456) < (124, BTRFS_CSUM_ITEM_KEY, 234)

You must iterate by objectid (the extent bytenr), key, and offset (the
length of the csum data). In many btrfs trees you will get extra data
in the search results with different type fields which you will have
to discard.

> Limiting to a single transid does not work as well because even one transid
> is larger than the limit.
>
> Kernel is 4.15.
>
> Any help would be appreciated.
>
> Best Regards
>
> Tobias
>

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 195 bytes --]