summaryrefslogtreecommitdiff
path: root/src/partition
diff options
context:
space:
mode:
authorSjoerd Simons <sjoerd@collabora.com>2023-02-23 10:00:16 +0100
committerLennart Poettering <lennart@poettering.net>2023-04-13 11:12:52 +0200
commit771805eb44ec42228d9d85f4d35962ff8459bb77 (patch)
treeb49ef6af72d0c75ac071601ae5ec88bd84a8a2a5 /src/partition
parent39857544ee3794481f165e6ecc5d5a81c65f0ee9 (diff)
downloadsystemd-771805eb44ec42228d9d85f4d35962ff8459bb77.tar.gz
repart: Discard from/to first/last usable lba
Repart considers the start and end of the usable space to the first multiple of grainsz (at least 4096 bytes). However the first usable LBA of a GPT partition is at sector 34 (512 bytes sectors) which is not a multiple of 4096. The backup GPT label at the end also takes up 33 sectors, meaning the last usable LBA is at 34 sectors from the end, unlikely to be a 4096 multiple as well. This meant that the very first and last sectors were never discarded. However more problematically if an existing partition started before the first usable grainsz multiple its start didn't get taken into account as a valid starting point and got its data discarded. Signed-off-by: Sjoerd Simons <sjoerd@collabora.com>
Diffstat (limited to 'src/partition')
-rw-r--r--src/partition/repart.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/src/partition/repart.c b/src/partition/repart.c
index 23ad58f443..0da07ee122 100644
--- a/src/partition/repart.c
+++ b/src/partition/repart.c
@@ -3036,7 +3036,11 @@ static int context_discard_gap_after(Context *context, Partition *p) {
if (p)
gap = p->offset + p->new_size;
else
- gap = context->start;
+ /* The context start gets rounded up to grain_size, however
+ * existing partitions may be before that so ensure the gap
+ * starts at the first actually usable lba
+ */
+ gap = fdisk_get_first_lba(context->fdisk_context) * context->sector_size;
LIST_FOREACH(partitions, q, context->partitions) {
if (q->dropped)
@@ -3053,7 +3057,7 @@ static int context_discard_gap_after(Context *context, Partition *p) {
}
if (next == UINT64_MAX) {
- next = context->end;
+ next = (fdisk_get_last_lba(context->fdisk_context) + 1) * context->sector_size;
if (gap > next)
return log_error_errno(SYNTHETIC_ERRNO(EIO), "Partition end beyond disk end.");
}