36 uint32_t high_crc = 0xffffffff, low_crc = 0xffffffff;
62 ERR(
"unhandled extent type %x\n",
type);
81 le = extent_refs->
Flink;
83 while (le != extent_refs) {
97 ERR(
"out of memory\n");
115 le = extent_refs->
Flink;
117 while (le != extent_refs) {
129 ERR(
"out of memory\n");
146 le = extent_refs->
Flink;
148 while (le != extent_refs) {
160 ERR(
"out of memory\n");
185 bool inserted =
false;
188 while (le != &newlist) {
204 newlist.
Flink->Blink = extent_refs;
205 newlist.
Blink->Flink = extent_refs;
216 bool all_inline =
true;
224 WARN(
"no extent refs found\n");
234 le = extent_refs->
Flink;
235 while (le != extent_refs) {
255 if ((
uint16_t)(inline_len + 1 + extlen) >
Vcb->superblock.node_size >> 2) {
257 first_noninline = er;
259 inline_len += extlen + 1;
268 ERR(
"out of memory\n");
297 le = extent_refs->
Flink;
298 while (le != extent_refs) {
302 if (!all_inline && er == first_noninline)
318 ERR(
"insert_tree_item returned %08lx\n",
Status);
326 while (le != extent_refs) {
337 ERR(
"out of memory\n");
348 ERR(
"out of memory\n");
360 ERR(
"insert_tree_item returned %08lx\n",
Status);
383 searchkey.
offset = 0xffffffffffffffff;
387 ERR(
"find_item returned %08lx\n",
Status);
392 ERR(
"old-style extent %I64x not found\n",
address);
400 ERR(
"delete_tree_item returned %08lx\n",
Status);
414 ERR(
"add_tree_block_extent_ref returned %08lx\n",
Status);
420 ERR(
"add_shared_block_extent_ref returned %08lx\n",
Status);
427 ERR(
"add_shared_data_extent_ref returned %08lx\n",
Status);
434 ERR(
"delete_tree_item returned %08lx\n",
Status);
444 &extent_refs, firstitem,
level,
Irp);
446 ERR(
"construct_extent_item returned %08lx\n",
Status);
469 ERR(
"unrecognized extent type %x\n",
type);
475 searchkey.
offset = 0xffffffffffffffff;
479 ERR(
"error - find_item returned %08lx\n",
Status);
495 ERR(
"out of memory\n");
520 ERR(
"insert_tree_item returned %08lx\n",
Status);
536 ERR(
"convert_old_extent returned %08lx\n",
Status);
586 if (secttype ==
type) {
597 ERR(
"out of memory\n");
606 sectedr2->
count += rc;
610 ERR(
"delete_tree_item returned %08lx\n",
Status);
616 ERR(
"insert_tree_item returned %08lx\n",
Status);
627 TRACE(
"trying to increase refcount of non-shared tree extent\n");
646 ERR(
"out of memory\n");
655 sectsdr2->
count += rc;
659 ERR(
"delete_tree_item returned %08lx\n",
Status);
665 ERR(
"insert_tree_item returned %08lx\n",
Status);
672 ERR(
"unhandled extent type %x\n",
type);
679 inline_rc += sectcount;
684 max_extent_item_size = (
Vcb->superblock.node_size >> 4) -
sizeof(
leaf_node);
707 if (secttype ==
type) {
733 ERR(
"delete_tree_item returned %08lx\n",
Status);
739 ERR(
"insert_tree_item returned %08lx\n",
Status);
757 ERR(
"error - find_item returned %08lx\n",
Status);
772 ERR(
"out of memory\n");
783 TRACE(
"trying to increase refcount of non-shared tree extent\n");
792 ERR(
"unhandled extent type %x\n",
type);
798 ERR(
"delete_tree_item returned %08lx\n",
Status);
804 ERR(
"insert_tree_item returned %08lx\n",
Status);
810 ERR(
"out of memory\n");
820 ERR(
"delete_tree_item returned %08lx\n",
Status);
826 ERR(
"insert_tree_item returned %08lx\n",
Status);
841 ERR(
"out of memory\n");
854 ERR(
"out of memory\n");
863 ERR(
"insert_tree_item returned %08lx\n",
Status);
869 ERR(
"out of memory\n");
879 ERR(
"delete_tree_item returned %08lx\n",
Status);
885 ERR(
"insert_tree_item returned %08lx\n",
Status);
898 edr.
count = refcount;
919 searchkey.
offset = 0xffffffffffffffff;
923 ERR(
"error - find_item returned %08lx\n",
Status);
934 searchkey.
offset = 0xffffffffffffffff;
938 ERR(
"error - find_item returned %08lx\n",
Status);
943 ERR(
"could not find EXTENT_ITEM for address %I64x\n",
address);
956 ERR(
"convert_old_extent returned %08lx\n",
Status);
985 ERR(
"error - extent has refcount %I64x, trying to reduce by %x\n", ei->
refcount, rc);
1000 if (sectlen >
len) {
1010 if (secttype ==
type) {
1022 ERR(
"delete_tree_item returned %08lx\n",
Status);
1033 ERR(
"error - extent section has refcount %x, trying to reduce by %x\n", sectedr->
count, edr->
count);
1044 ERR(
"out of memory\n");
1053 newedr->
count -= rc;
1065 ERR(
"delete_tree_item returned %08lx\n",
Status);
1071 ERR(
"insert_tree_item returned %08lx\n",
Status);
1088 ERR(
"delete_tree_item returned %08lx\n",
Status);
1099 ERR(
"error - SHARED_DATA_REF has refcount %x, trying to reduce by %x\n", sectsdr->
count, sdr->
count);
1110 ERR(
"out of memory\n");
1119 newsdr->
count -= rc;
1131 ERR(
"delete_tree_item returned %08lx\n",
Status);
1137 ERR(
"insert_tree_item returned %08lx\n",
Status);
1154 ERR(
"delete_tree_item returned %08lx\n",
Status);
1165 ERR(
"out of memory\n");
1178 ERR(
"delete_tree_item returned %08lx\n",
Status);
1184 ERR(
"insert_tree_item returned %08lx\n",
Status);
1201 ERR(
"delete_tree_item returned %08lx\n",
Status);
1212 ERR(
"out of memory\n");
1225 ERR(
"delete_tree_item returned %08lx\n",
Status);
1231 ERR(
"insert_tree_item returned %08lx\n",
Status);
1238 ERR(
"unhandled extent type %x\n",
type);
1245 inline_rc += sectcount;
1249 ERR(
"entry not found in inline extent item for address %I64x\n",
address);
1264 ERR(
"error - find_item returned %08lx\n",
Status);
1282 if (sectedr->
root == edr->root && sectedr->
objid == edr->objid && sectedr->
offset == edr->offset) {
1288 ERR(
"delete_tree_item returned %08lx\n",
Status);
1294 ERR(
"delete_tree_item returned %08lx\n",
Status);
1304 if (sectedr->
count < edr->count) {
1305 ERR(
"error - extent section has refcount %x, trying to reduce by %x\n", sectedr->
count, edr->count);
1311 ERR(
"delete_tree_item returned %08lx\n",
Status);
1315 if (sectedr->
count > edr->count) {
1319 ERR(
"out of memory\n");
1325 newedr->
count -= edr->count;
1329 ERR(
"insert_tree_item returned %08lx\n",
Status);
1336 ERR(
"out of memory\n");
1346 ERR(
"delete_tree_item returned %08lx\n",
Status);
1352 ERR(
"insert_tree_item returned %08lx\n",
Status);
1358 ERR(
"error - hash collision?\n");
1371 ERR(
"delete_tree_item returned %08lx\n",
Status);
1377 ERR(
"delete_tree_item returned %08lx\n",
Status);
1387 if (*sectsdrcount < sdr->
count) {
1388 ERR(
"error - extent section has refcount %x, trying to reduce by %x\n", *sectsdrcount, sdr->
count);
1394 ERR(
"delete_tree_item returned %08lx\n",
Status);
1398 if (*sectsdrcount > sdr->
count) {
1402 ERR(
"out of memory\n");
1406 *newsdr = *sectsdrcount - sdr->
count;
1410 ERR(
"insert_tree_item returned %08lx\n",
Status);
1417 ERR(
"out of memory\n");
1423 newei->refcount -= rc;
1427 ERR(
"delete_tree_item returned %08lx\n",
Status);
1433 ERR(
"insert_tree_item returned %08lx\n",
Status);
1439 ERR(
"error - collision?\n");
1448 ERR(
"delete_tree_item returned %08lx\n",
Status);
1454 ERR(
"delete_tree_item returned %08lx\n",
Status);
1463 ERR(
"delete_tree_item returned %08lx\n",
Status);
1469 ERR(
"out of memory\n");
1479 ERR(
"delete_tree_item returned %08lx\n",
Status);
1485 ERR(
"insert_tree_item returned %08lx\n",
Status);
1497 ERR(
"delete_tree_item returned %08lx\n",
Status);
1503 ERR(
"delete_tree_item returned %08lx\n",
Status);
1515 ERR(
"delete_tree_item returned %08lx\n",
Status);
1521 ERR(
"out of memory\n");
1527 newei->refcount -= rc;
1531 ERR(
"delete_tree_item returned %08lx\n",
Status);
1537 ERR(
"insert_tree_item returned %08lx\n",
Status);
1543 ERR(
"unhandled extent type %x\n",
type);
1555 edr.
count = refcount;
1576 searchkey.
offset = 0xffffffffffffffff;
1580 ERR(
"error - find_item returned %08lx\n",
Status);
1585 TRACE(
"could not find address %I64x in extent tree\n",
address);
1606 if (sectlen >
len) {
1634 ERR(
"error - find_item returned %08lx\n",
Status);
1659 searchkey.
offset = 0xffffffffffffffff;
1663 ERR(
"error - find_item returned %08lx\n",
Status);
1721 WARN(
"error - find_item returned %08lx\n",
Status);
1764 if (sectlen >
len) {
1815 rcrun += edr->
count;
1843 searchkey.
offset = 0xffffffffffffffff;
1847 ERR(
"error - find_item returned %08lx\n",
Status);
1859 ERR(
"couldn't find %I64x in extent tree\n",
address);
1884 searchkey.
offset = 0xffffffffffffffff;
1888 ERR(
"error - find_item returned %08lx\n",
Status);
1900 ERR(
"couldn't find %I64x in extent tree\n",
address);
1920 le =
c->changed_extents.
Flink;
1921 while (le != &
c->changed_extents) {
1932 ERR(
"out of memory\n");
1966 ERR(
"get_changed_extent_item failed\n");
1974 searchkey.
offset = 0xffffffffffffffff;
1978 ERR(
"error - find_item returned %08lx\n",
Status);
1983 ERR(
"could not find address %I64x in extent tree\n",
address);
2010 while (le != &ce->
refs) {
2029 if (old_count > 0) {
2033 ERR(
"out of memory\n");
2050 ERR(
"out of memory\n");
2084 ERR(
"get_changed_extent_item failed\n");
2089 while (le != &ce->
refs) {
2104 ERR(
"out of memory\n");
2130 searchkey.
offset = 0xffffffffffffffff;
2134 ERR(
"error - find_item returned %08lx\n",
Status);
2139 TRACE(
"could not find address %I64x in extent tree\n",
address);
2177 if (sectlen >
len) {
2196 inline_rc += sectcount;
2210 ERR(
"error - find_item returned %08lx\n",
Status);
2231 searchkey.
offset = 0xffffffffffffffff;
2235 ERR(
"error - find_item returned %08lx\n",
Status);
2240 TRACE(
"could not find address %I64x in extent tree\n",
address);
2262 if (sectlen >
len) {
2276 return sectsdr->
count;
2281 inline_rc += sectcount;
2295 ERR(
"error - find_item returned %08lx\n",
Status);
unsigned short int uint16_t
static __inline uint32_t get_extent_data_refcount(uint8_t type, void *data)
#define keycmp(key1, key2)
NTSTATUS insert_tree_item(_In_ _Requires_exclusive_lock_held_(_Curr_->tree_lock) device_extension *Vcb, _In_ root *r, _In_ uint64_t obj_id, _In_ uint8_t obj_type, _In_ uint64_t offset, _In_reads_bytes_opt_(size) _When_(return >=0, __drv_aliasesMem) void *data, _In_ uint16_t size, _Out_opt_ traverse_ptr *ptp, _In_opt_ PIRP Irp) __attribute__((nonnull(1
static __inline uint16_t get_extent_data_len(uint8_t type)
NTSTATUS NTSTATUS bool find_next_item(_Requires_lock_held_(_Curr_->tree_lock) device_extension *Vcb, const traverse_ptr *tp, traverse_ptr *next_tp, bool ignore, PIRP Irp) __attribute__((nonnull(1
NTSTATUS NTSTATUS delete_tree_item(_In_ _Requires_exclusive_lock_held_(_Curr_->tree_lock) device_extension *Vcb, _Inout_ traverse_ptr *tp) __attribute__((nonnull(1
void add_checksum_entry(device_extension *Vcb, uint64_t address, ULONG length, void *csum, PIRP Irp)
#define NT_SUCCESS(StatCode)
static WCHAR superseded[MAX_STRING_RESOURCE_LEN]
static LONG find_item(PropertyBag *This, LPCOLESTR name)
_In_ uint64_t _In_ uint64_t _In_ uint64_t _In_opt_ traverse_ptr * tp
#define BTRFS_INCOMPAT_FLAGS_SKINNY_METADATA
#define TYPE_EXTENT_DATA_REF
#define TYPE_SHARED_BLOCK_REF
#define EXTENT_ITEM_TREE_BLOCK
#define TYPE_SHARED_DATA_REF
#define TYPE_TREE_BLOCK_REF
#define EXTENT_ITEM_SHARED_BACKREFS
#define TYPE_METADATA_ITEM
#define TYPE_EXTENT_REF_V0
#define RemoveEntryList(Entry)
#define InsertTailList(ListHead, Entry)
#define InsertHeadList(ListHead, Entry)
#define ExAllocatePoolWithTag(hernya, size, tag)
#define IsListEmpty(ListHead)
#define ExAcquireResourceExclusiveLite(res, wait)
#define RemoveHeadList(ListHead)
#define InitializeListHead(ListHead)
static void free_extent_refs(LIST_ENTRY *extent_refs)
uint64_t get_extent_refcount(device_extension *Vcb, uint64_t address, uint64_t size, PIRP Irp)
uint64_t find_extent_shared_tree_refcount(device_extension *Vcb, uint64_t address, uint64_t parent, PIRP Irp)
static changed_extent * get_changed_extent_item(chunk *c, uint64_t address, uint64_t size, bool no_csum)
static void sort_extent_refs(LIST_ENTRY *extent_refs)
static NTSTATUS construct_extent_item(device_extension *Vcb, uint64_t address, uint64_t size, uint64_t flags, LIST_ENTRY *extent_refs, KEY *firstitem, uint8_t level, PIRP Irp)
uint64_t get_extent_flags(device_extension *Vcb, uint64_t address, PIRP Irp)
static __inline uint64_t get_extent_data_ref_hash(EXTENT_DATA_REF *edr)
NTSTATUS increase_extent_refcount_data(device_extension *Vcb, uint64_t address, uint64_t size, uint64_t root, uint64_t inode, uint64_t offset, uint32_t refcount, PIRP Irp)
uint64_t get_extent_data_ref_hash2(uint64_t root, uint64_t objid, uint64_t offset)
uint32_t find_extent_shared_data_refcount(device_extension *Vcb, uint64_t address, uint64_t parent, PIRP Irp)
static NTSTATUS convert_old_extent(device_extension *Vcb, uint64_t address, bool tree, KEY *firstitem, uint8_t level, PIRP Irp)
void add_changed_extent_ref(chunk *c, uint64_t address, uint64_t size, uint64_t root, uint64_t objid, uint64_t offset, uint32_t count, bool no_csum)
NTSTATUS decrease_extent_refcount_tree(device_extension *Vcb, uint64_t address, uint64_t size, uint64_t root, uint8_t level, PIRP Irp)
static NTSTATUS add_tree_block_extent_ref(LIST_ENTRY *extent_refs, uint64_t root)
static NTSTATUS add_shared_block_extent_ref(LIST_ENTRY *extent_refs, uint64_t parent)
NTSTATUS increase_extent_refcount(device_extension *Vcb, uint64_t address, uint64_t size, uint8_t type, void *data, KEY *firstitem, uint8_t level, PIRP Irp)
static uint32_t find_extent_data_refcount(device_extension *Vcb, uint64_t address, uint64_t size, uint64_t root, uint64_t objid, uint64_t offset, PIRP Irp)
static NTSTATUS add_shared_data_extent_ref(LIST_ENTRY *extent_refs, uint64_t parent, uint32_t count)
void update_extent_flags(device_extension *Vcb, uint64_t address, uint64_t flags, PIRP Irp)
NTSTATUS decrease_extent_refcount(device_extension *Vcb, uint64_t address, uint64_t size, uint8_t type, void *data, KEY *firstitem, uint8_t level, uint64_t parent, bool superseded, PIRP Irp)
bool is_extent_unique(device_extension *Vcb, uint64_t address, uint64_t size, PIRP Irp)
static uint64_t get_extent_hash(uint8_t type, void *data)
NTSTATUS update_changed_extent_ref(device_extension *Vcb, chunk *c, uint64_t address, uint64_t size, uint64_t root, uint64_t objid, uint64_t offset, int32_t count, bool no_csum, bool superseded, PIRP Irp)
NTSTATUS decrease_extent_refcount_data(device_extension *Vcb, uint64_t address, uint64_t size, uint64_t root, uint64_t inode, uint64_t offset, uint32_t refcount, bool superseded, PIRP Irp)
GLuint GLuint GLsizei count
GLuint GLuint GLsizei GLenum type
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLboolean GLboolean GLboolean b
int const JOCTET unsigned int datalen
VOID FASTCALL ExReleaseResourceLite(IN PERESOURCE Resource)
#define STATUS_INTERNAL_ERROR
struct _LIST_ENTRY * Blink
struct _LIST_ENTRY * Flink
#define RtlCopyMemory(Destination, Source, Length)
#define CONTAINING_RECORD(address, type, field)
#define STATUS_INSUFFICIENT_RESOURCES