[syslinux] [PATCH] : Add diskbypartname option to chain.c32
Ady Ady
ady-sf at hotmail.com
Thu Jul 14 18:50:01 PDT 2016
Looking at the UEFI specs, and _if_ I understand Erwan's patch correctly,
we are talking about searching for a "Partition Name". Avoiding the
"label" term for this new option should help in reducing some potential
confusions (e.g. BSD's "disklabel", fdisk's "partition label (type)",
filesystem's "volume label"...).
So, IMO, "diskbypartname" should be a reasonable contraction of "disk
being selected by searching for a GPT Partition Name".
If it has not been clear enough in prior emails, this new
"diskbypartname" option could be applicable for users with a
(Protective) MBR in a GPT scheme booting in BIOS / CSM mode.
I am basing this patch on Syslinux 6.04-pre1. At the time of writing
this email, it is also equivalent to basing it on the current git
master head.
If the patch is accepted, it would be helpful for users to also see
'doc/chain.txt' being patched. Additional potential rewording in
'com32/chain/{chain.c,options.c} might be helpful too in future
separated patches.
I took Erwan's patch and slightly modified it with some rewording and
by changing "dlabel" to "diskbypartname". I hope I've done it
correctly; please evaluate it with careful attention. I have not
compiled any binaries with this patch.
The following is the relevant text for the patch and the patching code
for 'com32/chain/chain.c' and for 'com32/chain/options.c.
The existing "label:" and "guid:" options select a specified partition
and jump to it.
The new "diskbypartname" option searches in disks for a GPT partition
with the specified Partition Name, and jumps to the first _disk_ that
matches the search.
The specified partition might not be related to the boot process; its
Name is just used for the detection / selection of the disk.
A possible use case is for making a localboot like:
label localboot
com32 chain.c32
append diskbypartname=datapartition
This option allows booting a disk that contains at least one GPT
partition named "datapartition".
The "diskbypartname:" option can be considered as doing almost what the
"mbr:" option does, but by searching for a specified Partition Name in
the GPT partitions.
diff U3 syslinux-6.04-pre1/com32/chain/chain.c diskbypartname/com32/chain/chain.c
--- syslinux-6.04-pre1/com32/chain/chain.c Fri Jul 15 01:27:23 2016
+++ diskbypartname/com32/chain/chain.c Fri Jul 15 01:00:03 2016
@@ -143,6 +143,38 @@
return drive;
}
+/*
+ * Search for a disk having a GPT partition with a specified Partition Name.
+ * Return disk and iterator at proper position.
+ */
+static int find_disk_by_partition_name(const char *label, struct part_iter **_boot_part)
+{
+ struct part_iter *iter = NULL;
+ struct disk_info diskinfo;
+ int drive;
+
+ for (drive = 0x80; drive < 0x80 + fixed_cnt; drive++) {
+ if (disk_get_params(drive, &diskinfo))
+ continue; /* Drive doesn't exist */
+ if (!(iter = pi_begin(&diskinfo, opt.piflags)))
+ continue;
+ /* Check for a matching GPT Partition Name */
+ if (iter->type == typegpt)
+ while (!pi_next(iter)) {
+ if (!strcmp(label, iter->gpt.part_label))
+ // We don't care about the actual partition that matched
+ pi_del(&iter);
+ // Let's return the disk itself instead
+ iter = pi_begin(&diskinfo, opt.piflags);
+ goto ok;
+ }
+ }
+ drive = -1;
+ok:
+ *_boot_part = iter;
+ return drive;
+}
+
static void do_boot(struct data_area *data, int ndata)
{
struct syslinux_memmap *mmap;
@@ -300,6 +332,15 @@
}
if (find_by_label(opt.drivename + 6, &iter) < 0) {
error("Unable to find requested GPT partition by label.");
+ goto bail;
+ }
+ } else if (!strncmp(opt.drivename, "diskbypartname", 14)) {
+ if (!opt.drivename[15]) {
+ error("No partition name specified.");
+ goto bail;
+ }
+ if (find_disk_by_partition_name(opt.drivename + 15, &iter) < 0) {
+ error("Unable to find requested GPT partition by name.");
goto bail;
}
} else if ((opt.drivename[0] == 'h' || opt.drivename[0] == 'f') &&
diff U3 syslinux-6.04-pre1/com32/chain/options.c diskbypartname/com32/chain/options.c
--- syslinux-6.04-pre1/com32/chain/options.c Fri Jul 15 01:28:29 2016
+++ diskbypartname/com32/chain/options.c Fri Jul 15 00:56:26 2016
@@ -107,6 +107,7 @@
" direct partition selection:",
" chain.c32 guid=<guid> [options]",
" chain.c32 label=<label> [options]",
+" chain.c32 diskbypartname=<partition_name> [options]",
" chain.c32 fs [options]",
"",
"You can use ':' instead of '=' and ' ' instead of ','.",
@@ -396,6 +397,8 @@
|| !strncmp(argv[i], "guid=", 5)
|| !strncmp(argv[i], "label:", 6)
|| !strncmp(argv[i], "label=", 6)
+ || !strncmp(argv[i], "diskbypartname:", 15)
+ || !strncmp(argv[i], "diskbypartname=", 15)
|| !strcmp(argv[i], "boot")
|| !strncmp(argv[i], "boot,", 5)
|| !strcmp(argv[i], "fs")) {
--
More information about the Syslinux
mailing list