struct fdisk_partition *p,
uint64_t secsz,
uint64_t grainsz,
- uint64_t *ret) {
+ uint64_t *ret,
+ bool *ret_is_last_partition) {
size_t n_partitions;
uint64_t offset, next = UINT64_MAX;
+ bool is_last_partition = false;
assert(c);
assert(t);
}
if (next == UINT64_MAX) {
+ is_last_partition = true;
+
/* No later partition? In that case check the end of the usable area */
next = sym_fdisk_get_last_lba(c);
assert(next < UINT64_MAX);
offset = round_up_size(offset, grainsz);
next = round_down_size(next, grainsz);
+ if (ret_is_last_partition)
+ *ret_is_last_partition = is_last_partition;
+
*ret = LESS_BY(next, offset); /* Saturated subtraction, rounding might have fucked things up */
return 0;
}
uint64_t sz, start, padding;
sd_id128_t ptid, id;
GptPartitionType type;
+ bool is_last_partition;
p = sym_fdisk_table_get_partition(t, i);
if (!p)
/* Pass grain size of 1 to disable rounding by grain as we don't know the grain size
* of the old image. We'll round paddings to the grain size of the new image later. */
- r = determine_current_padding(c, t, p, secsz, /* grainsz= */ 1, &padding);
+ r = determine_current_padding(c, t, p, secsz, /* grainsz= */ 1, &padding, &is_last_partition);
if (r < 0)
return r;
- np->padding_min = np->padding_max = padding;
+ if (!is_last_partition)
+ np->padding_min = np->padding_max = padding;
np->copy_blocks_path = strdup(src);
if (!np->copy_blocks_path)
pp->current_partition = p;
sym_fdisk_ref_partition(p);
- r = determine_current_padding(c, t, p, secsz, grainsz, &pp->current_padding);
+ r = determine_current_padding(
+ c,
+ t,
+ p,
+ secsz,
+ grainsz,
+ &pp->current_padding,
+ /* ret_is_last_partition= */ NULL);
if (r < 0)
return r;
np->current_partition = p;
sym_fdisk_ref_partition(p);
- r = determine_current_padding(c, t, p, secsz, grainsz, &np->current_padding);
+ r = determine_current_padding(
+ c,
+ t,
+ p,
+ secsz,
+ grainsz,
+ &np->current_padding,
+ /* ret_is_last_partition= */ NULL);
if (r < 0)
return r;
assert_in "$imgs/copy_to2 : start= 32768, size= 16384, type=${xbootldr_guid}," "$output"
}
+testcase_copy_from_no_padding_at_beginning_and_end() {
+ 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"
+
+ tee "$defs/03-esp.conf" <<EOF
+[Partition]
+Type=esp
+EOF
+
+ truncate -s 80MiB "$imgs/copy_from"
+ sfdisk "$imgs/copy_from" <<EOF
+label: gpt
+
+start=2280, size=20480, type=${root_guid}, uuid=837c3d67-21b3-478e-be82-7e7f83bf96d3
+start=22760, size=10240, type=${xbootldr_guid}, uuid=4985c03e-eecb-4fe0-9f65-3f6345782214
+EOF
+
+ truncate -s 60MiB "$imgs/copy_to"
+ output=$(systemd-repart --offline="$OFFLINE" \
+ --empty=allow \
+ --definitions="$defs" \
+ --seed="$seed" \
+ --dry-run=no \
+ --json=pretty \
+ --copy-from="$imgs/copy_from" \
+ "$imgs/copy_to")
+
+ output=$(sfdisk --dump "$imgs/copy_to")
+
+ assert_in "first-lba: 2048" "$output"
+ assert_in "last-lba: 122846" "$output"
+ assert_in "$imgs/copy_to1 : start= 2048, size= 20480, type=${root_guid}," "$output"
+ assert_in "$imgs/copy_to2 : start= 22528, size= 10240, type=${xbootldr_guid}," "$output"
+ assert_in "$imgs/copy_to3 : start= 32768, size= 90072, type=${esp_guid}," "$output"
+}
+
testcase_dropin() {
local defs imgs output