[BTRFS] Upgrade to 1.1
[reactos.git] / drivers / filesystems / btrfs / balance.c
index 3e36489..fe641f4 100644 (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;
     }