]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
repart: reset assignments by previous context_allocate_partitions()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 5 Sep 2022 16:23:19 +0000 (01:23 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 8 Sep 2022 20:48:56 +0000 (05:48 +0900)
The function context_allocate_partitions() may be called multiple times.
If this is called multiple times, then dropped partitions may still
assigned to free area.

src/partition/repart.c

index 4857579977567249f6a6c4545702dc4c8eb38dce..5b999d5ba9231ff2ed7414678ee41425e115b180 100644 (file)
@@ -436,6 +436,8 @@ static bool context_drop_one_priority(Context *context) {
                         continue;
 
                 p->dropped = true;
+                p->allocated_to_area = NULL;
+
                 log_info("Can't fit partition %s of priority %" PRIi32 ", dropping.", p->definition_path, p->priority);
 
                 /* We ensure that all verity sibling partitions have the same priority, so it's safe
@@ -449,6 +451,7 @@ static bool context_drop_one_priority(Context *context) {
                                 continue;
 
                         p->siblings[mode]->dropped = true;
+                        p->siblings[mode]->allocated_to_area = NULL;
                         log_info("Also dropping sibling verity %s partition %s",
                                  verity_mode_to_string(mode), p->siblings[mode]->definition_path);
                 }
@@ -621,6 +624,10 @@ static uint64_t charge_weight(uint64_t total, uint64_t amount) {
 static bool context_allocate_partitions(Context *context, uint64_t *ret_largest_free_area) {
         assert(context);
 
+        /* This may be called multiple times. Reset previous assignments. */
+        for (size_t i = 0; i < context->n_free_areas; i++)
+                context->free_areas[i]->allocated = 0;
+
         /* Sort free areas by size, putting smallest first */
         typesafe_qsort_r(context->free_areas, context->n_free_areas, free_area_compare, context);