Hi,I'm experimenting with the new tool systemd-repart and I think I have found a bug.
Here is a simple repart.d file: bash-5.0# cat /usr/lib/repart.d/70-home.conf [Partition] Type=home SizeMinBytes=16M SizeMaxBytes=32MIf the disk is empty, systemd-repart ends with a segfault: https://github.com/systemd/systemd/issues/15608
So a create a new partition on the disk: bash-5.0# parted /dev/sdb (parted) print Model: ATA VBOX HARDDISK (scsi) Disk /dev/sdb: 32.2GB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1049kB 322MB 321MB primary And I run systemd-repart: bash-5.0# systemd-repart /dev/sdb --dry-run=no TYPE LABEL UUID FILE NODE SIZE PADDINGhome home af89e705-7395-4f23-8261-2f7229fc506b 70-home.conf /dev/sdb2 -> 306.0M -> 0B linux-generic primary fe7a74f4-8827-4233-94ac-0adbf8e3704d - /dev/sdb1 306.0M 29.6G -> 29.4G
S = 612.0M S = 29.4G X---------------------------------------------------------------------------------------------------------------------------XX `- primary | `- 70-home.conf Applying changes.Storage does not support discarding, not discarding data in new partition 1.
Successfully wiped file system signatures from partition 1.Storage does not support discarding, not discarding gap at beginning of disk.
Creating new partition 1. Writing new partition table. Telling kernel to reread partition table. All done.As you can see, there is a problem with the partition's size: 300MB instead of 32MB max.
Parted confirm: Number Start End Size File system Name Flags 1 1049kB 322MB 321MB primary 2 31.9GB 32.2GB 321MB home I think the problem is here in src/partition/repart.c:/* 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. */ if (span > 0) { Partition *p; LIST_FOREACH(partitions, p, context->partitions) { uint64_t m, xsz; if (p->allocated_to_area != a) continue; if (PARTITION_IS_FOREIGN(p)) continue; assert(p->new_size != UINT64_MAX); m = p->new_size + span; xsz = partition_max_size(a->after); if (xsz != UINT64_MAX && m > xsz) m = xsz; span = charge_size(span, m - p->new_size); p->new_size = m; if (span == 0) break; } } The problem is in line "xsz = partition_max_size(a->after);" xsz is the max size of "a->after" instead current partition (so "p"). Am I right? I'll make a PR if yes. Regards, -- Emmanuel Garette Ingénieur en informatique libreCadoles (http://www.cadoles.com)
Experts EOLE, Envole et logiciels libres
<<attachment: egarette.vcf>>
_______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/systemd-devel