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:
signature.asc
Description: PGP signature
