Diff for /src/sys/dev/disk/vn/vn.c between versions 1.9 and 1.10

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;

Removed from v.1.9  
changed lines
  Added in v.1.10