Lines Matching refs:cs
309 ccdinit(struct ccd_softc *cs, char **cpaths, struct vnode **vpp,
314 struct ccdgeom *ccg = &cs->sc_geom;
323 printf("%s: ccdinit\n", cs->sc_xname);
327 cs->sc_cinfo = kmem_alloc(cs->sc_nccdisks * sizeof(*cs->sc_cinfo),
331 cs->sc_size = 0;
339 for (ix = 0, path_alloced = 0; ix < cs->sc_nccdisks; ix++) {
340 ci = &cs->sc_cinfo[ix];
355 cs->sc_xname, error);
376 cs->sc_xname, ci->ci_path, error);
386 if (cs->sc_ileave > 1)
387 psize -= psize % cs->sc_ileave;
393 cs->sc_xname, ci->ci_path);
402 cs->sc_size += psize;
409 if ((cs->sc_ileave > 0) &&
410 (cs->sc_ileave < (maxsecsize / DEV_BSIZE))) {
414 cs->sc_xname, (maxsecsize / DEV_BSIZE));
424 if (cs->sc_flags & CCDF_UNIFORM) {
425 for (ci = cs->sc_cinfo;
426 ci < &cs->sc_cinfo[cs->sc_nccdisks]; ci++)
429 cs->sc_size = cs->sc_nccdisks * minsize;
435 ccdinterleave(cs);
444 ccg->ccg_ncylinders = cs->sc_size / ccg->ccg_nsectors;
446 dg = &cs->sc_dkdev.dk_geom;
448 dg->dg_secperunit = cs->sc_size;
454 if (cs->sc_ileave > 0)
456 "(%d block interleave)\n", cs->sc_xname,
457 cs->sc_nccdisks, (cs->sc_nccdisks != 0 ? "s" : ""),
458 cs->sc_ileave);
461 cs->sc_xname,
462 cs->sc_nccdisks, (cs->sc_nccdisks != 0 ? "s" : ""));
463 for (ix = 0; ix < cs->sc_nccdisks; ix++) {
464 ci = &cs->sc_cinfo[ix];
465 aprint_normal("%s: %s (%ju blocks)\n", cs->sc_xname,
468 aprint_normal("%s: total %ju blocks\n", cs->sc_xname, cs->sc_size);
473 cs->sc_zap = false;
475 cs, &cs->sc_thread, "%s", cs->sc_xname);
484 mutex_enter(cs->sc_iolock);
485 cs->sc_flags |= CCDF_INITED;
486 mutex_exit(cs->sc_iolock);
492 kmem_free(cs->sc_cinfo[ix].ci_path,
493 cs->sc_cinfo[ix].ci_pathlen);
495 kmem_free(cs->sc_cinfo, cs->sc_nccdisks * sizeof(struct ccdcinfo));
501 ccdinterleave(struct ccd_softc *cs)
511 printf("ccdinterleave(%p): ileave %d\n", cs, cs->sc_ileave);
517 size = (cs->sc_nccdisks + 1) * sizeof(struct ccdiinfo);
518 cs->sc_itable = kmem_zalloc(size, KM_SLEEP);
524 if (cs->sc_ileave == 0) {
526 ii = cs->sc_itable;
528 for (ix = 0; ix < cs->sc_nccdisks; ix++) {
536 bn += cs->sc_cinfo[ix].ci_size;
542 printiinfo(cs->sc_itable);
552 for (ii = cs->sc_itable; ; ii++) {
554 ii->ii_indexsz = sizeof(int) * cs->sc_nccdisks;
561 for (ci = cs->sc_cinfo;
562 ci < &cs->sc_cinfo[cs->sc_nccdisks]; ci++)
579 ii->ii_startblk = bn / cs->sc_ileave;
587 for (ci = cs->sc_cinfo;
588 ci < &cs->sc_cinfo[cs->sc_nccdisks]; ci++)
590 ii->ii_index[ix++] = ci - cs->sc_cinfo;
593 lbn = smallci->ci_size / cs->sc_ileave;
598 printiinfo(cs->sc_itable);
607 struct ccd_softc *cs;
615 if ((cs = ccdget(unit, 1)) == NULL)
618 mutex_enter(&cs->sc_dvlock);
620 lp = cs->sc_dkdev.dk_label;
631 if ((cs->sc_flags & (CCDF_INITED|CCDF_VLABEL)) == CCDF_INITED &&
632 cs->sc_dkdev.dk_openmask == 0)
637 if (((cs->sc_flags & CCDF_INITED) == 0) ||
648 cs->sc_dkdev.dk_copenmask |= pmask;
652 cs->sc_dkdev.dk_bopenmask |= pmask;
655 cs->sc_dkdev.dk_openmask =
656 cs->sc_dkdev.dk_copenmask | cs->sc_dkdev.dk_bopenmask;
659 mutex_exit(&cs->sc_dvlock);
668 struct ccd_softc *cs;
676 if ((cs = ccdget(unit, 0)) == NULL)
679 mutex_enter(&cs->sc_dvlock);
686 cs->sc_dkdev.dk_copenmask &= ~(1 << part);
690 cs->sc_dkdev.dk_bopenmask &= ~(1 << part);
693 cs->sc_dkdev.dk_openmask =
694 cs->sc_dkdev.dk_copenmask | cs->sc_dkdev.dk_bopenmask;
696 if (cs->sc_dkdev.dk_openmask == 0) {
697 if ((cs->sc_flags & CCDF_KLABEL) == 0)
698 cs->sc_flags &= ~CCDF_VLABEL;
701 mutex_exit(&cs->sc_dvlock);
709 struct ccd_softc *cs;
712 cs = cookie;
719 mutex_enter(cs->sc_iolock);
720 while (__predict_true(!cs->sc_zap)) {
721 bp = bufq_get(cs->sc_bufq);
724 cv_wait(&cs->sc_push, cs->sc_iolock);
731 error = ccdstart(cs, bp, PR_WAITOK);
733 mutex_enter(cs->sc_iolock);
735 cs->sc_thread = NULL;
736 mutex_exit(cs->sc_iolock);
748 struct ccd_softc *cs;
749 if ((cs = ccdget(unit, 0)) == NULL)
753 KASSERT(cs->sc_dkdev.dk_openmask != 0 ||
754 (cs->sc_flags & CCDF_RLABEL) != 0);
756 mutex_enter(cs->sc_iolock);
758 if (__predict_false((cs->sc_flags & CCDF_INITED) == 0)) {
759 mutex_exit(cs->sc_iolock);
770 if (ccdstart(cs, bp, PR_NOWAIT) != 0) {
772 bufq_put(cs->sc_bufq, bp);
773 cv_broadcast(&cs->sc_push);
774 mutex_exit(cs->sc_iolock);
779 ccdstart(struct ccd_softc *cs, struct buf *bp, int wait)
791 KASSERT(mutex_owned(cs->sc_iolock));
794 disk_busy(&cs->sc_dkdev);
798 printf("ccdstart(%s, %p)\n", cs->sc_xname, bp);
805 lp = cs->sc_dkdev.dk_label;
813 wlabel = cs->sc_flags & (CCDF_WLABEL|CCDF_LABELLING);
815 if (bounds_check_with_label(&cs->sc_dkdev, bp, wlabel) <= 0)
819 mutex_exit(cs->sc_iolock);
828 cbp = ccdbuffer(cs, bp, bn, addr, bcount, wait);
835 mutex_enter(cs->sc_iolock);
836 disk_unbusy(&cs->sc_dkdev, 0, 0);
859 disk_unbusy(&cs->sc_dkdev, 0, 0);
860 cv_broadcast(&cs->sc_stop);
861 cv_broadcast(&cs->sc_push);
862 mutex_exit(cs->sc_iolock);
872 ccdbuffer(struct ccd_softc *cs, struct buf *bp, daddr_t bn, void *addr,
884 cs, bp, bn, addr, bcount);
895 if (cs->sc_ileave == 0) {
899 for (ccdisk = 0, ci = &cs->sc_cinfo[ccdisk];
901 ccdisk++, ci = &cs->sc_cinfo[ccdisk])
912 cboff = cbn % cs->sc_ileave;
913 cbn /= cs->sc_ileave;
914 for (ii = cs->sc_itable; ii->ii_ndisk; ii++)
926 cbn *= cs->sc_ileave;
927 ci = &cs->sc_cinfo[ccdisk];
947 if (cs->sc_ileave == 0)
950 cbc = dbtob((u_int64_t)(cs->sc_ileave - cboff));
957 cbp->cb_sc = cs;
966 ci->ci_dev, (unsigned long) (ci-cs->sc_cinfo), cbp,
984 struct ccd_softc *cs = cbp->cb_sc;
1004 cs->sc_xname, bp->b_error, cbp->cb_comp);
1013 mutex_enter(cs->sc_iolock);
1023 disk_unbusy(&cs->sc_dkdev, (bp->b_bcount - bp->b_resid),
1025 if (!disk_isbusy(&cs->sc_dkdev)) {
1026 if (bufq_peek(cs->sc_bufq) != NULL) {
1027 cv_broadcast(&cs->sc_push);
1029 cv_broadcast(&cs->sc_stop);
1031 mutex_exit(cs->sc_iolock);
1034 mutex_exit(cs->sc_iolock);
1042 struct ccd_softc *cs;
1048 if ((cs = ccdget(unit, 0)) == NULL)
1052 if ((cs->sc_flags & CCDF_INITED) == 0)
1063 struct ccd_softc *cs;
1069 if ((cs = ccdget(unit, 0)) == NULL)
1073 if ((cs->sc_flags & CCDF_INITED) == 0)
1088 struct ccd_softc *cs;
1113 if ((cs = ccdget(unit, make)) == NULL)
1167 if ((cs->sc_flags & CCDF_INITED) == 0)
1171 error = disk_ioctl(&cs->sc_dkdev, dev, cmd, data, flag, l);
1180 mutex_enter(cs->sc_iolock);
1181 if (cs->sc_bufq != NULL)
1183 bufq_getstrategyname(cs->sc_bufq),
1187 mutex_exit(cs->sc_iolock);
1209 cs->sc_flags |= CCDF_LABELLING;
1211 error = setdisklabel(cs->sc_dkdev.dk_label,
1212 lp, 0, cs->sc_dkdev.dk_cpulabel);
1220 ccdstrategy, cs->sc_dkdev.dk_label,
1221 cs->sc_dkdev.dk_cpulabel);
1224 cs->sc_flags &= ~CCDF_LABELLING;
1230 cs->sc_flags |= CCDF_KLABEL;
1232 cs->sc_flags &= ~CCDF_KLABEL;
1237 cs->sc_flags |= CCDF_WLABEL;
1239 cs->sc_flags &= ~CCDF_WLABEL;
1243 ccdgetdefaultlabel(cs, (struct disklabel *)data);
1248 ccdgetdefaultlabel(cs, &newlabel);
1262 mutex_enter(&cs->sc_dvlock);
1267 if (cs->sc_flags & CCDF_INITED) {
1285 cs->sc_ileave = ccio->ccio_ileave;
1286 cs->sc_nccdisks = ccio->ccio_ndisks;
1287 cs->sc_flags = ccio->ccio_flags & CCDF_USERMASK;
1333 cs->sc_nccdisks = 0;
1340 disk_attach(&cs->sc_dkdev);
1341 bufq_alloc(&cs->sc_bufq, "fcfs", 0);
1346 if ((error = ccdinit(cs, cpp, vpp, l)) != 0) {
1352 disk_detach(&cs->sc_dkdev);
1353 mutex_exit(&cs->sc_dvlock);
1354 bufq_free(cs->sc_bufq);
1370 ccio->ccio_size = cs->sc_size;
1374 disk_set_info(NULL, &cs->sc_dkdev, NULL);
1377 mutex_exit(&cs->sc_dvlock);
1378 dkwedge_discover(&cs->sc_dkdev);
1389 if ((cs->sc_dkdev.dk_openmask & ~pmask) ||
1390 ((cs->sc_dkdev.dk_bopenmask & pmask) &&
1391 (cs->sc_dkdev.dk_copenmask & pmask))) {
1397 dkwedge_delall(&cs->sc_dkdev);
1400 mutex_enter(cs->sc_iolock);
1401 cs->sc_flags &= ~(CCDF_INITED|CCDF_VLABEL);
1402 cs->sc_zap = true;
1403 while (disk_isbusy(&cs->sc_dkdev) ||
1404 bufq_peek(cs->sc_bufq) != NULL ||
1405 cs->sc_thread != NULL) {
1406 cv_broadcast(&cs->sc_push);
1407 (void)cv_timedwait(&cs->sc_stop, cs->sc_iolock, hz);
1409 mutex_exit(cs->sc_iolock);
1416 for (i = 0; i < cs->sc_nccdisks; ++i) {
1425 cs->sc_cinfo[i].ci_vp);
1427 (void)vn_close(cs->sc_cinfo[i].ci_vp, FREAD|FWRITE,
1429 kmem_free(cs->sc_cinfo[i].ci_path,
1430 cs->sc_cinfo[i].ci_pathlen);
1433 if (cs->sc_nccdisks != 0) {
1435 for (i = 0; cs->sc_itable[i].ii_ndisk; ++i) {
1436 kmem_free(cs->sc_itable[i].ii_index,
1437 cs->sc_itable[i].ii_indexsz);
1440 kmem_free(cs->sc_cinfo, cs->sc_nccdisks *
1442 kmem_free(cs->sc_itable, (cs->sc_nccdisks + 1) *
1446 aprint_normal("%s: detached\n", cs->sc_xname);
1449 disk_detach(&cs->sc_dkdev);
1450 bufq_free(cs->sc_bufq);
1453 ccdput(cs);
1455 /* Don't break, otherwise cs is read again. */
1470 for (error = 0, i = 0; i < cs->sc_nccdisks; i++) {
1471 error = VOP_IOCTL(cs->sc_cinfo[i].ci_vp, cmd, &j,
1491 for (error = 0, i = 0; i < cs->sc_nccdisks; i++) {
1492 j = VOP_IOCTL(cs->sc_cinfo[i].ci_vp, cmd, data,
1505 mutex_exit(&cs->sc_dvlock);
1512 struct ccd_softc *cs;
1517 if ((cs = ccdget(unit, 0)) == NULL)
1520 if ((cs->sc_flags & CCDF_INITED) == 0)
1524 omask = cs->sc_dkdev.dk_openmask & (1 << part);
1525 lp = cs->sc_dkdev.dk_label;
1543 ccdgetdefaultlabel(struct ccd_softc *cs, struct disklabel *lp)
1545 struct ccdgeom *ccg = &cs->sc_geom;
1549 if (cs->sc_size > UINT32_MAX)
1552 lp->d_secperunit = cs->sc_size;
1573 lp->d_checksum = dkcksum(cs->sc_dkdev.dk_label);
1584 struct ccd_softc *cs;
1589 if ((cs = ccdget(unit, 0)) == NULL)
1591 lp = cs->sc_dkdev.dk_label;
1592 clp = cs->sc_dkdev.dk_cpulabel;
1593 KASSERT(mutex_owned(&cs->sc_dvlock));
1597 ccdgetdefaultlabel(cs, lp);
1602 cs->sc_flags |= CCDF_RLABEL;
1603 if ((cs->sc_flags & CCDF_NOLABEL) != 0)
1607 cs->sc_dkdev.dk_label, cs->sc_dkdev.dk_cpulabel);
1609 ccdmakedisklabel(cs);
1623 lp->d_secperunit != cs->sc_size :
1624 lp->d_secperunit > cs->sc_size)
1627 "the size of ccd (%ju)\n", cs->sc_xname,
1629 (uintmax_t)cs->sc_size);
1632 if (pp->p_offset + pp->p_size > cs->sc_size)
1635 cs->sc_xname, 'a' + i, (uintmax_t)cs->sc_size);
1643 printf("%s: %s\n", cs->sc_xname, errstring);
1647 cs->sc_flags = (cs->sc_flags | CCDF_VLABEL) & ~CCDF_RLABEL;
1655 ccdmakedisklabel(struct ccd_softc *cs)
1657 struct disklabel *lp = cs->sc_dkdev.dk_label;