From: Yu Watanabe Date: Mon, 5 Sep 2022 16:23:19 +0000 (+0900) Subject: repart: reset assignments by previous context_allocate_partitions() X-Git-Tag: v252-rc1~222^2~4 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f39cf264a68837c5347d8ead6e9a6b4e62d24ca8;p=thirdparty%2Fsystemd.git repart: reset assignments by previous context_allocate_partitions() 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. --- diff --git a/src/partition/repart.c b/src/partition/repart.c index 48575799775..5b999d5ba92 100644 --- a/src/partition/repart.c +++ b/src/partition/repart.c @@ -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);