|
|
| version 1.9, 2004/05/13 23:49:15 | version 1.10, 2004/05/19 22:52:42 |
|---|---|
| Line 180 vnfindvn(dev_t dev) | Line 180 vnfindvn(dev_t dev) |
| struct vn_softc *vn; | struct vn_softc *vn; |
| unit = dkunit(dev); | unit = dkunit(dev); |
| vn = dev->si_drv1; | SLIST_FOREACH(vn, &vn_list, sc_list) { |
| if (!vn) { | if (vn->sc_unit == unit) { |
| SLIST_FOREACH(vn, &vn_list, sc_list) { | dev->si_drv2 = vn->sc_devlist; |
| if (vn->sc_unit == unit) { | vn->sc_devlist = dev; |
| dev->si_drv2 = vn->sc_devlist; | reference_dev(dev); |
| vn->sc_devlist = dev; | dev->si_drv1 = vn; |
| dev->si_drv1 = vn; | break; |
| break; | |
| } | |
| } | } |
| } | } |
| if (!vn) { | if (vn == NULL) { |
| vn = malloc(sizeof *vn, M_DEVBUF, M_WAITOK); | vn = malloc(sizeof *vn, M_DEVBUF, M_WAITOK | M_ZERO); |
| if (!vn) | |
| return (NULL); | |
| bzero(vn, sizeof *vn); | |
| vn->sc_unit = unit; | vn->sc_unit = unit; |
| dev->si_drv1 = vn; | dev->si_drv1 = vn; |
| vn->sc_devlist = make_dev(&vn_cdevsw, 0, | vn->sc_devlist = make_dev(&vn_cdevsw, 0, UID_ROOT, |
| UID_ROOT, GID_OPERATOR, 0640, "vn%d", unit); | GID_OPERATOR, 0640, "vn%d", unit); |
| reference_dev(vn->sc_devlist); | |
| vn->sc_devlist->si_drv1 = vn; | vn->sc_devlist->si_drv1 = vn; |
| vn->sc_devlist->si_drv2 = NULL; | vn->sc_devlist->si_drv2 = NULL; |
| if (vn->sc_devlist != dev) { | if (vn->sc_devlist != dev) { |
| dev->si_drv1 = vn; | |
| dev->si_drv2 = vn->sc_devlist; | dev->si_drv2 = vn->sc_devlist; |
| vn->sc_devlist = dev; | vn->sc_devlist = dev; |
| reference_dev(dev); | |
| } | } |
| SLIST_INSERT_HEAD(&vn_list, vn, sc_list); | SLIST_INSERT_HEAD(&vn_list, vn, sc_list); |
| } | } |
| Line 293 vnstrategy(struct buf *bp) | Line 291 vnstrategy(struct buf *bp) |
| int error; | int error; |
| unit = dkunit(bp->b_dev); | unit = dkunit(bp->b_dev); |
| vn = bp->b_dev->si_drv1; | if ((vn = bp->b_dev->si_drv1) == NULL) |
| if (!vn) | |
| vn = vnfindvn(bp->b_dev); | vn = vnfindvn(bp->b_dev); |
| IFOPT(vn, VN_DEBUG) | IFOPT(vn, VN_DEBUG) |
| Line 772 vn_modevent(module_t mod, int type, void | Line 769 vn_modevent(module_t mod, int type, void |
| switch (type) { | switch (type) { |
| case MOD_LOAD: | case MOD_LOAD: |
| cdevsw_add(&vn_cdevsw); | cdevsw_add(&vn_cdevsw, 0, 0); |
| break; | break; |
| case MOD_UNLOAD: | case MOD_UNLOAD: |
| /* fall through */ | /* fall through */ |
| case MOD_SHUTDOWN: | case MOD_SHUTDOWN: |
| Line 789 vn_modevent(module_t mod, int type, void | Line 785 vn_modevent(module_t mod, int type, void |
| while ((dev = vn->sc_devlist) != NULL) { | while ((dev = vn->sc_devlist) != NULL) { |
| vn->sc_devlist = dev->si_drv2; | vn->sc_devlist = dev->si_drv2; |
| dev->si_drv1 = dev->si_drv2 = NULL; | dev->si_drv1 = dev->si_drv2 = NULL; |
| /* If the last one, destroy it. */ | destroy_dev(dev); |
| if (vn->sc_devlist == NULL) | |
| destroy_dev(dev); | |
| } | } |
| free(vn, M_DEVBUF); | free(vn, M_DEVBUF); |
| } | } |
| cdevsw_remove(&vn_cdevsw); | cdevsw_remove(&vn_cdevsw, -1, 0); |
| break; | break; |
| default: | default: |
| break; | break; |