return !try_again;
}
-static void context_grow_partition_one(Context *context, FreeArea *a, Partition *p, uint64_t *span) {
+static void context_grow_partition_one(Context *context, Partition *p, uint64_t *span) {
uint64_t m;
assert(context);
- assert(a);
assert(p);
assert(span);
- if (*span == 0)
- return;
-
- if (p->allocated_to_area != a)
- return;
-
- if (PARTITION_IS_FOREIGN(p))
- return;
-
+ assert(*span > 0);
assert(p->new_size != UINT64_MAX);
/* Calculate new size and align. */
if (context_grow_partitions_phase(context, a, phase, &span, &weight_sum))
phase++; /* go to the next phase */
- /* We still have space left over? Donate to preceding partition if we have one */
- if (span > 0 && a->after)
- context_grow_partition_one(context, a, a->after, &span);
- /* What? Even still some space left (maybe because there was no preceding partition, or it had a
- * size limit), then let's donate it to whoever wants it. */
+ /* What? Even still some space left (because one partition had max_size < share
+ * and another had min_size > share), then let's donate it to whoever wants it. */
if (span > 0)
LIST_FOREACH(partitions, p, context->partitions) {
- context_grow_partition_one(context, a, p, &span);
+ if (p->allocated_to_area != a && p->padding_area != a)
+ continue;
+
+ context_grow_partition_one(context, p, &span);
if (span == 0)
break;
}
assert_in "$imgs/gap.img3 : start= 22528, size= 20480, type=$usr_guid, uuid=$usr_uuid, name=\"part-b\"" "$output"
}
+testcase_distribute_leftover_space() {
+ local defs imgs output
+
+ defs="$(mktemp --directory "/tmp/test-repart.defs.XXXXXXXXXX")"
+ imgs="$(mktemp --directory "/var/tmp/test-repart.imgs.XXXXXXXXXX")"
+ # shellcheck disable=SC2064
+ trap "rm -rf '$defs' '$imgs'" RETURN
+ chmod 0755 "$defs"
+
+ echo "*** Left over space after distributing according to weights should still be assigned ***"
+
+ tee "$defs/01-esp.conf" <<EOF
+[Partition]
+Type=esp
+Weight=1
+SizeMinBytes=5M
+EOF
+
+ tee "$defs/02-usr.conf" <<EOF
+[Partition]
+Type=usr-${architecture}
+Weight=1000
+SizeMinBytes=1M
+SizeMaxBytes=2M
+EOF
+
+ truncate -s 20M "$imgs/leftover.img"
+ systemd-repart --offline="$OFFLINE" \
+ --definitions="$defs" \
+ --seed="$seed" \
+ --dry-run=no \
+ --empty=allow \
+ "$imgs/leftover.img"
+
+ output=$(sfdisk --dump "$imgs/leftover.img")
+
+ # esp should get all the leftover space
+ assert_in "$imgs/leftover.img1 : start= 2048, size= 34776, type=$esp_guid," "$output"
+ assert_in "$imgs/leftover.img2 : start= 36824, size= 4096, type=$usr_guid," "$output"
+
+ rm "$defs/01-esp.conf"
+ rm "$defs/02-usr.conf"
+ rm "$imgs/leftover.img"
+
+ tee "$defs/01-xbootldr.conf" <<EOF
+[Partition]
+Type=xbootldr
+SizeMaxBytes=10M
+EOF
+
+ tee "$defs/02-usr.conf" <<EOF
+[Partition]
+Type=usr-${architecture}
+Weight=1000
+SizeMinBytes=1M
+SizeMaxBytes=2M
+EOF
+
+ tee "$defs/03-esp.conf" <<EOF
+[Partition]
+Type=esp
+Weight=1
+SizeMinBytes=5M
+EOF
+
+ truncate -s 25M "$imgs/leftover2.img"
+ sfdisk "$imgs/leftover2.img" <<EOF
+label: gpt
+size=3M, type=${xbootldr_guid},
+EOF
+
+ systemd-repart --offline="$OFFLINE" \
+ --definitions="$defs" \
+ --seed="$seed" \
+ --dry-run=no \
+ --empty=allow \
+ "$imgs/leftover2.img"
+
+ output=$(sfdisk --dump "$imgs/leftover2.img")
+
+ # xbootldr should get the leftover space and grow to 10M, then esp should get the rest
+ assert_in "$imgs/leftover2.img1 : start= 2048, size= 20480, type=$xbootldr_guid," "$output"
+ assert_in "$imgs/leftover2.img2 : start= 22528, size= 4096, type=$usr_guid," "$output"
+ assert_in "$imgs/leftover2.img3 : start= 26624, size= 24536, type=$esp_guid," "$output"
+}
+
OFFLINE="yes"
run_testcases