char    type[4];
        char    model[3];
 };
-/*
- * This needs to be allocated since it is passed to the
- * Hypervisor and we may be a module.
- */
-static struct cdrom_info *viocd_unitinfo;
-static dma_addr_t unitinfo_dmaaddr;
 
 struct disk_info {
        struct gendisk                  *viocd_disk;
        struct cdrom_device_info        viocd_info;
        struct device                   *dev;
+       struct cdrom_info               unitinfo;
 };
 static struct disk_info viocd_diskinfo[VIOCD_MAX_CD];
 
        for (i = 0; i < viocd_numdev; i++) {
                seq_printf(m, "viocd device %d is iSeries resource %10.10s"
                                "type %4.4s, model %3.3s\n",
-                               i, viocd_unitinfo[i].rsrcname,
-                               viocd_unitinfo[i].type,
-                               viocd_unitinfo[i].model);
+                               i, viocd_diskinfo[i].unitinfo.rsrcname,
+                               viocd_diskinfo[i].unitinfo.type,
+                               viocd_diskinfo[i].unitinfo.model);
        }
        return 0;
 }
        HvLpEvent_Rc hvrc;
        int i;
        struct viocd_waitevent we;
+       struct cdrom_info *viocd_unitinfo;
+       dma_addr_t unitinfo_dmaaddr;
 
        viocd_unitinfo = dma_alloc_coherent(iSeries_vio_dev,
                        sizeof(*viocd_unitinfo) * VIOCD_MAX_CD,
                goto error_ret;
        }
 
-       for (i = 0; (i < VIOCD_MAX_CD) && viocd_unitinfo[i].rsrcname[0]; i++)
+       for (i = 0; (i < VIOCD_MAX_CD) && viocd_unitinfo[i].rsrcname[0]; i++) {
+               viocd_diskinfo[viocd_numdev].unitinfo = viocd_unitinfo[i];
                viocd_numdev++;
+       }
 
 error_ret:
-       if (viocd_numdev == 0) {
-               dma_free_coherent(iSeries_vio_dev,
-                               sizeof(*viocd_unitinfo) * VIOCD_MAX_CD,
-                               viocd_unitinfo, unitinfo_dmaaddr);
-               viocd_unitinfo = NULL;
-       }
+       dma_free_coherent(iSeries_vio_dev,
+                       sizeof(*viocd_unitinfo) * VIOCD_MAX_CD,
+                       viocd_unitinfo, unitinfo_dmaaddr);
 }
 
 static int viocd_open(struct cdrom_device_info *cdi, int purpose)
 
        d = &viocd_diskinfo[deviceno];
        c = &d->viocd_info;
-       ci = &viocd_unitinfo[deviceno];
+       ci = &d->unitinfo;
 
        c->ops = &viocd_dops;
        c->speed = 4;
        return 0;
 
 out_free_info:
-       dma_free_coherent(iSeries_vio_dev,
-                       sizeof(*viocd_unitinfo) * VIOCD_MAX_CD,
-                       viocd_unitinfo, unitinfo_dmaaddr);
        vio_clearHandler(viomajorsubtype_cdio);
        viopath_close(viopath_hostLp, viomajorsubtype_cdio, MAX_CD_REQ + 2);
 out_unregister:
 {
        remove_proc_entry("iSeries/viocd", NULL);
        vio_unregister_driver(&viocd_driver);
-       if (viocd_unitinfo != NULL)
-               dma_free_coherent(iSeries_vio_dev,
-                               sizeof(*viocd_unitinfo) * VIOCD_MAX_CD,
-                               viocd_unitinfo, unitinfo_dmaaddr);
        viopath_close(viopath_hostLp, viomajorsubtype_cdio, MAX_CD_REQ + 2);
        vio_clearHandler(viomajorsubtype_cdio);
        unregister_blkdev(VIOCD_MAJOR, VIOCD_DEVICE);