sz = maxsz - bp->b_blkno; if (sz <= 0) {
if (sz < 0) {
bounds_check_with_label(bp, lp, wlabel)	struct buf *bp;	struct disklabel *lp;	int wlabel;{#define dkpart(dev) (minor(dev) & 7)	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);}