Add dk_establish() and bounds_check_with_label(), from the alpha port, for

the machine-independent SCSI driver.  Untested.

Only print diagnostics about reading Ultrix labels when DIAGNOSTIC is defined.
This commit is contained in:
jonathan 1995-08-04 02:34:24 +00:00
parent c4f9523535
commit 28c5634912
1 changed files with 70 additions and 3 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: disksubr.c,v 1.5 1995/07/14 01:05:22 jonathan Exp $ */
/* $NetBSD: disksubr.c,v 1.6 1995/08/04 02:34:24 jonathan Exp $ */
/*
* Copyright (c) 1982, 1986, 1988 Regents of the University of California.
@ -149,7 +149,9 @@ compat_label(dev, strat, lp, osdep)
goto done;
}
/*XXX*/ printf("Ultrix label loop\n");
#ifdef DIAGNOSTIC
/*XXX*/ printf("Interpreting Ultrix label\n");
#endif
lp->d_magic = DEC_LABEL_MAGIC;
lp->d_npartitions = 0;
@ -164,7 +166,7 @@ compat_label(dev, strat, lp, osdep)
(part==1) ? FS_SWAP : FS_BSDFFS;
lp->d_npartitions += 1;
#ifdef DEBUG
#ifdef DIAGNOSTIC
printf(" Ultrix label rz%d%c: start %d len %d\n",
DISKUNIT(dev), "abcdefgh"[part],
lp->d_partitions[part].p_offset,
@ -274,3 +276,68 @@ done:
brelse(bp);
return (error);
}
/*
* was this the boot device ?
*/
int
dk_establish(dk, dev)
struct dkdevice *dk;
struct device *dev;
{
/* see also arch/alpha/alpha/disksubr.c */
printf("Warning: boot path unknown\n");
return 1;
}
/*
* UNTESTED !!
*
* Determine the size of the transfer, and make sure it is
* within the boundaries of the partition. Adjust transfer
* if needed, and signal errors or early completion.
*/
int
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);
int labelsect = lp->d_partitions[0].p_offset;
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 (bp->b_blkno + p->p_offset <= LABELSECTOR + labelsect &&
(bp->b_flags & B_READ) == 0 && wlabel == 0) {
bp->b_error = EROFS;
goto bad;
}
/* 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) {
bp->b_error = EINVAL;
goto bad;
}
bp->b_bcount = sz << DEV_BSHIFT;
}
/* calculate cylinder for disksort to order transfers with */
bp->b_resid = (bp->b_blkno + p->p_offset) / lp->d_secpercyl;
return(1);
bad:
bp->b_flags |= B_ERROR;
return(-1);
}