summaryrefslogtreecommitdiff
path: root/sys/scsi
diff options
context:
space:
mode:
authorKenneth R Westerback <krw@cvs.openbsd.org>2006-01-12 01:06:28 +0000
committerKenneth R Westerback <krw@cvs.openbsd.org>2006-01-12 01:06:28 +0000
commitdc34dde8d96176c1e983a6902228d5cfcd409981 (patch)
tree81cc8fa3dc59b56eb3217665796d2d652638e7da /sys/scsi
parent36245461b399c1850940934ef6ef9559cc8aaffd (diff)
Don't populate the fabricated disklabel's partition info from track
information in the TOC. The partition info is just overwritten or rendered incomplete by readdisklabel(). Just examine the TOC to determine if the cd is audio only, i.e. it has a valid TOC but no data tracks. In this case don't call readdisklabel(). Much simpler code. No functional change for single data track CD's like the install media. ok pedro@.
Diffstat (limited to 'sys/scsi')
-rw-r--r--sys/scsi/cd.c50
1 files changed, 9 insertions, 41 deletions
diff --git a/sys/scsi/cd.c b/sys/scsi/cd.c
index 8513b9cc85a..7d3bc84e03b 100644
--- a/sys/scsi/cd.c
+++ b/sys/scsi/cd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cd.c,v 1.101 2005/12/25 20:01:11 krw Exp $ */
+/* $OpenBSD: cd.c,v 1.102 2006/01/12 01:06:27 krw Exp $ */
/* $NetBSD: cd.c,v 1.100 1997/04/02 02:29:30 mycroft Exp $ */
/*
@@ -1168,9 +1168,8 @@ cdgetdisklabel(dev, cd, lp, clp, spoofonly)
int spoofonly;
{
struct cd_toc *toc;
- u_int32_t lba, nlba;
char *errstring;
- int tocidx, n, data_track = 0;
+ int tocidx, n, audioonly = 1;
bzero(lp, sizeof(struct disklabel));
bzero(clp, sizeof(struct cpu_disklabel));
@@ -1212,53 +1211,22 @@ cdgetdisklabel(dev, cd, lp, clp, spoofonly)
lp->d_partitions[RAW_PART].p_fstype = FS_UNUSED;
lp->d_npartitions = RAW_PART + 1;
- /*
- * Read the TOC and loop through the individual tracks laying them
- * out in our disklabel.
- *
- * XXX should we move all data tracks up front before any other tracks?
- */
if (cd_load_toc(cd, toc, CD_LBA_FORMAT)) {
- n = 0; /* No valid TOC found. */
+ audioonly = 0; /* No valid TOC found == not an audio CD. */
goto done;
}
- /* +2 to account for leading out track. */
- n = toc->header.ending_track - toc->header.starting_track + 2;
-
- /* Create the partition table. */
- /* Probably should sanity-check the drive's values */
- lba = betoh32(toc->entries[0].addr.lba);
- if (cd->sc_link->quirks & ADEV_LITTLETOC)
- lba = swap32(lba);
-
- for (tocidx = 1; tocidx < n && data_track < MAXPARTITIONS; tocidx++) {
- nlba = betoh32(toc->entries[tocidx].addr.lba);
- if (cd->sc_link->quirks & ADEV_LITTLETOC)
- nlba = swap32(nlba);
-
- if (toc->entries[tocidx - 1].control & 4) {
- lp->d_partitions[data_track].p_fstype = FS_UNUSED;
- lp->d_partitions[data_track].p_offset = lba;
- lp->d_partitions[data_track].p_size = nlba - lba;
- data_track++;
- if (data_track == RAW_PART)
- data_track++;
+ n = toc->header.ending_track - toc->header.starting_track + 1;
+ for (tocidx = 0; tocidx < n; tocidx++)
+ if (toc->entries[tocidx].control & 4) {
+ audioonly = 0; /* Found a non-audio track. */
+ goto done;
}
- lba = nlba;
- }
-
- lp->d_npartitions = max((RAW_PART + 1), data_track);
-
done:
free(toc, M_TEMP);
- /*
- * If there was no valid TOC found or the TOC says we have a data track
- * then look for a real disklabel.
- */
- if (n == 0 || data_track > 0) {
+ if (!audioonly) {
errstring = readdisklabel(CDLABELDEV(dev), cdstrategy, lp, clp,
spoofonly);
/*if (errstring)