int i, old_io = ccddevs[cs->sc_unit].ccd_flags & CCDF_OLD;
int i, old_io = cs->sc_cflags & CCDF_OLD;
ccdstart(cs, bp)	struct ccd_softc *cs;	struct buf *bp;{	long bcount, rcount;	struct ccdbuf **cbpp, *cbp;	caddr_t addr;	daddr_t bn;	struct partition *pp;	int i, old_io = ccddevs[cs->sc_unit].ccd_flags & CCDF_OLD;#ifdef DEBUG	if (ccddebug & CCDB_FOLLOW)		printf("ccdstart(%p, %p)\n", cs, bp);#endif	/* Instrumentation. */	disk_busy(&cs->sc_dkdev);	/*	 * Translate the partition-relative block number to an absolute.	 */	bn = bp->b_blkno;	if (DISKPART(bp->b_dev) != RAW_PART) {		pp = &cs->sc_dkdev.dk_label->d_partitions[DISKPART(bp->b_dev)];		bn += pp->p_offset;	}	/*	 * Allocate component buffers	 */	cbpp = malloc(2 * cs->sc_nccdisks * sizeof(struct ccdbuf *), M_DEVBUF,	    M_WAITOK);	bzero(cbpp, 2 * cs->sc_nccdisks * sizeof(struct ccdbuf *));	addr = bp->b_data;	old_io = old_io || ((vaddr_t)addr & PAGE_MASK);	for (bcount = bp->b_bcount; bcount > 0; bcount -= rcount) {		rcount = ccdbuffer(cs, bp, bn, addr, bcount, cbpp, old_io);				/*		 * This is the old, slower, but less restrictive, mode of		 * operation.  It allows interleaves which are not multiples		 * of PAGE_SIZE and mirroring.		 */		if (old_io) {			if ((cbpp[0]->cb_buf.b_flags & B_READ) == 0)				cbpp[0]->cb_buf.b_vp->v_numoutput++;			VOP_STRATEGY(&cbpp[0]->cb_buf);			/*			 * Mirror requires additional write.			 */			if ((cs->sc_cflags & CCDF_MIRROR) &&			    ((cbpp[0]->cb_buf.b_flags & B_READ) == 0)) {				cbpp[1]->cb_buf.b_vp->v_numoutput++;				VOP_STRATEGY(&cbpp[1]->cb_buf);			}		}		bn += btodb(rcount);		addr += rcount;	}	/* The new leaner mode of operation */	if (!old_io)		/*		 * Fire off the requests		 */		for (i = 0; i < cs->sc_nccdisks; i++) {			cbp = cbpp[i];			if (cbp) {				if ((cbp->cb_buf.b_flags & B_READ) == 0)					cbp->cb_buf.b_vp->v_numoutput++;				VOP_STRATEGY(&cbp->cb_buf);			}		}	free(cbpp, M_DEVBUF);}