summaryrefslogtreecommitdiff
path: root/sys/arch/mac68k
diff options
context:
space:
mode:
authorbriggs <briggs@cvs.openbsd.org>1996-02-20 04:34:13 +0000
committerbriggs <briggs@cvs.openbsd.org>1996-02-20 04:34:13 +0000
commit5de6545ee7bb75bb0895f89e1e1086f2d570db11 (patch)
treef36581a39fa6c7e3c49566d628379cf7bf632abc /sys/arch/mac68k
parentcfb3b2b5d08a53c53ac839b50e4b133e81694749 (diff)
Sync. w/ NetBSD
Diffstat (limited to 'sys/arch/mac68k')
-rw-r--r--sys/arch/mac68k/mac68k/disksubr.c647
1 files changed, 348 insertions, 299 deletions
diff --git a/sys/arch/mac68k/mac68k/disksubr.c b/sys/arch/mac68k/mac68k/disksubr.c
index a4222665b3e..beea6e3c66f 100644
--- a/sys/arch/mac68k/mac68k/disksubr.c
+++ b/sys/arch/mac68k/mac68k/disksubr.c
@@ -1,4 +1,4 @@
-/* $NetBSD: disksubr.c,v 1.10 1995/07/23 21:51:47 briggs Exp $ */
+/* $NetBSD: disksubr.c,v 1.13 1996/02/14 14:20:54 briggs Exp $ */
/*
* Copyright (c) 1982, 1986, 1988 Regents of the University of California.
@@ -70,26 +70,26 @@
/* rewritten, 2-5-93 MLF */
/* its alot cleaner now, and adding support for new partition types
-isn't a bitch anymore
-known bugs:
-1) when only an HFS_PART part exists on a drive it gets assigned to "B"
-this is because of line 623 of sd.c, I think this line should go.
-2) /sbin/disklabel expects the whole disk to be in "D", we put it in
-"C" (I think) and we don't set that position in the disklabel structure
-as used. Again, not my fault.
-*/
+ * isn't a bitch anymore
+ * known bugs:
+ * 1) when only an HFS_PART part exists on a drive it gets assigned to "B"
+ * this is because of line 623 of sd.c, I think this line should go.
+ * 2) /sbin/disklabel expects the whole disk to be in "D", we put it in
+ * "C" (I think) and we don't set that position in the disklabel structure
+ * as used. Again, not my fault.
+ */
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/buf.h>
#include <sys/disklabel.h>
#include <sys/syslog.h>
-#include "dpme.h" /* MF the structure of a mac partition entry */
+#include "dpme.h" /* MF the structure of a mac partition entry */
#define b_cylin b_resid
-static int print=0;
-static char *mstr2upper(char *str);
+#define NUM_PARTS_PROBED 32
+static int print = 0;
#define ROOT_PART 1
#define UFS_PART 2
@@ -97,214 +97,241 @@ static char *mstr2upper(char *str);
#define HFS_PART 4
#define SCRATCH_PART 5
-int getFreeLabelEntry(struct disklabel *lp)
-{
/*
-find an entry in the disk label that is unused and return it
-or -1 if no entry
-*/
- int i=0;
+ * Find an entry in the disk label that is unused and return it
+ * or -1 if no entry
+ */
+int
+getFreeLabelEntry(lp)
+ struct disklabel *lp;
+{
+ int i = 0;
- for(i=0;i<MAXPARTITIONS;i++)
- {
- if ( (i != RAW_PART)
- && (lp->d_partitions[i].p_fstype==FS_UNUSED) )
+ for (i = 0; i < MAXPARTITIONS; i++) {
+ if ((i != RAW_PART)
+ && (lp->d_partitions[i].p_fstype == FS_UNUSED))
return i;
}
return -1;
}
-int whichType(struct partmapentry *part)
+/*
+ * figure out what the type of the given part is and return it
+ */
+int
+whichType(part)
+ struct partmapentry *part;
{
struct blockzeroblock *bzb;
-/*
-figure out what the type of the given part is and return it
-*/
- if (part->pmPartType[0]=='\0') return 0;
-
- if (strcmp(PART_DRIVER_TYPE,(char *)part->pmPartType)==0 ) return 0;
- if (strcmp(PART_PARTMAP_TYPE,(char *)part->pmPartType)==0 ) return 0;
+ if (part->pmPartType[0] == '\0')
+ return 0;
- if (strcmp(PART_UNIX_TYPE,(char *)part->pmPartType)==0)
- {
- /* unix part, swap, root, usr */
- bzb= (struct blockzeroblock *)(&part->pmBootArgs);
- if (bzb->bzbMagic!=BZB_MAGIC)
+ if (strcmp(PART_DRIVER_TYPE, (char *)part->pmPartType) == 0)
+ return 0;
+ if (strcmp(PART_PARTMAP_TYPE, (char *)part->pmPartType) == 0)
+ return 0;
+ if (strcmp(PART_UNIX_TYPE, (char *)part->pmPartType) == 0) {
+ /* unix part, swap, root, usr */
+ bzb = (struct blockzeroblock *)(&part->pmBootArgs);
+ if (bzb->bzbMagic != BZB_MAGIC)
return 0;
- if(bzb->bzbFlags & BZB_ROOTFS) return ROOT_PART;
+ if (bzb->bzbFlags & BZB_ROOTFS)
+ return ROOT_PART;
- if(bzb->bzbFlags & BZB_USRFS) return UFS_PART;
+ if (bzb->bzbFlags & BZB_USRFS)
+ return UFS_PART;
- if(bzb->bzbType == BZB_TYPESWAP) return SWAP_PART;
+ if (bzb->bzbType == BZB_TYPESWAP)
+ return SWAP_PART;
return 0;
}
- if (strcmp(PART_MAC_TYPE,(char *)part->pmPartType)==0 ) return HFS_PART;
-
+ if (strcmp(PART_MAC_TYPE, (char *)part->pmPartType) == 0)
+ return HFS_PART;
/*
- if (strcmp(PART_SCRATCH,(char *)part->pmPartType)==0 ) return SCRATCH_PART;
+ if (strcmp(PART_SCRATCH, (char *)part->pmPartType) == 0)
+ return SCRATCH_PART;
*/
-
return SCRATCH_PART; /* no known type, but label it, anyway */
}
-
-
-int fixPartTable(struct partmapentry *partTable,long size,char *base)
+/*
+ * Take part table in crappy form, place it in a structure we can depend
+ * upon. Make sure names are NUL terminated. Capitalize the names
+ * of part types.
+ */
+static void
+fixPartTable(partTable, size, base, num)
+ struct partmapentry *partTable;
+ long size;
+ char *base;
+ int *num;
{
- int i=0;
+ int i = 0;
struct partmapentry *pmap;
+ char *s;
-/*
-take part table in crappy form, place it in a structure we can depend
-upon. make sure names are null terminated. Capitalize the names
-of part types.
-*/
+ for (i = 0; i < MAXPARTITIONS; i++) {
+ pmap = (struct partmapentry *)((i * size) + base);
- for(i=0;i<MAXPARTITIONS;i++)
- {
- pmap=(struct partmapentry *)((i*size)+base);
- pmap->pmPartName[31]='\0';
- pmap->pmPartType[31]='\0';
+ if (pmap->pmSig != DPME_MAGIC) { /* this is not valid */
+ pmap->pmPartType[0] = '\0';
+ break;
+ }
- mstr2upper((char *)pmap->pmPartType);
+ (*num)++;
- if (pmap->pmSig!=DPME_MAGIC) /* this is not valid */
- pmap->pmPartType[0]='\0';
+ pmap->pmPartName[31] = '\0';
+ pmap->pmPartType[31] = '\0';
- partTable[i]=*pmap;
+ for (s = pmap->pmPartType; *s; s++)
+ if ((*s >= 'a') && (*s <= 'z'))
+ *s = (*s - 'a' + 'A');
+ partTable[i] = *pmap;
}
-
- return 0;
}
-
-int setRoot(struct partmapentry *part,struct disklabel *lp,int slot)
+static void
+setRoot(part, lp, slot)
+ struct partmapentry *part;
+ struct disklabel *lp;
+ int slot;
{
- lp->d_partitions[slot].p_size =part->pmPartBlkCnt;
- lp->d_partitions[slot].p_offset=part->pmPyPartStart;
- lp->d_partitions[slot].p_fstype=FS_BSDFFS;
+ lp->d_partitions[slot].p_size = part->pmPartBlkCnt;
+ lp->d_partitions[slot].p_offset = part->pmPyPartStart;
+ lp->d_partitions[slot].p_fstype = FS_BSDFFS;
#if PRINT_DISKLABELS
- printf("%c: Root '%s' at %d size %d\n",slot+'a',
- part->pmPartName,
- part->pmPyPartStart,
- part->pmPartBlkCnt);
+ printf("%c: Root '%s' at %d size %d\n", slot + 'a',
+ part->pmPartName,
+ part->pmPyPartStart,
+ part->pmPartBlkCnt);
#endif
- part->pmPartType[0]='\0';
-
- return 0;
+ part->pmPartType[0] = '\0';
}
-int setSwap(struct partmapentry *part,struct disklabel *lp,int slot)
+static void
+setSwap(part, lp, slot)
+ struct partmapentry *part;
+ struct disklabel *lp;
+ int slot;
{
- lp->d_partitions[slot].p_size =part->pmPartBlkCnt;
- lp->d_partitions[slot].p_offset=part->pmPyPartStart;
- lp->d_partitions[slot].p_fstype=FS_SWAP;
+ lp->d_partitions[slot].p_size = part->pmPartBlkCnt;
+ lp->d_partitions[slot].p_offset = part->pmPyPartStart;
+ lp->d_partitions[slot].p_fstype = FS_SWAP;
#if PRINT_DISKLABELS
- printf("%c: Swap '%s' at %d size %d\n",slot+'a',
- part->pmPartName,
- part->pmPyPartStart,
- part->pmPartBlkCnt);
+ printf("%c: Swap '%s' at %d size %d\n", slot + 'a',
+ part->pmPartName,
+ part->pmPyPartStart,
+ part->pmPartBlkCnt);
#endif
- part->pmPartType[0]='\0';
-
- return 0;
+ part->pmPartType[0] = '\0';
}
-
-int setUfs(struct partmapentry *part,struct disklabel *lp,int slot)
+
+static void
+setUfs(part, lp, slot)
+ struct partmapentry *part;
+ struct disklabel *lp;
+ int slot;
{
- lp->d_partitions[slot].p_size =part->pmPartBlkCnt;
- lp->d_partitions[slot].p_offset=part->pmPyPartStart;
- lp->d_partitions[slot].p_fstype=FS_BSDFFS;
+ lp->d_partitions[slot].p_size = part->pmPartBlkCnt;
+ lp->d_partitions[slot].p_offset = part->pmPyPartStart;
+ lp->d_partitions[slot].p_fstype = FS_BSDFFS;
#if PRINT_DISKLABELS
- printf("%c: Usr '%s' at %d size %d\n",slot+'a',
- part->pmPartName,
- part->pmPyPartStart,
- part->pmPartBlkCnt);
+ printf("%c: Usr '%s' at %d size %d\n", slot + 'a',
+ part->pmPartName,
+ part->pmPyPartStart,
+ part->pmPartBlkCnt);
#endif
- part->pmPartType[0]='\0';
-
- return 0;
+ part->pmPartType[0] = '\0';
}
-int setHfs(struct partmapentry *part,struct disklabel *lp,int slot)
+static void
+setHfs(part, lp, slot)
+ struct partmapentry *part;
+ struct disklabel *lp;
+ int slot;
{
- lp->d_partitions[slot].p_size =part->pmPartBlkCnt;
- lp->d_partitions[slot].p_offset=part->pmPyPartStart;
- lp->d_partitions[slot].p_fstype=FS_HFS;
+ lp->d_partitions[slot].p_size = part->pmPartBlkCnt;
+ lp->d_partitions[slot].p_offset = part->pmPyPartStart;
+ lp->d_partitions[slot].p_fstype = FS_HFS;
#if PRINT_DISKLABELS
- printf("%c: HFS_PART '%s' at %d size %d\n",slot+'a',
- part->pmPartName,
- part->pmPyPartStart,
- part->pmPartBlkCnt);
+ printf("%c: HFS_PART '%s' at %d size %d\n", slot + 'a',
+ part->pmPartName,
+ part->pmPyPartStart,
+ part->pmPartBlkCnt);
#endif
- part->pmPartType[0]='\0';
-
- return 0;
+ part->pmPartType[0] = '\0';
}
-int setScratch(struct partmapentry *part,struct disklabel *lp,int slot)
+static void
+setScratch(part, lp, slot)
+ struct partmapentry *part;
+ struct disklabel *lp;
+ int slot;
{
- lp->d_partitions[slot].p_size =part->pmPartBlkCnt;
- lp->d_partitions[slot].p_offset=part->pmPyPartStart;
- lp->d_partitions[slot].p_fstype=FS_OTHER;
+ lp->d_partitions[slot].p_size = part->pmPartBlkCnt;
+ lp->d_partitions[slot].p_offset = part->pmPyPartStart;
+ lp->d_partitions[slot].p_fstype = FS_OTHER;
#if PRINT_DISKLABELS
- printf("%c: Other (%s) '%s' at %d size %d\n",slot+'a',
- part->pmPartType,
- part->pmPartName,
- part->pmPyPartStart,
- part->pmPartBlkCnt);
+ printf("%c: Other (%s) '%s' at %d size %d\n", slot + 'a',
+ part->pmPartType,
+ part->pmPartName,
+ part->pmPyPartStart,
+ part->pmPartBlkCnt);
#endif
- part->pmPartType[0]='\0';
-
- return 0;
+ part->pmPartType[0] = '\0';
}
-int getNamedType(struct partmapentry *part,struct disklabel *lp,int type, int alt)
+int
+getNamedType(part, num_parts, lp, type, alt, maxslot)
+ struct partmapentry *part;
+ int num_parts;
+ struct disklabel *lp;
+ int type, alt;
+ int *maxslot;
{
- struct blockzeroblock *bzb;
- int i=0;
-
- for(i=0;i<MAXPARTITIONS;i++)
- {
- if (whichType(&(part[i]))==type)
- {
- switch(type)
- {
- case ROOT_PART:
- bzb = (struct blockzeroblock *)
- (&part[i].pmBootArgs);
- if (alt >= 0 && alt != bzb->bzbCluster)
- goto skip;
- setRoot(&(part[i]),lp,0);
- break;
- case UFS_PART:
- bzb = (struct blockzeroblock *)
- (&part[i].pmBootArgs);
- if (alt >= 0 && alt != bzb->bzbCluster)
- goto skip;
- setUfs(&(part[i]),lp,6);
- break;
- case SWAP_PART:
- setSwap(&(part[i]),lp,1);
- break;
- default:
- printf("disksubr.c: can't do type \n",type);
- break;
+ struct blockzeroblock *bzb;
+ int i = 0;
+
+ for (i = 0; i < num_parts; i++) {
+ if (whichType(&(part[i])) == type) {
+ switch (type) {
+ case ROOT_PART:
+ bzb = (struct blockzeroblock *)
+ (&part[i].pmBootArgs);
+ if (alt >= 0 && alt != bzb->bzbCluster)
+ goto skip;
+ setRoot(&(part[i]), lp, 0);
+ break;
+ case UFS_PART:
+ bzb = (struct blockzeroblock *)
+ (&part[i].pmBootArgs);
+ if (alt >= 0 && alt != bzb->bzbCluster)
+ goto skip;
+ setUfs(&(part[i]), lp, 6);
+ if (*maxslot < 6) *maxslot = 6;
+ break;
+ case SWAP_PART:
+ setSwap(&(part[i]), lp, 1);
+ if (*maxslot < 1) *maxslot = 1;
+ break;
+ default:
+ printf("disksubr.c: can't do type \n", type);
+ break;
}
return 0;
@@ -316,47 +343,127 @@ skip:
}
/*
- * Attempt to read a disk label from a device
- * using the indicated stategy routine.
- * The label must be partly set up before this:
- * secpercyl and anything required in the strategy routine
- * (e.g., sector size) must be filled in before calling us.
- * Returns null on success and an error string on failure.
+ * MF --
+ * here's what i'm gonna do:
+ * read in the entire diskpartition table, it may be bigger or smaller
+ * than MAXPARTITIONS but read that many entries. Each entry has a magic
+ * number so we'll know if an entry is crap.
+ * next fill in the disklabel with info like this
+ * next fill in the root, usr, and swap parts.
+ * then look for anything else and fit it in.
+ * A: root
+ * B: Swap
+ * C: Whole disk
+ * G: Usr
+ *
+ *
+ * I'm not entirely sure what netbsd386 wants in c & d
+ * 386bsd wants other stuff, so i'll leave them alone
+ *
+ * AKB -- I added to Mike's original algorithm by searching for a bzbCluster
+ * of zero for root, first. This allows A/UX to live on cluster 1 and
+ * NetBSD to live on cluster 0--regardless of the actual order on the
+ * disk. This whole algorithm should probably be changed in the future.
*/
char *
-readdisklabel(dev, strat, lp, osdep)
+read_mac_label(dev, strat, lp, osdep)
dev_t dev;
void (*strat)();
register struct disklabel *lp;
struct cpu_disklabel *osdep;
{
- register struct buf *bp;
+ struct buf *bp;
char *msg = NULL;
- struct blockzeroblock *bzb;
+ int i = 0, num_parts = 0, maxslot = 0;
+ struct partmapentry pmap[NUM_PARTS_PROBED];
-/* MF
-here's what i'm gonna do:
-read in the entire diskpartition table, it may be bigger or smaller
-than MAXPARTITIONS but read that many entries. Each entry has a magic
-number so we'll know if an entry is crap.
-next fill in the disklabel with info like this
-next fill in the root, usr, and swap parts.
-Then look for anything else and fit it in
-A: root
-B: Swap
-C: Whole disk
-G: Usr
+ bp = geteblk((int) lp->d_secsize * NUM_PARTS_PROBED);
+ bp->b_dev = dev;
+ bp->b_blkno = 1; /* partition map starts at blk 1 */
+ bp->b_bcount = lp->d_secsize * NUM_PARTS_PROBED;
+ bp->b_flags = B_BUSY | B_READ;
+ bp->b_cylin = 1 / lp->d_secpercyl;
+ (*strat)(bp);
+ if (biowait(bp)) {
+ msg = "I/O error reading partition map.";
+ goto done;
+ }
+ lp->d_npartitions = 1; /* one for 'c' */
+ fixPartTable(pmap, lp->d_secsize, bp->b_un.b_addr, &num_parts);
+ if (getNamedType(pmap, num_parts, lp, ROOT_PART, 0, &maxslot))
+ getNamedType(pmap, num_parts, lp, ROOT_PART, -1, &maxslot);
+ if (getNamedType(pmap, num_parts, lp, UFS_PART, 0, &maxslot))
+ getNamedType(pmap, num_parts, lp, UFS_PART, -1, &maxslot);
+ getNamedType(pmap, num_parts, lp, SWAP_PART, -1, &maxslot);
+ for (i = 0; i < num_parts; i++) {
+ int partType;
+ int slot;
-I'm not entirely sure what netbsd386 wants in c &d
-386bsd wants other stuff, so i'll leave them alone
+ slot = getFreeLabelEntry(lp);
+ if (slot < 0)
+ break;
-AKB -- I added to Mike's original algorithm by searching for a bzbCluster
- of zero for root, first. This allows A/UX to live on cluster 1 and
- NetBSD to live on cluster 0--regardless of the actual order on the
- disk. This whole algorithm should probably be changed in the future.
+ partType = whichType(&(pmap[i]));
+
+ switch (partType) {
+
+ case ROOT_PART:
+ /*
+ * another root part will turn into a plain old
+ * UFS_PART partition, live with it.
+ */
+ case UFS_PART:
+ setUfs(&(pmap[i]), lp, slot);
+ if (slot > maxslot) maxslot = slot;
+ break;
+ case SWAP_PART:
+ setSwap(&(pmap[i]), lp, slot);
+ if (slot > maxslot) maxslot = slot;
+ break;
+ case HFS_PART:
+ setHfs(&(pmap[i]), lp, slot);
+ if (slot > maxslot) maxslot = slot;
+ break;
+ case SCRATCH_PART:
+ setScratch(&(pmap[i]), lp, slot);
+ if (slot > maxslot) maxslot = slot;
+ break;
+ default:
+ break;
+ }
+ }
+ lp->d_npartitions = maxslot+1;
+
+done:
+ bp->b_flags = B_INVAL | B_AGE | B_READ;
+ brelse(bp);
+ return msg;
+}
+
+/*
+ * Attempt to read a disk label from a device using the indicated stategy
+ * routine. The label must be partly set up before this: secpercyl and
+ * anything required in the strategy routine (e.g., sector size) must be
+ * filled in before calling us. Returns null on success and an error
+ * string on failure.
+ *
+ * This will read sector zero. If this contains what looks like a valid
+ * Macintosh boot sector, we attempt to fill in the disklabel structure.
+ * If the first longword of the disk is a NetBSD disk label magic number,
+ * then we assume that it's a real disklabel and return it.
+ */
+char *
+readdisklabel(dev, strat, lp, osdep)
+ dev_t dev;
+ void (*strat)();
+ register struct disklabel *lp;
+ struct cpu_disklabel *osdep;
+{
+ register struct buf *bp;
+ char *msg = NULL;
+ struct disklabel *dlp;
-*/
if (lp->d_secperunit == 0)
lp->d_secperunit = 0x1fffffff;
@@ -366,74 +473,39 @@ AKB -- I added to Mike's original algorithm by searching for a bzbCluster
bp = geteblk((int)lp->d_secsize * MAXPARTITIONS);
bp->b_dev = dev;
- bp->b_blkno = 1; /* pmap starts at block 1 */
- bp->b_bcount = lp->d_secsize * MAXPARTITIONS;
+ bp->b_blkno = 0;
+ bp->b_resid = 0;
+ bp->b_bcount = lp->d_secsize;
bp->b_flags = B_BUSY | B_READ;
bp->b_cylin = 1 / lp->d_secpercyl;
(*strat)(bp);
if (biowait(bp)) {
- msg = "I/O error";
- }
- else {
- int i=0;
- struct partmapentry pmap[MAXPARTITIONS];
-
- fixPartTable(pmap,lp->d_secsize,bp->b_un.b_addr);
- if (getNamedType(pmap,lp,ROOT_PART, 0))
- getNamedType(pmap,lp,ROOT_PART, -1);
- if (getNamedType(pmap,lp,UFS_PART, 0))
- getNamedType(pmap,lp,UFS_PART, -1);
- getNamedType(pmap,lp,SWAP_PART, -1);
- for(i=0;i<MAXPARTITIONS;i++)
- {
- int partType;
- int slot;
-
- slot=getFreeLabelEntry(lp);
- if (slot < 0)
- break;
-
- partType=whichType(&(pmap[i]));
-
- switch (partType)
- {
-
- case ROOT_PART:
-/*
-another root part will turn into a plain old UFS_PART partition,
-live with it.
-*/
- case UFS_PART:
- setUfs(&(pmap[i]),lp,slot);
- break;
- case SWAP_PART:
- setSwap(&(pmap[i]),lp,slot);
- break;
- case HFS_PART:
- setHfs(&(pmap[i]),lp,slot);
- break;
- case SCRATCH_PART:
- setScratch(&(pmap[i]),lp,slot);
- break;
- default:
- break;
-
+ msg = "I/O error reading block zero";
+ } else {
+ u_int16_t *sbSigp;
+
+ sbSigp = (u_int16_t *) bp->b_un.b_addr;
+ if (*sbSigp == 0x4552) {
+ msg = read_mac_label(dev, strat, lp, osdep);
+ } else {
+ dlp = (struct disklabel *)(bp->b_un.b_addr + 0);
+ if (dlp->d_magic == DISKMAGIC) {
+ *lp = *dlp;
+ } else {
+ msg = "no disk label--NetBSD or Macintosh";
}
}
}
-
- lp->d_npartitions=MAXPARTITIONS;
-
- bp->b_flags = B_INVAL | B_AGE;
+ bp->b_flags = B_INVAL | B_AGE | B_READ;
brelse(bp);
return (msg);
}
/*
- * Check new disk label for sensibility
- * before setting it.
+ * Check new disk label for sensibility before setting it.
*/
+int
setdisklabel(olp, nlp, openmask, osdep)
register struct disklabel *olp, *nlp;
u_long openmask;
@@ -466,21 +538,16 @@ setdisklabel(olp, nlp, openmask, osdep)
npp->p_cpg = opp->p_cpg;
}
}
- nlp->d_checksum = 0;
- nlp->d_checksum = dkcksum(nlp);
+ nlp->d_checksum = 0;
+ nlp->d_checksum = dkcksum(nlp);
*olp = *nlp;
#endif
return (0);
}
-/* encoding of disk minor numbers, should be elsewhere... */
-#define dkunit(dev) (minor(dev) >> 3)
-#define dkpart(dev) (minor(dev) & 07)
-#define dkminor(unit, part) (((unit) << 3) | (part))
-
/*
* Write disk label back to device after modification.
- *
+ *
* MF - 8-14-93 This function is never called. It is here just in case
* we want to write dos disklabels some day. Really!
*/
@@ -496,14 +563,14 @@ writedisklabel(dev, strat, lp, osdep)
int labelpart;
int error = 0;
- labelpart = dkpart(dev);
+ labelpart = DISKPART(dev);
if (lp->d_partitions[labelpart].p_offset != 0) {
if (lp->d_partitions[0].p_offset != 0)
- return (EXDEV); /* not quite right */
+ return (EXDEV); /* not quite right */
labelpart = 0;
}
bp = geteblk((int)lp->d_secsize);
- bp->b_dev = makedev(major(dev), dkminor(dkunit(dev), labelpart));
+ bp->b_dev = MAKEDISKDEV(major(dev), DISKUNIT(dev), labelpart);
bp->b_blkno = LABELSECTOR;
bp->b_bcount = lp->d_secsize;
bp->b_flags = B_READ;
@@ -512,7 +579,7 @@ writedisklabel(dev, strat, lp, osdep)
goto done;
for (dlp = (struct disklabel *)bp->b_un.b_addr;
dlp <= (struct disklabel *)
- (bp->b_un.b_addr + lp->d_secsize - sizeof(*dlp));
+ (bp->b_un.b_addr + lp->d_secsize - sizeof(*dlp));
dlp = (struct disklabel *)((char *)dlp + sizeof(long))) {
if (dlp->d_magic == DISKMAGIC && dlp->d_magic2 == DISKMAGIC &&
dkcksum(dlp) == 0) {
@@ -538,84 +605,66 @@ done:
* if needed, and signal errors or early completion.
*/
int
-bounds_check_with_label(struct buf *bp, struct disklabel *lp, int wlabel)
+bounds_check_with_label(bp, lp, wlabel)
+ struct buf *bp;
+ struct disklabel *lp;
+ int wlabel;
{
- struct partition *p = lp->d_partitions + dkpart(bp->b_dev);
+ struct partition *p = lp->d_partitions + DISKPART(bp->b_dev);
int labelsect = lp->d_partitions[0].p_offset;
- int maxsz = p->p_size,
- sz = (bp->b_bcount + DEV_BSIZE - 1) >> DEV_BSHIFT;
+ int maxsz = p->p_size;
+ int sz = (bp->b_bcount + DEV_BSIZE - 1) >> DEV_BSHIFT;
/* overwriting disk label ? */
/* XXX should also protect bootstrap in first 8K */
-#if 0 /* MF this is crap, especially on swap !! */
- if (bp->b_blkno + p->p_offset <= LABELSECTOR + labelsect &&
+#if 0 /* MF this is crap, especially on swap !! */
+ if (bp->b_blkno + p->p_offset <= LABELSECTOR + labelsect &&
#if LABELSECTOR != 0
- bp->b_blkno + p->p_offset + sz > LABELSECTOR + labelsect &&
+ bp->b_blkno + p->p_offset + sz > LABELSECTOR + labelsect &&
#endif
- (bp->b_flags & B_READ) == 0 && wlabel == 0) {
- bp->b_error = EROFS;
- goto bad;
- }
+ (bp->b_flags & B_READ) == 0 && wlabel == 0) {
+ bp->b_error = EROFS;
+ goto bad;
+ }
#endif
-#if defined(DOSBBSECTOR) && defined(notyet)
+#if defined(DOSBBSECTOR) && defined(notyet)
/* overwriting master boot record? */
- if (bp->b_blkno + p->p_offset <= DOSBBSECTOR &&
- (bp->b_flags & B_READ) == 0 && wlabel == 0) {
- bp->b_error = EROFS;
- goto bad;
- }
+ if (bp->b_blkno + p->p_offset <= DOSBBSECTOR &&
+ (bp->b_flags & B_READ) == 0 && wlabel == 0) {
+ bp->b_error = EROFS;
+ goto bad;
+ }
#endif
/* beyond partition? */
- if (bp->b_blkno < 0 || bp->b_blkno + sz > maxsz) {
- /* if exactly at end of disk, return an EOF */
- if (bp->b_blkno == maxsz) {
- bp->b_resid = bp->b_bcount;
- return(0);
- }
- /* or truncate if part of it fits */
- sz = maxsz - bp->b_blkno;
- if (sz <= 0) {
+ if (bp->b_blkno < 0 || bp->b_blkno + sz > maxsz) {
+ /* if exactly at end of disk, return an EOF */
+ if (bp->b_blkno == maxsz) {
+ bp->b_resid = bp->b_bcount;
+ return (0);
+ }
+ /* or truncate if part of it fits */
+ sz = maxsz - bp->b_blkno;
+ if (sz <= 0) {
bp->b_error = EINVAL;
- goto bad;
+ goto bad;
}
- bp->b_bcount = sz << DEV_BSHIFT;
- }
-
+ bp->b_bcount = sz << DEV_BSHIFT;
+ }
/* calculate cylinder for disksort to order transfers with */
- bp->b_cylin = (bp->b_blkno + p->p_offset) / lp->d_secpercyl;
- return(1);
+ bp->b_cylin = (bp->b_blkno + p->p_offset) / lp->d_secpercyl;
+ return (1);
bad:
bp->b_flags |= B_ERROR;
- return(-1);
-}
-
-static int
-mtoupper(int c)
-{
- if (( c>='a' ) && ( c<='z') )
- return ( c-'a' + 'A' );
- else
- return c;
-
-}
-
-static char *
-mstr2upper(char *str)
-{
- char *p;
-
- for(p=str;*p;p++)
- *p=mtoupper(*p);
- return str;
+ return (-1);
}
void
dk_establish(dk, dev)
- struct dkdevice *dk;
- struct device *dev;
+ struct dkdevice *dk;
+ struct device *dev;
{
/* Empty for now. -- XXX */
}