Make the loader a bit smarter, when it tries to open disk and the slice

number is not exactly specified. When the disk has MBR, also try to read
BSD label after ptable_getpart() call. When the disk has GPT, also set
d_partition to 255.  Mostly, this is how it worked before.
This commit is contained in:
Andrey V. Elsukov 2012-09-28 10:49:41 +00:00
parent 5d8a6a1078
commit 88a0dd24bf
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=241023

View File

@ -179,12 +179,21 @@ disk_open(struct disk_devdesc *dev, off_t mediasize, u_int sectorsize)
rc = ptable_getpart(od->table, &part, dev->d_partition);
if (rc == 0)
dev->d_offset = part.start;
} else if (dev->d_slice > 0) {
} else if (dev->d_slice >= 0) {
/* Try to get information about partition */
rc = ptable_getpart(od->table, &part, dev->d_slice);
if (dev->d_slice == 0)
rc = ptable_getbestpart(od->table, &part);
else
rc = ptable_getpart(od->table, &part, dev->d_slice);
if (rc != 0) /* Partition doesn't exist */
goto out;
dev->d_offset = part.start;
if (dev->d_slice == 0) {
/* Save the slice number of best partition to dev */
dev->d_slice = part.index;
if (ptable_gettype(od->table) == PTABLE_GPT)
dev->d_partition = 255;
}
if (dev->d_partition == 255)
goto out; /* Nothing more to do */
/*
@ -217,13 +226,6 @@ disk_open(struct disk_devdesc *dev, off_t mediasize, u_int sectorsize)
if (rc != 0)
goto out;
dev->d_offset += part.start;
} else if (dev->d_slice == 0) {
rc = ptable_getbestpart(od->table, &part);
if (rc != 0)
goto out;
/* Save the slice number of best partition to dev */
dev->d_slice = part.index;
dev->d_offset = part.start;
}
out:
if (table != NULL)