diff options
author | briggs <briggs@cvs.openbsd.org> | 1996-02-20 04:34:13 +0000 |
---|---|---|
committer | briggs <briggs@cvs.openbsd.org> | 1996-02-20 04:34:13 +0000 |
commit | 5de6545ee7bb75bb0895f89e1e1086f2d570db11 (patch) | |
tree | f36581a39fa6c7e3c49566d628379cf7bf632abc /sys/arch/mac68k | |
parent | cfb3b2b5d08a53c53ac839b50e4b133e81694749 (diff) |
Sync. w/ NetBSD
Diffstat (limited to 'sys/arch/mac68k')
-rw-r--r-- | sys/arch/mac68k/mac68k/disksubr.c | 647 |
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 */ } |