Lines Matching refs:cs

309 ccdinit(struct ccd_softc *cs, char **cpaths, struct vnode **vpp,  in ccdinit()  argument
314 struct ccdgeom *ccg = &cs->sc_geom; in ccdinit()
323 printf("%s: ccdinit\n", cs->sc_xname); in ccdinit()
327 cs->sc_cinfo = kmem_alloc(cs->sc_nccdisks * sizeof(*cs->sc_cinfo), in ccdinit()
331 cs->sc_size = 0; in ccdinit()
339 for (ix = 0, path_alloced = 0; ix < cs->sc_nccdisks; ix++) { in ccdinit()
340 ci = &cs->sc_cinfo[ix]; in ccdinit()
355 cs->sc_xname, error); in ccdinit()
376 cs->sc_xname, ci->ci_path, error); in ccdinit()
386 if (cs->sc_ileave > 1) in ccdinit()
387 psize -= psize % cs->sc_ileave; in ccdinit()
393 cs->sc_xname, ci->ci_path); in ccdinit()
402 cs->sc_size += psize; in ccdinit()
409 if ((cs->sc_ileave > 0) && in ccdinit()
410 (cs->sc_ileave < (maxsecsize / DEV_BSIZE))) { in ccdinit()
414 cs->sc_xname, (maxsecsize / DEV_BSIZE)); in ccdinit()
424 if (cs->sc_flags & CCDF_UNIFORM) { in ccdinit()
425 for (ci = cs->sc_cinfo; in ccdinit()
426 ci < &cs->sc_cinfo[cs->sc_nccdisks]; ci++) in ccdinit()
429 cs->sc_size = cs->sc_nccdisks * minsize; in ccdinit()
435 ccdinterleave(cs); in ccdinit()
444 ccg->ccg_ncylinders = cs->sc_size / ccg->ccg_nsectors; in ccdinit()
446 dg = &cs->sc_dkdev.dk_geom; in ccdinit()
448 dg->dg_secperunit = cs->sc_size; in ccdinit()
454 if (cs->sc_ileave > 0) in ccdinit()
456 "(%d block interleave)\n", cs->sc_xname, in ccdinit()
457 cs->sc_nccdisks, (cs->sc_nccdisks != 0 ? "s" : ""), in ccdinit()
458 cs->sc_ileave); in ccdinit()
461 cs->sc_xname, in ccdinit()
462 cs->sc_nccdisks, (cs->sc_nccdisks != 0 ? "s" : "")); in ccdinit()
463 for (ix = 0; ix < cs->sc_nccdisks; ix++) { in ccdinit()
464 ci = &cs->sc_cinfo[ix]; in ccdinit()
465 aprint_normal("%s: %s (%ju blocks)\n", cs->sc_xname, in ccdinit()
468 aprint_normal("%s: total %ju blocks\n", cs->sc_xname, cs->sc_size); in ccdinit()
473 cs->sc_zap = false; in ccdinit()
475 cs, &cs->sc_thread, "%s", cs->sc_xname); in ccdinit()
484 mutex_enter(cs->sc_iolock); in ccdinit()
485 cs->sc_flags |= CCDF_INITED; in ccdinit()
486 mutex_exit(cs->sc_iolock); in ccdinit()
492 kmem_free(cs->sc_cinfo[ix].ci_path, in ccdinit()
493 cs->sc_cinfo[ix].ci_pathlen); in ccdinit()
495 kmem_free(cs->sc_cinfo, cs->sc_nccdisks * sizeof(struct ccdcinfo)); in ccdinit()
501 ccdinterleave(struct ccd_softc *cs) in ccdinterleave() argument
511 printf("ccdinterleave(%p): ileave %d\n", cs, cs->sc_ileave); in ccdinterleave()
517 size = (cs->sc_nccdisks + 1) * sizeof(struct ccdiinfo); in ccdinterleave()
518 cs->sc_itable = kmem_zalloc(size, KM_SLEEP); in ccdinterleave()
524 if (cs->sc_ileave == 0) { in ccdinterleave()
526 ii = cs->sc_itable; in ccdinterleave()
528 for (ix = 0; ix < cs->sc_nccdisks; ix++) { in ccdinterleave()
536 bn += cs->sc_cinfo[ix].ci_size; in ccdinterleave()
542 printiinfo(cs->sc_itable); in ccdinterleave()
552 for (ii = cs->sc_itable; ; ii++) { in ccdinterleave()
554 ii->ii_indexsz = sizeof(int) * cs->sc_nccdisks; in ccdinterleave()
561 for (ci = cs->sc_cinfo; in ccdinterleave()
562 ci < &cs->sc_cinfo[cs->sc_nccdisks]; ci++) in ccdinterleave()
579 ii->ii_startblk = bn / cs->sc_ileave; in ccdinterleave()
587 for (ci = cs->sc_cinfo; in ccdinterleave()
588 ci < &cs->sc_cinfo[cs->sc_nccdisks]; ci++) in ccdinterleave()
590 ii->ii_index[ix++] = ci - cs->sc_cinfo; in ccdinterleave()
593 lbn = smallci->ci_size / cs->sc_ileave; in ccdinterleave()
598 printiinfo(cs->sc_itable); in ccdinterleave()
607 struct ccd_softc *cs; in ccdopen() local
615 if ((cs = ccdget(unit, 1)) == NULL) in ccdopen()
618 mutex_enter(&cs->sc_dvlock); in ccdopen()
620 lp = cs->sc_dkdev.dk_label; in ccdopen()
631 if ((cs->sc_flags & (CCDF_INITED|CCDF_VLABEL)) == CCDF_INITED && in ccdopen()
632 cs->sc_dkdev.dk_openmask == 0) in ccdopen()
637 if (((cs->sc_flags & CCDF_INITED) == 0) || in ccdopen()
648 cs->sc_dkdev.dk_copenmask |= pmask; in ccdopen()
652 cs->sc_dkdev.dk_bopenmask |= pmask; in ccdopen()
655 cs->sc_dkdev.dk_openmask = in ccdopen()
656 cs->sc_dkdev.dk_copenmask | cs->sc_dkdev.dk_bopenmask; in ccdopen()
659 mutex_exit(&cs->sc_dvlock); in ccdopen()
668 struct ccd_softc *cs; in ccdclose() local
676 if ((cs = ccdget(unit, 0)) == NULL) in ccdclose()
679 mutex_enter(&cs->sc_dvlock); in ccdclose()
686 cs->sc_dkdev.dk_copenmask &= ~(1 << part); in ccdclose()
690 cs->sc_dkdev.dk_bopenmask &= ~(1 << part); in ccdclose()
693 cs->sc_dkdev.dk_openmask = in ccdclose()
694 cs->sc_dkdev.dk_copenmask | cs->sc_dkdev.dk_bopenmask; in ccdclose()
696 if (cs->sc_dkdev.dk_openmask == 0) { in ccdclose()
697 if ((cs->sc_flags & CCDF_KLABEL) == 0) in ccdclose()
698 cs->sc_flags &= ~CCDF_VLABEL; in ccdclose()
701 mutex_exit(&cs->sc_dvlock); in ccdclose()
706 ccdbackoff(struct ccd_softc *cs) in ccdbackoff() argument
711 disk_isbusy(&cs->sc_dkdev); in ccdbackoff()
717 struct ccd_softc *cs; in ccdthread() local
719 cs = cookie; in ccdthread()
726 mutex_enter(cs->sc_iolock); in ccdthread()
727 while (__predict_true(!cs->sc_zap)) { in ccdthread()
728 if (bufq_peek(cs->sc_bufq) == NULL) { in ccdthread()
730 cv_wait(&cs->sc_push, cs->sc_iolock); in ccdthread()
733 if (ccdbackoff(cs)) { in ccdthread()
735 (void)cv_timedwait(&cs->sc_push, cs->sc_iolock, 1); in ccdthread()
742 ccdstart(cs); in ccdthread()
743 mutex_enter(cs->sc_iolock); in ccdthread()
745 cs->sc_thread = NULL; in ccdthread()
746 mutex_exit(cs->sc_iolock); in ccdthread()
758 struct ccd_softc *cs; in ccdstrategy() local
759 if ((cs = ccdget(unit, 0)) == NULL) in ccdstrategy()
763 KASSERT(cs->sc_dkdev.dk_openmask != 0 || in ccdstrategy()
764 (cs->sc_flags & CCDF_RLABEL) != 0); in ccdstrategy()
766 mutex_enter(cs->sc_iolock); in ccdstrategy()
768 if (__predict_false((cs->sc_flags & CCDF_INITED) == 0)) { in ccdstrategy()
769 mutex_exit(cs->sc_iolock); in ccdstrategy()
781 bufq_put(cs->sc_bufq, bp); in ccdstrategy()
782 if (__predict_false(ccdbackoff(cs))) { in ccdstrategy()
783 mutex_exit(cs->sc_iolock); in ccdstrategy()
790 ccdstart(cs); in ccdstrategy()
794 ccdstart(struct ccd_softc *cs) in ccdstart() argument
806 KASSERT(mutex_owned(cs->sc_iolock)); in ccdstart()
808 bp = bufq_get(cs->sc_bufq); in ccdstart()
811 disk_busy(&cs->sc_dkdev); in ccdstart()
815 printf("ccdstart(%s, %p)\n", cs->sc_xname, bp); in ccdstart()
822 lp = cs->sc_dkdev.dk_label; in ccdstart()
830 wlabel = cs->sc_flags & (CCDF_WLABEL|CCDF_LABELLING); in ccdstart()
832 if (bounds_check_with_label(&cs->sc_dkdev, bp, wlabel) <= 0) in ccdstart()
836 mutex_exit(cs->sc_iolock); in ccdstart()
844 cbp = ccdbuffer(cs, bp, bn, addr, bcount); in ccdstart()
859 disk_unbusy(&cs->sc_dkdev, 0, 0); in ccdstart()
860 cv_broadcast(&cs->sc_stop); in ccdstart()
861 cv_broadcast(&cs->sc_push); in ccdstart()
862 mutex_exit(cs->sc_iolock); in ccdstart()
871 ccdbuffer(struct ccd_softc *cs, struct buf *bp, daddr_t bn, void *addr, in ccdbuffer() argument
883 cs, bp, bn, addr, bcount); in ccdbuffer()
894 if (cs->sc_ileave == 0) { in ccdbuffer()
898 for (ccdisk = 0, ci = &cs->sc_cinfo[ccdisk]; in ccdbuffer()
900 ccdisk++, ci = &cs->sc_cinfo[ccdisk]) in ccdbuffer()
911 cboff = cbn % cs->sc_ileave; in ccdbuffer()
912 cbn /= cs->sc_ileave; in ccdbuffer()
913 for (ii = cs->sc_itable; ii->ii_ndisk; ii++) in ccdbuffer()
925 cbn *= cs->sc_ileave; in ccdbuffer()
926 ci = &cs->sc_cinfo[ccdisk]; in ccdbuffer()
945 if (cs->sc_ileave == 0) in ccdbuffer()
948 cbc = dbtob((u_int64_t)(cs->sc_ileave - cboff)); in ccdbuffer()
955 cbp->cb_sc = cs; in ccdbuffer()
964 ci->ci_dev, (unsigned long) (ci-cs->sc_cinfo), cbp, in ccdbuffer()
982 struct ccd_softc *cs = cbp->cb_sc; in ccdiodone() local
1002 cs->sc_xname, bp->b_error, cbp->cb_comp); in ccdiodone()
1011 mutex_enter(cs->sc_iolock); in ccdiodone()
1021 disk_unbusy(&cs->sc_dkdev, (bp->b_bcount - bp->b_resid), in ccdiodone()
1023 if (!disk_isbusy(&cs->sc_dkdev)) { in ccdiodone()
1024 if (bufq_peek(cs->sc_bufq) != NULL) { in ccdiodone()
1025 cv_broadcast(&cs->sc_push); in ccdiodone()
1027 cv_broadcast(&cs->sc_stop); in ccdiodone()
1029 mutex_exit(cs->sc_iolock); in ccdiodone()
1032 mutex_exit(cs->sc_iolock); in ccdiodone()
1040 struct ccd_softc *cs; in ccdread() local
1046 if ((cs = ccdget(unit, 0)) == NULL) in ccdread()
1050 if ((cs->sc_flags & CCDF_INITED) == 0) in ccdread()
1061 struct ccd_softc *cs; in ccdwrite() local
1067 if ((cs = ccdget(unit, 0)) == NULL) in ccdwrite()
1071 if ((cs->sc_flags & CCDF_INITED) == 0) in ccdwrite()
1086 struct ccd_softc *cs; in ccdioctl() local
1111 if ((cs = ccdget(unit, make)) == NULL) in ccdioctl()
1165 if ((cs->sc_flags & CCDF_INITED) == 0) in ccdioctl()
1169 error = disk_ioctl(&cs->sc_dkdev, dev, cmd, data, flag, l); in ccdioctl()
1178 mutex_enter(cs->sc_iolock); in ccdioctl()
1179 if (cs->sc_bufq != NULL) in ccdioctl()
1181 bufq_getstrategyname(cs->sc_bufq), in ccdioctl()
1185 mutex_exit(cs->sc_iolock); in ccdioctl()
1207 cs->sc_flags |= CCDF_LABELLING; in ccdioctl()
1209 error = setdisklabel(cs->sc_dkdev.dk_label, in ccdioctl()
1210 lp, 0, cs->sc_dkdev.dk_cpulabel); in ccdioctl()
1218 ccdstrategy, cs->sc_dkdev.dk_label, in ccdioctl()
1219 cs->sc_dkdev.dk_cpulabel); in ccdioctl()
1222 cs->sc_flags &= ~CCDF_LABELLING; in ccdioctl()
1228 cs->sc_flags |= CCDF_KLABEL; in ccdioctl()
1230 cs->sc_flags &= ~CCDF_KLABEL; in ccdioctl()
1235 cs->sc_flags |= CCDF_WLABEL; in ccdioctl()
1237 cs->sc_flags &= ~CCDF_WLABEL; in ccdioctl()
1241 ccdgetdefaultlabel(cs, (struct disklabel *)data); in ccdioctl()
1246 ccdgetdefaultlabel(cs, &newlabel); in ccdioctl()
1260 mutex_enter(&cs->sc_dvlock); in ccdioctl()
1265 if (cs->sc_flags & CCDF_INITED) { in ccdioctl()
1283 cs->sc_ileave = ccio->ccio_ileave; in ccdioctl()
1284 cs->sc_nccdisks = ccio->ccio_ndisks; in ccdioctl()
1285 cs->sc_flags = ccio->ccio_flags & CCDF_USERMASK; in ccdioctl()
1331 cs->sc_nccdisks = 0; in ccdioctl()
1338 disk_attach(&cs->sc_dkdev); in ccdioctl()
1339 bufq_alloc(&cs->sc_bufq, "fcfs", 0); in ccdioctl()
1344 if ((error = ccdinit(cs, cpp, vpp, l)) != 0) { in ccdioctl()
1350 disk_detach(&cs->sc_dkdev); in ccdioctl()
1351 mutex_exit(&cs->sc_dvlock); in ccdioctl()
1352 bufq_free(cs->sc_bufq); in ccdioctl()
1368 ccio->ccio_size = cs->sc_size; in ccdioctl()
1372 disk_set_info(NULL, &cs->sc_dkdev, NULL); in ccdioctl()
1375 mutex_exit(&cs->sc_dvlock); in ccdioctl()
1376 dkwedge_discover(&cs->sc_dkdev); in ccdioctl()
1387 if ((cs->sc_dkdev.dk_openmask & ~pmask) || in ccdioctl()
1388 ((cs->sc_dkdev.dk_bopenmask & pmask) && in ccdioctl()
1389 (cs->sc_dkdev.dk_copenmask & pmask))) { in ccdioctl()
1395 dkwedge_delall(&cs->sc_dkdev); in ccdioctl()
1398 mutex_enter(cs->sc_iolock); in ccdioctl()
1399 cs->sc_flags &= ~(CCDF_INITED|CCDF_VLABEL); in ccdioctl()
1400 cs->sc_zap = true; in ccdioctl()
1401 while (disk_isbusy(&cs->sc_dkdev) || in ccdioctl()
1402 bufq_peek(cs->sc_bufq) != NULL || in ccdioctl()
1403 cs->sc_thread != NULL) { in ccdioctl()
1404 cv_broadcast(&cs->sc_push); in ccdioctl()
1405 (void)cv_timedwait(&cs->sc_stop, cs->sc_iolock, hz); in ccdioctl()
1407 mutex_exit(cs->sc_iolock); in ccdioctl()
1414 for (i = 0; i < cs->sc_nccdisks; ++i) { in ccdioctl()
1423 cs->sc_cinfo[i].ci_vp); in ccdioctl()
1425 (void)vn_close(cs->sc_cinfo[i].ci_vp, FREAD|FWRITE, in ccdioctl()
1427 kmem_free(cs->sc_cinfo[i].ci_path, in ccdioctl()
1428 cs->sc_cinfo[i].ci_pathlen); in ccdioctl()
1431 if (cs->sc_nccdisks != 0) { in ccdioctl()
1433 for (i = 0; cs->sc_itable[i].ii_ndisk; ++i) { in ccdioctl()
1434 kmem_free(cs->sc_itable[i].ii_index, in ccdioctl()
1435 cs->sc_itable[i].ii_indexsz); in ccdioctl()
1438 kmem_free(cs->sc_cinfo, cs->sc_nccdisks * in ccdioctl()
1440 kmem_free(cs->sc_itable, (cs->sc_nccdisks + 1) * in ccdioctl()
1444 aprint_normal("%s: detached\n", cs->sc_xname); in ccdioctl()
1447 disk_detach(&cs->sc_dkdev); in ccdioctl()
1448 bufq_free(cs->sc_bufq); in ccdioctl()
1451 ccdput(cs); in ccdioctl()
1468 for (error = 0, i = 0; i < cs->sc_nccdisks; i++) { in ccdioctl()
1469 error = VOP_IOCTL(cs->sc_cinfo[i].ci_vp, cmd, &j, in ccdioctl()
1489 for (error = 0, i = 0; i < cs->sc_nccdisks; i++) { in ccdioctl()
1490 j = VOP_IOCTL(cs->sc_cinfo[i].ci_vp, cmd, data, in ccdioctl()
1503 mutex_exit(&cs->sc_dvlock); in ccdioctl()
1510 struct ccd_softc *cs; in ccdsize() local
1515 if ((cs = ccdget(unit, 0)) == NULL) in ccdsize()
1518 if ((cs->sc_flags & CCDF_INITED) == 0) in ccdsize()
1522 omask = cs->sc_dkdev.dk_openmask & (1 << part); in ccdsize()
1523 lp = cs->sc_dkdev.dk_label; in ccdsize()
1541 ccdgetdefaultlabel(struct ccd_softc *cs, struct disklabel *lp) in ccdgetdefaultlabel() argument
1543 struct ccdgeom *ccg = &cs->sc_geom; in ccdgetdefaultlabel()
1547 if (cs->sc_size > UINT32_MAX) in ccdgetdefaultlabel()
1550 lp->d_secperunit = cs->sc_size; in ccdgetdefaultlabel()
1571 lp->d_checksum = dkcksum(cs->sc_dkdev.dk_label); in ccdgetdefaultlabel()
1582 struct ccd_softc *cs; in ccdgetdisklabel() local
1587 if ((cs = ccdget(unit, 0)) == NULL) in ccdgetdisklabel()
1589 lp = cs->sc_dkdev.dk_label; in ccdgetdisklabel()
1590 clp = cs->sc_dkdev.dk_cpulabel; in ccdgetdisklabel()
1591 KASSERT(mutex_owned(&cs->sc_dvlock)); in ccdgetdisklabel()
1595 ccdgetdefaultlabel(cs, lp); in ccdgetdisklabel()
1600 cs->sc_flags |= CCDF_RLABEL; in ccdgetdisklabel()
1601 if ((cs->sc_flags & CCDF_NOLABEL) != 0) in ccdgetdisklabel()
1605 cs->sc_dkdev.dk_label, cs->sc_dkdev.dk_cpulabel); in ccdgetdisklabel()
1607 ccdmakedisklabel(cs); in ccdgetdisklabel()
1621 lp->d_secperunit != cs->sc_size : in ccdgetdisklabel()
1622 lp->d_secperunit > cs->sc_size) in ccdgetdisklabel()
1625 "the size of ccd (%ju)\n", cs->sc_xname, in ccdgetdisklabel()
1627 (uintmax_t)cs->sc_size); in ccdgetdisklabel()
1630 if (pp->p_offset + pp->p_size > cs->sc_size) in ccdgetdisklabel()
1633 cs->sc_xname, 'a' + i, (uintmax_t)cs->sc_size); in ccdgetdisklabel()
1641 printf("%s: %s\n", cs->sc_xname, errstring); in ccdgetdisklabel()
1645 cs->sc_flags = (cs->sc_flags | CCDF_VLABEL) & ~CCDF_RLABEL; in ccdgetdisklabel()
1653 ccdmakedisklabel(struct ccd_softc *cs) in ccdmakedisklabel() argument
1655 struct disklabel *lp = cs->sc_dkdev.dk_label; in ccdmakedisklabel()