Enabled up to 8 appended GPT partitions and improved their number mapping
This commit is contained in:
parent
405f0f04d4
commit
8ed27c6255
@ -4693,6 +4693,9 @@ void iso_tell_max_part_range(IsoWriteOpts *opts,
|
|||||||
if (sa_type == 3) { /* SUN Disk Label */
|
if (sa_type == 3) { /* SUN Disk Label */
|
||||||
*first_partition = 2;
|
*first_partition = 2;
|
||||||
*last_partition = 8;
|
*last_partition = 8;
|
||||||
|
} else if(sa_type == 0 && opts->appended_as_gpt) {
|
||||||
|
*first_partition = 1;
|
||||||
|
*last_partition = 8;
|
||||||
} else {
|
} else {
|
||||||
*first_partition = 1;
|
*first_partition = 1;
|
||||||
*last_partition = 4;
|
*last_partition = 4;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2008 Vreixo Formoso
|
* Copyright (c) 2008 Vreixo Formoso
|
||||||
* Copyright (c) 2010 - 2022 Thomas Schmitt
|
* Copyright (c) 2010 - 2024 Thomas Schmitt
|
||||||
*
|
*
|
||||||
* This file is part of the libisofs project; you can redistribute it and/or
|
* This file is part of the libisofs project; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License version 2
|
* modify it under the terms of the GNU General Public License version 2
|
||||||
@ -1735,11 +1735,13 @@ static int iso_write_gpt(Ecma119Image *t, uint32_t img_blocks, uint8_t *buf)
|
|||||||
0x87, 0xc0, 0x68, 0xb6, 0xb7, 0x26, 0x99, 0xc7
|
0x87, 0xc0, 0x68, 0xb6, 0xb7, 0x26, 0x99, 0xc7
|
||||||
};
|
};
|
||||||
|
|
||||||
|
uint8_t *wpt;
|
||||||
uint32_t p_arr_crc = 0;
|
uint32_t p_arr_crc = 0;
|
||||||
uint64_t start_lba, end_lba, goal, part_end, next_end, backup_end_lba;
|
uint64_t start_lba, end_lba, goal, part_end, next_end, backup_end_lba;
|
||||||
uint64_t eff_gpt_flags;
|
uint64_t eff_gpt_flags;
|
||||||
int ret, i, gap_counter = 0, up_to;
|
int ret, i, gap_counter = 0, up_to, slot, j, to_insert;
|
||||||
struct iso_gpt_partition_request *req;
|
struct iso_gpt_partition_request *req;
|
||||||
|
char msg[81];
|
||||||
uint8_t gpt_name[72];
|
uint8_t gpt_name[72];
|
||||||
static uint8_t zero_uuid[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
|
static uint8_t zero_uuid[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
|
||||||
static uint8_t *type_guid;
|
static uint8_t *type_guid;
|
||||||
@ -1825,6 +1827,8 @@ static int iso_write_gpt(Ecma119Image *t, uint32_t img_blocks, uint8_t *buf)
|
|||||||
return ISO_BOOT_TOO_MANY_GPT;
|
return ISO_BOOT_TOO_MANY_GPT;
|
||||||
|
|
||||||
/* Write the GPT entries to buf */
|
/* Write the GPT entries to buf */
|
||||||
|
wpt= buf + 512 * t->gpt_part_start;
|
||||||
|
slot= 1;
|
||||||
for (i = 0; i < t->gpt_req_count; i++) {
|
for (i = 0; i < t->gpt_req_count; i++) {
|
||||||
req = t->gpt_req[i];
|
req = t->gpt_req[i];
|
||||||
start_lba = req->start_block;
|
start_lba = req->start_block;
|
||||||
@ -1835,11 +1839,38 @@ static int iso_write_gpt(Ecma119Image *t, uint32_t img_blocks, uint8_t *buf)
|
|||||||
if (end_lba > backup_end_lba)
|
if (end_lba > backup_end_lba)
|
||||||
end_lba = backup_end_lba;
|
end_lba = backup_end_lba;
|
||||||
end_lba = end_lba - 1;
|
end_lba = end_lba - 1;
|
||||||
iso_write_gpt_entry(t, buf + 512 * t->gpt_part_start + 128 * i,
|
if (req->desired_slot > 0) {
|
||||||
req->type_guid, req->partition_guid,
|
to_insert= req->desired_slot - slot;
|
||||||
start_lba, end_lba, req->flags, req->name);
|
if (to_insert > 0 &&
|
||||||
|
slot - 1 + to_insert + t->gpt_req_count - i <=
|
||||||
|
(int) t->gpt_max_entries) {
|
||||||
|
/* There is need and room to insert empty partition entries */
|
||||||
|
for (j = 0; j < to_insert; j++) {
|
||||||
|
memset(wpt, 0, 128);
|
||||||
|
wpt+= 128;
|
||||||
|
slot++;
|
||||||
}
|
}
|
||||||
for (; i < (int) t->gpt_max_entries; i++)
|
if (!t->wthread_is_running) {
|
||||||
|
sprintf(msg,
|
||||||
|
"Inserted %d empty GPT slots before appended partition %d",
|
||||||
|
to_insert, req->desired_slot);
|
||||||
|
iso_msgs_submit(0, msg, 0, "DEBUG", 0);
|
||||||
|
}
|
||||||
|
} else if (slot != req->desired_slot) {
|
||||||
|
if (!t->wthread_is_running) {
|
||||||
|
sprintf(msg,
|
||||||
|
"Appended GPT partition becomes number %d instead of desired %d",
|
||||||
|
i + 1, req->desired_slot);
|
||||||
|
iso_msgs_submit(0, msg, 0, "NOTE", 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
iso_write_gpt_entry(t, wpt, req->type_guid, req->partition_guid,
|
||||||
|
start_lba, end_lba, req->flags, req->name);
|
||||||
|
wpt+= 128;
|
||||||
|
slot++;
|
||||||
|
}
|
||||||
|
for (i= slot - 1; i < (int) t->gpt_max_entries; i++)
|
||||||
memset(buf + 512 * t->gpt_part_start + 128 * i, 0, 128);
|
memset(buf + 512 * t->gpt_part_start + 128 * i, 0, 128);
|
||||||
|
|
||||||
p_arr_crc = iso_crc32_gpt((unsigned char *) buf + 512 * t->gpt_part_start,
|
p_arr_crc = iso_crc32_gpt((unsigned char *) buf + 512 * t->gpt_part_start,
|
||||||
@ -2719,6 +2750,7 @@ int assess_appended_gpt(Ecma119Image *t, int flag)
|
|||||||
};
|
};
|
||||||
static uint8_t zero_uuid[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
|
static uint8_t zero_uuid[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
|
||||||
int i, ret, do_apm = 0, do_gpt = 0, index, already_in_gpt = 0;
|
int i, ret, do_apm = 0, do_gpt = 0, index, already_in_gpt = 0;
|
||||||
|
int first_partition, last_partition;
|
||||||
uint8_t gpt_name[72], *type_uuid;
|
uint8_t gpt_name[72], *type_uuid;
|
||||||
char apm_type[33];
|
char apm_type[33];
|
||||||
|
|
||||||
@ -2738,7 +2770,8 @@ int assess_appended_gpt(Ecma119Image *t, int flag)
|
|||||||
return 2;
|
return 2;
|
||||||
|
|
||||||
/* Represent appended partitions */
|
/* Represent appended partitions */
|
||||||
for (i = 0; i <= 3; i++) {
|
iso_tell_max_part_range(t->opts, &first_partition, &last_partition, 0);
|
||||||
|
for (i = first_partition - 1; i < last_partition; i++) {
|
||||||
if (t->opts->appended_partitions[i] == NULL)
|
if (t->opts->appended_partitions[i] == NULL)
|
||||||
continue;
|
continue;
|
||||||
if (do_apm) {
|
if (do_apm) {
|
||||||
@ -2779,6 +2812,9 @@ int assess_appended_gpt(Ecma119Image *t, int flag)
|
|||||||
(uint64_t) 0, gpt_name);
|
(uint64_t) 0, gpt_name);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
t->gpt_req[t->gpt_req_count - 1]->desired_slot = i + 1;
|
||||||
|
} else if(do_gpt) {
|
||||||
|
t->gpt_req[index]->desired_slot = i + 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ISO_SUCCESS;
|
return ISO_SUCCESS;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2008 Vreixo Formoso
|
* Copyright (c) 2008 Vreixo Formoso
|
||||||
* Copyright (c) 2012 - 2019 Thomas Schmitt
|
* Copyright (c) 2012 - 2024 Thomas Schmitt
|
||||||
*
|
*
|
||||||
* This file is part of the libisofs project; you can redistribute it and/or
|
* This file is part of the libisofs project; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License version 2
|
* modify it under the terms of the GNU General Public License version 2
|
||||||
@ -251,6 +251,15 @@ struct iso_gpt_partition_request {
|
|||||||
bit0= this is an automatically placed filler partition
|
bit0= this is an automatically placed filler partition
|
||||||
*/
|
*/
|
||||||
uint32_t req_status;
|
uint32_t req_status;
|
||||||
|
|
||||||
|
/* Desired partition number in emerging GPT: first = 1, no desire = 0
|
||||||
|
GPT partitions get sorted by start LBA. Gaps of uncovered blocks get
|
||||||
|
filled. If the resulting sequence positions the partition at a lower
|
||||||
|
slot than desired, then empty slots get inserted to match the desire.
|
||||||
|
If the sequence positions the partition at a higher slot, then a mere
|
||||||
|
note is issued and the partition gets into the higher slot.
|
||||||
|
*/
|
||||||
|
int desired_slot;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Copies the content of req and registers it in t.gpt_req[].
|
/* Copies the content of req and registers it in t.gpt_req[].
|
||||||
|
Loading…
Reference in New Issue
Block a user