svn commit: r332956 - stable/11/stand/common
Benno Rice
benno at FreeBSD.org
Tue Apr 24 18:19:31 UTC 2018
Author: benno
Date: Tue Apr 24 18:19:30 2018
New Revision: 332956
URL: https://svnweb.freebsd.org/changeset/base/332956
Log:
MFC r332085
Add an ISO9660 "partition table" type to loader.
When booted via isoboot(8) loader will be handed a disk that simply contains
an ISO9660 image. Currently this confuses it greatly. Teach it how to spot
that it's in this situation and that ISO9660 has one "partition" covering
the whole disk.
Sponsored by: iXsystems, Inc.
Modified:
stable/11/stand/common/disk.c
stable/11/stand/common/part.c
stable/11/stand/common/part.h
Directory Properties:
stable/11/ (props changed)
Modified: stable/11/stand/common/disk.c
==============================================================================
--- stable/11/stand/common/disk.c Tue Apr 24 18:13:28 2018 (r332955)
+++ stable/11/stand/common/disk.c Tue Apr 24 18:19:30 2018 (r332956)
@@ -270,6 +270,9 @@ disk_open(struct disk_devdesc *dev, uint64_t mediasize
dev->d_offset = part.start;
od->entrysize = part.end - part.start + 1;
}
+ } else if (ptable_gettype(od->table) == PTABLE_ISO9660) {
+ dev->d_offset = 0;
+ od->entrysize = mediasize;
} else if (slice >= 0) {
/* Try to get information about partition */
if (slice == 0)
Modified: stable/11/stand/common/part.c
==============================================================================
--- stable/11/stand/common/part.c Tue Apr 24 18:13:28 2018 (r332955)
+++ stable/11/stand/common/part.c Tue Apr 24 18:19:30 2018 (r332956)
@@ -37,6 +37,8 @@ __FBSDID("$FreeBSD$");
#include <sys/queue.h>
#include <sys/vtoc.h>
+#include <fs/cd9660/iso.h>
+
#include <crc32.h>
#include <part.h>
#include <uuid.h>
@@ -97,6 +99,7 @@ static struct parttypes {
{ PART_LINUX, "Linux" },
{ PART_LINUX_SWAP, "Linux swap" },
{ PART_DOS, "DOS/Windows" },
+ { PART_ISO9660, "ISO9660" },
};
const char *
@@ -603,6 +606,45 @@ out:
}
#endif /* LOADER_VTOC8_SUPPORT */
+#define cdb2devb(bno) ((bno) * ISO_DEFAULT_BLOCK_SIZE / table->sectorsize)
+
+static struct ptable *
+ptable_iso9660read(struct ptable *table, void *dev, diskread_t dread)
+{
+ uint8_t *buf;
+ struct iso_primary_descriptor *vd;
+ struct pentry *entry;
+
+ buf = malloc(table->sectorsize);
+ if (buf == NULL)
+ return (table);
+
+ if (dread(dev, buf, 1, cdb2devb(16)) != 0) {
+ DEBUG("read failed");
+ ptable_close(table);
+ table = NULL;
+ goto out;
+ }
+ vd = (struct iso_primary_descriptor *)buf;
+ if (bcmp(vd->id, ISO_STANDARD_ID, sizeof vd->id) != 0)
+ goto out;
+
+ entry = malloc(sizeof(*entry));
+ if (entry == NULL)
+ goto out;
+ entry->part.start = 0;
+ entry->part.end = table->sectors;
+ entry->part.type = PART_ISO9660;
+ entry->part.index = 0;
+ STAILQ_INSERT_TAIL(&table->entries, entry, entry);
+
+ table->type = PTABLE_ISO9660;
+
+out:
+ free(buf);
+ return (table);
+}
+
struct ptable *
ptable_open(void *dev, uint64_t sectors, uint16_t sectorsize,
diskread_t *dread)
@@ -633,6 +675,11 @@ ptable_open(void *dev, uint64_t sectors, uint16_t sect
table->sectorsize = sectorsize;
table->type = PTABLE_NONE;
STAILQ_INIT(&table->entries);
+
+ if (ptable_iso9660read(table, dev, dread) != NULL) {
+ if (table->type == PTABLE_ISO9660)
+ goto out;
+ }
#ifdef LOADER_VTOC8_SUPPORT
if (be16dec(buf + offsetof(struct vtoc8, magic)) == VTOC_MAGIC) {
Modified: stable/11/stand/common/part.h
==============================================================================
--- stable/11/stand/common/part.h Tue Apr 24 18:13:28 2018 (r332955)
+++ stable/11/stand/common/part.h Tue Apr 24 18:19:30 2018 (r332956)
@@ -36,7 +36,8 @@ enum ptable_type {
PTABLE_BSD,
PTABLE_MBR,
PTABLE_GPT,
- PTABLE_VTOC8
+ PTABLE_VTOC8,
+ PTABLE_ISO9660
};
enum partition_type {
@@ -52,6 +53,7 @@ enum partition_type {
PART_LINUX,
PART_LINUX_SWAP,
PART_DOS,
+ PART_ISO9660
};
struct ptable_entry {
More information about the svn-src-stable-11
mailing list