[BTRFS] Upgrade to 1.1

CORE-15452
This commit is contained in:
Pierre Schweitzer 2018-12-16 12:03:16 +01:00
parent e8d16d0a7d
commit eb7fbc253f
No known key found for this signature in database
GPG key ID: 7545556C3D585B0B
61 changed files with 22605 additions and 596 deletions

View file

@ -107,13 +107,13 @@ static NTSTATUS add_metadata_reloc(_Requires_exclusive_lock_held_(_Curr_->tree_l
c = get_chunk_from_address(Vcb, tp->item->key.obj_id);
if (c) {
ExAcquireResourceExclusiveLite(&c->lock, TRUE);
acquire_chunk_lock(c, Vcb);
c->used -= Vcb->superblock.node_size;
space_list_add(c, tp->item->key.obj_id, Vcb->superblock.node_size, rollback);
ExReleaseResourceLite(&c->lock);
release_chunk_lock(c, Vcb);
}
ei = (EXTENT_ITEM*)tp->item->data;
@ -747,7 +747,7 @@ static NTSTATUS write_metadata_items(_Requires_exclusive_lock_held_(_Curr_->tree
flags = Vcb->metadata_flags;
if (newchunk) {
ExAcquireResourceExclusiveLite(&newchunk->lock, TRUE);
acquire_chunk_lock(newchunk, Vcb);
if (newchunk->chunk_item->type == flags && find_metadata_address_in_chunk(Vcb, newchunk, &mr->new_address)) {
newchunk->used += Vcb->superblock.node_size;
@ -755,7 +755,7 @@ static NTSTATUS write_metadata_items(_Requires_exclusive_lock_held_(_Curr_->tree
done = TRUE;
}
ExReleaseResourceLite(&newchunk->lock);
release_chunk_lock(newchunk, Vcb);
}
if (!done) {
@ -766,20 +766,20 @@ static NTSTATUS write_metadata_items(_Requires_exclusive_lock_held_(_Curr_->tree
chunk* c2 = CONTAINING_RECORD(le2, chunk, list_entry);
if (!c2->readonly && !c2->reloc && c2 != newchunk && c2->chunk_item->type == flags) {
ExAcquireResourceExclusiveLite(&c2->lock, TRUE);
acquire_chunk_lock(c2, Vcb);
if ((c2->chunk_item->size - c2->used) >= Vcb->superblock.node_size) {
if (find_metadata_address_in_chunk(Vcb, c2, &mr->new_address)) {
c2->used += Vcb->superblock.node_size;
space_list_subtract(c2, FALSE, mr->new_address, Vcb->superblock.node_size, rollback);
ExReleaseResourceLite(&c2->lock);
release_chunk_lock(c2, Vcb);
newchunk = c2;
done = TRUE;
break;
}
}
ExReleaseResourceLite(&c2->lock);
release_chunk_lock(c2, Vcb);
}
le2 = le2->Flink;
@ -795,12 +795,12 @@ static NTSTATUS write_metadata_items(_Requires_exclusive_lock_held_(_Curr_->tree
goto end;
}
ExAcquireResourceExclusiveLite(&newchunk->lock, TRUE);
acquire_chunk_lock(newchunk, Vcb);
newchunk->balance_num = Vcb->balance.balance_num;
if (!find_metadata_address_in_chunk(Vcb, newchunk, &mr->new_address)) {
ExReleaseResourceLite(&newchunk->lock);
release_chunk_lock(newchunk, Vcb);
ExReleaseResourceLite(&Vcb->chunk_lock);
ERR("could not find address in new chunk\n");
Status = STATUS_DISK_FULL;
@ -810,7 +810,7 @@ static NTSTATUS write_metadata_items(_Requires_exclusive_lock_held_(_Curr_->tree
space_list_subtract(newchunk, FALSE, mr->new_address, Vcb->superblock.node_size, rollback);
}
ExReleaseResourceLite(&newchunk->lock);
release_chunk_lock(newchunk, Vcb);
}
ExReleaseResourceLite(&Vcb->chunk_lock);
@ -1340,13 +1340,13 @@ static NTSTATUS add_data_reloc(_Requires_exclusive_lock_held_(_Curr_->tree_lock)
c = get_chunk_from_address(Vcb, tp->item->key.obj_id);
if (c) {
ExAcquireResourceExclusiveLite(&c->lock, TRUE);
acquire_chunk_lock(c, Vcb);
c->used -= tp->item->key.offset;
space_list_add(c, tp->item->key.obj_id, tp->item->key.offset, rollback);
ExReleaseResourceLite(&c->lock);
release_chunk_lock(c, Vcb);
}
ei = (EXTENT_ITEM*)tp->item->data;
@ -1756,7 +1756,7 @@ static NTSTATUS balance_data_chunk(device_extension* Vcb, chunk* c, BOOL* change
ULONG runlength, index, lastoff;
if (newchunk) {
ExAcquireResourceExclusiveLite(&newchunk->lock, TRUE);
acquire_chunk_lock(newchunk, Vcb);
if (find_data_address_in_chunk(Vcb, newchunk, dr->size, &dr->new_address)) {
newchunk->used += dr->size;
@ -1764,7 +1764,7 @@ static NTSTATUS balance_data_chunk(device_extension* Vcb, chunk* c, BOOL* change
done = TRUE;
}
ExReleaseResourceLite(&newchunk->lock);
release_chunk_lock(newchunk, Vcb);
}
if (!done) {
@ -1775,20 +1775,20 @@ static NTSTATUS balance_data_chunk(device_extension* Vcb, chunk* c, BOOL* change
chunk* c2 = CONTAINING_RECORD(le2, chunk, list_entry);
if (!c2->readonly && !c2->reloc && c2 != newchunk && c2->chunk_item->type == Vcb->data_flags) {
ExAcquireResourceExclusiveLite(&c2->lock, TRUE);
acquire_chunk_lock(c2, Vcb);
if ((c2->chunk_item->size - c2->used) >= dr->size) {
if (find_data_address_in_chunk(Vcb, c2, dr->size, &dr->new_address)) {
c2->used += dr->size;
space_list_subtract(c2, FALSE, dr->new_address, dr->size, &rollback);
ExReleaseResourceLite(&c2->lock);
release_chunk_lock(c2, Vcb);
newchunk = c2;
done = TRUE;
break;
}
}
ExReleaseResourceLite(&c2->lock);
release_chunk_lock(c2, Vcb);
}
le2 = le2->Flink;
@ -1804,12 +1804,12 @@ static NTSTATUS balance_data_chunk(device_extension* Vcb, chunk* c, BOOL* change
goto end;
}
ExAcquireResourceExclusiveLite(&newchunk->lock, TRUE);
acquire_chunk_lock(newchunk, Vcb);
newchunk->balance_num = Vcb->balance.balance_num;
if (!find_data_address_in_chunk(Vcb, newchunk, dr->size, &dr->new_address)) {
ExReleaseResourceLite(&newchunk->lock);
release_chunk_lock(newchunk, Vcb);
ExReleaseResourceLite(&Vcb->chunk_lock);
ERR("could not find address in new chunk\n");
Status = STATUS_DISK_FULL;
@ -1819,7 +1819,7 @@ static NTSTATUS balance_data_chunk(device_extension* Vcb, chunk* c, BOOL* change
space_list_subtract(newchunk, FALSE, dr->new_address, dr->size, &rollback);
}
ExReleaseResourceLite(&newchunk->lock);
release_chunk_lock(newchunk, Vcb);
}
ExReleaseResourceLite(&Vcb->chunk_lock);
@ -2957,6 +2957,8 @@ static NTSTATUS try_consolidation(device_extension* Vcb, UINT64 flags, chunk** n
ERR("do_write returned %08x\n", Status);
return Status;
}
free_trees(Vcb);
}
ExAcquireResourceExclusiveLite(&Vcb->chunk_lock, TRUE);
@ -3108,7 +3110,7 @@ void NTAPI balance_thread(void* context) {
chunk* c = CONTAINING_RECORD(le, chunk, list_entry);
UINT8 sort;
ExAcquireResourceExclusiveLite(&c->lock, TRUE);
acquire_chunk_lock(c, Vcb);
if (c->chunk_item->type & BLOCK_FLAG_DATA)
sort = BALANCE_OPTS_DATA;
@ -3118,7 +3120,7 @@ void NTAPI balance_thread(void* context) {
sort = BALANCE_OPTS_SYSTEM;
else {
ERR("unexpected chunk type %llx\n", c->chunk_item->type);
ExReleaseResourceLite(&c->lock);
release_chunk_lock(c, Vcb);
break;
}
@ -3142,13 +3144,13 @@ void NTAPI balance_thread(void* context) {
if (!NT_SUCCESS(Status)) {
ERR("load_cache_chunk returned %08x\n", Status);
Vcb->balance.status = Status;
ExReleaseResourceLite(&c->lock);
release_chunk_lock(c, Vcb);
ExReleaseResourceLite(&Vcb->chunk_lock);
goto end;
}
}
ExReleaseResourceLite(&c->lock);
release_chunk_lock(c, Vcb);
le = le->Flink;
}