_cleanup_(fdisk_unref_contextp) struct fdisk_context *c = NULL;
_cleanup_(fdisk_unref_tablep) struct fdisk_table *t = NULL;
Partition *last = NULL;
- unsigned long secsz, grainsz;
+ unsigned long secsz;
size_t n_partitions;
int r;
return log_error_errno(r, "Failed to create fdisk context: %m");
secsz = sym_fdisk_get_sector_size(c);
- grainsz = sym_fdisk_get_grain_size(c);
/* Insist on a power of two, and that it's a multiple of 512, i.e. the traditional sector size. */
if (secsz < 512 || !ISPOWEROF2(secsz))
if (!np->split_name_format)
return log_oom();
- r = determine_current_padding(c, t, p, secsz, grainsz, &padding);
+ /* 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);
if (r < 0)
return r;
losetup -d "$loop"
}
+testcase_copy_from_grain_padding() {
+ 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"
+
+ truncate -s 80MiB "$imgs/copy_from"
+ sfdisk "$imgs/copy_from" <<EOF
+label: gpt
+grain: 4194304
+
+size=40961, type=${root_guid}, uuid=837c3d67-21b3-478e-be82-7e7f83bf96d3
+size=10240, type=${xbootldr_guid}, uuid=4985c03e-eecb-4fe0-9f65-3f6345782214
+EOF
+
+ output=$(sfdisk --dump "$imgs/copy_from")
+
+ # Padding between partition 1 and 2 is 8191 sectors
+ assert_in "$imgs/copy_from1 : start= 8192, size= 40961, type=${root_guid}," "$output"
+ assert_in "$imgs/copy_from2 : start= 57344, size= 10240, type=${xbootldr_guid}," "$output"
+
+ truncate -s 100MiB "$imgs/copy_to"
+ output=$(systemd-repart --offline="$OFFLINE" \
+ --empty=allow \
+ --definitions="$defs" \
+ --seed="$seed" \
+ --dry-run=no \
+ --json=pretty \
+ --copy-from="$imgs/copy_from" \
+ --grain-size=512 \
+ "$imgs/copy_to")
+
+ output=$(sfdisk --dump "$imgs/copy_to")
+
+ assert_in "$imgs/copy_to1 : start= 2048, size= 40961, type=${root_guid}," "$output"
+ # We set new grain-size to 1 sector, so padding now should be 8191 sectors again
+ assert_in "$imgs/copy_to2 : start= 51200, size= 10240, type=${xbootldr_guid}," "$output"
+}
+
testcase_dropin() {
local defs imgs output