CCD_DPRINTF(CCDB_FOLLOW, ("ccdstrategy(%p): unit %d\n", bp, unit));
ccdstrategy(struct buf *bp){	int unit = ccdunit(bp->b_dev);	struct ccd_softc *cs = &ccd_softc[unit];	int s;	int wlabel;	struct disklabel *lp;#ifdef DEBUG	if (ccddebug & CCDB_FOLLOW)		printf("ccdstrategy(%p): unit %d\n", bp, unit);#endif	if ((cs->sc_flags & CCDF_INITED) == 0) {		bp->b_error = ENXIO;		bp->b_resid = bp->b_bcount;		bp->b_flags |= B_ERROR;		goto done;	}	/* If it's a nil transfer, wake up the top half now. */	if (bp->b_bcount == 0)		goto done;	lp = cs->sc_dkdev.dk_label;	/*	 * Do bounds checking and adjust transfer.  If there's an	 * error, the bounds check will flag that for us.	 */	wlabel = cs->sc_flags & (CCDF_WLABEL|CCDF_LABELLING);	if (DISKPART(bp->b_dev) != RAW_PART &&	    bounds_check_with_label(bp, lp, cs->sc_dkdev.dk_cpulabel,	    wlabel) <= 0)		goto done;	bp->b_resid = bp->b_bcount;	/*	 * "Start" the unit.	 */	s = splbio();	ccdstart(cs, bp);	splx(s);	return;done:	s = splbio();	biodone(bp);	splx(s);}