void vndattach(int num) { char *mem; int i; if (num <= 0) return; mem = mallocarray(num, sizeof(struct vnd_softc), M_DEVBUF, M_NOWAIT | M_ZERO); if (mem == NULL) { printf("WARNING: no memory for vnode disks\n"); return; } vnd_softc = (struct vnd_softc *)mem; for (i = 0; i < num; i++) { struct vnd_softc *sc = &vnd_softc[i]; sc->sc_dev.dv_unit = i; snprintf(sc->sc_dev.dv_xname, sizeof(sc->sc_dev.dv_xname), "vnd%d", i); disk_construct(&sc->sc_dk); device_ref(&sc->sc_dev); } numvnd = num; }
struct vldcp_softc * vldcp_lookup(dev_t dev) { struct vldcp_softc *sc = NULL; if (minor(dev) < nitems(vldc_svc)) sc = vldc_svc[minor(dev)].vs_sc; if (sc) device_ref(&sc->sc_dv); return (sc); }
void rdattach(int num) { static struct cfdata cf; /* Fake cf. */ struct rd_softc *sc; int i; /* There's only one rd_root_image, so only attach one rd. */ num = 1; /* XXX: Fake up more? */ cf.cf_attach = &rd_ca; cf.cf_driver = &rd_cd; rd_cd.cd_ndevs = num; rd_cd.cd_devs = malloc(num * sizeof(void *), M_DEVBUF, M_NOWAIT); if (rd_cd.cd_devs == NULL) panic("rdattach: out of memory"); for (i = 0; i < num; ++i) { /* Allocate the softc and initialize it. */ sc = malloc(sizeof(*sc), M_DEVBUF, M_NOWAIT|M_ZERO); if (sc == NULL) panic("rdattach: out of memory"); sc->sc_dev.dv_class = DV_DISK; sc->sc_dev.dv_cfdata = &cf; sc->sc_dev.dv_flags = DVF_ACTIVE; sc->sc_dev.dv_unit = i; if (snprintf(sc->sc_dev.dv_xname, sizeof(sc->sc_dev.dv_xname), "rd%d", i) >= sizeof(sc->sc_dev.dv_xname)) panic("rdattach: device name too long"); sc->sc_dev.dv_ref = 1; /* Attach it to the device tree. */ rd_cd.cd_devs[i] = sc; TAILQ_INSERT_TAIL(&alldevs, &sc->sc_dev, dv_list); device_ref(&sc->sc_dev); /* Finish initializing. */ rd_attach(NULL, &sc->sc_dev, NULL); } }