1 // SPDX-License-Identifier: GPL-2.0+
3 * BTRFS filesystem implementation for U-Boot
12 u64 btrfs_read_extent_inline(struct btrfs_path *path,
13 struct btrfs_file_extent_item *extent, u64 offset,
16 u32 clen, dlen, orig_size = size, res;
19 const int data_off = offsetof(struct btrfs_file_extent_item,
22 clen = btrfs_path_item_size(path) - data_off;
23 cbuf = (const char *) extent + data_off;
24 dlen = extent->ram_bytes;
29 if (size > dlen - offset)
32 if (extent->compression == BTRFS_COMPRESS_NONE) {
33 memcpy(out, cbuf + offset, size);
37 if (dlen > orig_size) {
45 res = btrfs_decompress(extent->compression, cbuf, clen, dbuf, dlen);
46 if (res == -1 || res != dlen)
49 if (dlen > orig_size) {
50 memcpy(out, dbuf + offset, size);
53 memmove(out, dbuf + offset, size);
64 u64 btrfs_read_extent_reg(struct btrfs_path *path,
65 struct btrfs_file_extent_item *extent, u64 offset,
68 u64 physical, clen, dlen, orig_size = size;
72 clen = extent->disk_num_bytes;
73 dlen = extent->num_bytes;
78 if (size > dlen - offset)
82 if (extent->disk_bytenr == 0) {
87 physical = btrfs_map_logical_to_physical(extent->disk_bytenr);
88 if (physical == -1ULL)
91 if (extent->compression == BTRFS_COMPRESS_NONE) {
92 physical += extent->offset + offset;
93 if (!btrfs_devread(physical, size, out))
99 cbuf = malloc_cache_aligned(dlen > size ? clen + dlen : clen);
103 if (dlen > orig_size)
108 if (!btrfs_devread(physical, clen, cbuf))
111 res = btrfs_decompress(extent->compression, cbuf, clen, dbuf, dlen);
115 if (dlen > orig_size)
116 memcpy(out, dbuf + offset, size);
118 memmove(out, dbuf + offset, size);