Add code for creating multiple virtual disks. Multiple -r options
authorSascha Wildner <swildner@dragonflybsd.org>
Fri, 16 Mar 2007 13:41:40 +0000 (13:41 +0000)
committerSascha Wildner <swildner@dragonflybsd.org>
Fri, 16 Mar 2007 13:41:40 +0000 (13:41 +0000)
can now be passed to the vkernel with the first one specifying the
root device.

Submitted-by: Chris Turner <c.turner@199technologies.org>
sys/dev/virtual/disk/vdisk.c
sys/platform/vkernel/include/md_var.h
sys/platform/vkernel/platform/init.c

index d09bfe5..fc4ec06 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/dev/virtual/disk/vdisk.c,v 1.2 2007/01/09 18:26:56 dillon Exp $
+ * $DragonFly: src/sys/dev/virtual/disk/vdisk.c,v 1.3 2007/03/16 13:41:40 swildner Exp $
  */
 
 /*
@@ -63,8 +63,6 @@ struct vkd_softc {
        int fd;
 };
 
-
-
 #define CDEV_MAJOR     97
 
 static d_strategy_t    vkdstrategy;
@@ -82,32 +80,46 @@ static struct dev_ops vkd_ops = {
 static void
 vkdinit(void *dummy __unused)
 {
+       struct vkdisk_info *dsk;
        struct vkd_softc *sc;
        struct stat st;
+       int i;
+
+       KASSERT(DiskNum <= VKDISK_MAX, ("too many disks: %d\n", DiskNum));
+       
+       for (i = 0; i < DiskNum; i++) {
+
+               /* check that the 'bus device' has been initialized */
+               dsk = &DiskInfo[i];
+               if (dsk == NULL)
+                       continue;
+               if (dsk->fd < 0 || fstat(dsk->fd, &st) < 0)
+                       continue;
+
+               /* and create a new device */
+               sc = kmalloc(sizeof(*sc), M_DEVBUF, M_WAITOK | M_ZERO);
+               sc->unit = dsk->unit;
+               sc->fd = dsk->fd;
+               bioq_init(&sc->bio_queue);
+               devstat_add_entry(&sc->stats, "vkd", sc->unit, DEV_BSIZE,
+                                 DEVSTAT_NO_ORDERED_TAGS,
+                                 DEVSTAT_TYPE_DIRECT | DEVSTAT_TYPE_IF_OTHER,
+                                 DEVSTAT_PRIORITY_DISK);
+               sc->dev = disk_create(sc->unit, &sc->disk, 0, &vkd_ops);
+               sc->dev->si_drv1 = sc;
+               sc->dev->si_iosize_max = 256 * 1024;
 
-       if (RootImageFd < 0 || fstat(RootImageFd, &st) < 0)
-               return;
-
-       sc = kmalloc(sizeof(*sc), M_DEVBUF, M_WAITOK|M_ZERO);
-       sc->unit = 0;
-       sc->fd = RootImageFd;
-       bioq_init(&sc->bio_queue);
-       devstat_add_entry(&sc->stats, "vkd", sc->unit, DEV_BSIZE,
-                         DEVSTAT_NO_ORDERED_TAGS,
-                         DEVSTAT_TYPE_DIRECT | DEVSTAT_TYPE_IF_OTHER,
-                         DEVSTAT_PRIORITY_DISK);
-       sc->dev = disk_create(sc->unit, &sc->disk, 0, &vkd_ops);
-       sc->dev->si_drv1 = sc;
-       sc->dev->si_iosize_max = 256 * 1024;
 #if 0
-       dl = &sc->disk.d_label;
-       bzero(dl, sizeof(*dl));
-       dl->d_secsize = DEV_BSIZE;
-       dl->d_nsectors = st.st_size / dl->d_secsize;
-       dl->d_ntracks = 1;
-       dl->d_secpercyl = dl->d_nsectors;
-       dl->d_ncylinders = 1;
+               dl = &sc->disk.d_label;
+               bzero(dl, sizeof(*dl));
+               dl->d_secsize = DEV_BSIZE;
+               dl->d_nsectors = st.st_size / dl->d_secsize;
+               dl->d_ntracks = 1;
+               dl->d_secpercyl = dl->d_nsectors;
+               dl->d_ncylinders = 1;
 #endif
+
+       }
 }
 
 SYSINIT(vkdisk, SI_SUB_DRIVERS, SI_ORDER_FIRST, vkdinit, NULL);
@@ -122,8 +134,6 @@ vkdopen(struct dev_open_args *ap)
 
        dev = ap->a_head.a_dev;
        sc = dev->si_drv1;
-       if (sc->unit != 0)
-               return(ENXIO);
        if (fstat(sc->fd, &st) < 0 || st.st_size == 0)
                return(ENXIO);
 
index 3e50d8f..164e153 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/platform/vkernel/include/md_var.h,v 1.17 2007/01/22 19:37:05 corecode Exp $
+ * $DragonFly: src/sys/platform/vkernel/include/md_var.h,v 1.18 2007/03/16 13:41:40 swildner Exp $
  */
 
 #ifndef _MACHINE_MD_VAR_H_
@@ -45,6 +45,7 @@
 #endif
 
 #define VKNETIF_MAX    16
+#define VKDISK_MAX     16
 
 struct vknetif_info {
        int             tap_fd;
@@ -53,6 +54,12 @@ struct vknetif_info {
        in_addr_t       netif_mask;
 };
 
+struct vkdisk_info {
+        int fd;
+        int unit;
+        char fname[MAXPATHLEN];
+};
+
 extern char    sigcode[];
 extern int     szsigcode;
 extern vpte_t  *KernelPTA;     /* NOTE: Offset for direct VA translation */
@@ -63,7 +70,8 @@ extern  int   cpu_fxsr;
 extern  char    cpu_vendor[];  /* XXX belongs in i386 */
 extern  u_int   cpu_id;                /* XXX belongs in i386 */
 
-extern int     RootImageFd;
+extern struct vkdisk_info DiskInfo[VKDISK_MAX];
+extern int     DiskNum;
 extern int     MemImageFd;
 extern int     KQueueFd;
 extern struct vknetif_info NetifInfo[VKNETIF_MAX];
index 59296a3..b89a3ee 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/platform/vkernel/platform/init.c,v 1.31 2007/03/16 13:17:20 swildner Exp $
+ * $DragonFly: src/sys/platform/vkernel/platform/init.c,v 1.32 2007/03/16 13:41:40 swildner Exp $
  */
 
 #include <sys/types.h>
@@ -76,7 +76,8 @@ vm_paddr_t phys_avail[16];
 vm_paddr_t Maxmem;
 vm_paddr_t Maxmem_bytes;
 int MemImageFd = -1;
-int RootImageFd = -1;
+struct vkdisk_info DiskInfo[VKDISK_MAX];
+int DiskNum;
 struct vknetif_info NetifInfo[VKNETIF_MAX];
 int NetifNum;
 vm_offset_t KvaStart;
@@ -104,8 +105,8 @@ static void init_sys_memory(char *imageFile);
 static void init_kern_memory(void);
 static void init_globaldata(void);
 static void init_vkernel(void);
-static void init_rootdevice(char *imageFile);
-static void init_netif(char *netifFile[], int netifFileNum);
+static void init_disk(char *diskExp[], int diskFileNum); 
+static void init_netif(char *netifExp[], int netifFileNum);
 static void usage(const char *ctl);
 
 /*
@@ -115,10 +116,11 @@ int
 main(int ac, char **av)
 {
        char *memImageFile = NULL;
-       char *rootImageFile = NULL;
        char *netifFile[VKNETIF_MAX];
+       char *diskFile[VKDISK_MAX];
        char *suffix;
        int netifFileNum = 0;
+       int diskFileNum = 0;
        int c;
        int i;
        int n;
@@ -159,7 +161,8 @@ main(int ac, char **av)
                                netifFile[netifFileNum++] = optarg;
                        break;
                case 'r':
-                       rootImageFile = optarg;
+                       if (diskFileNum < VKDISK_MAX)
+                               diskFile[diskFileNum++] = optarg;
                        break;
                case 'm':
                        Maxmem_bytes = strtoull(optarg, &suffix, 0);
@@ -197,7 +200,7 @@ main(int ac, char **av)
        init_globaldata();
        init_vkernel();
        init_kqueue();
-       init_rootdevice(rootImageFile);
+       init_disk(diskFile, diskFileNum);
        init_netif(netifFile, netifFileNum);
        init_exceptions();
        mi_startup();
@@ -537,8 +540,9 @@ init_vkernel(void)
 }
 
 /*
- * The root filesystem path for the virtual kernel is optional.  If specified
- * it points to a filesystem image.
+ * Filesystem image paths for the virtual kernel are optional.  
+ * If specified they each should point to a disk image, 
+ * the first of which will become the root disk.
  *
  * The virtual kernel caches data from our 'disk' just like a normal kernel,
  * so we do not really want the real kernel to cache the data too.  Use
@@ -546,17 +550,49 @@ init_vkernel(void)
  */
 static
 void
-init_rootdevice(char *imageFile)
+init_disk(char *diskExp[], int diskFileNum)
 {
-       struct stat st;
+       int i;  
+
+        if (diskFileNum == 0)
+                return;
+
+       for(i=0; i < diskFileNum; i++){
+               char *fname;
+               fname = diskExp[i];
+
+               if (fname == NULL) {
+                        warnx("Invalid argument to '-r'");
+                        continue;
+                }
+
+               if (DiskNum < VKDISK_MAX) {
+                       struct stat st; 
+                       struct vkdisk_info* info = NULL;
+                       int fd;
+                               size_t l = 0;
+
+                       fd = open(fname, O_RDWR|O_DIRECT, 0644);
+                       if (fd < 0 || fstat(fd, &st) < 0) {
+                               err(1, "Unable to open/create %s", fname);
+                               /* NOT REACHED */
+                       }
+
+                       info = &DiskInfo[DiskNum];
+                       l = strlen(fname);
 
-       if (imageFile) {
-               RootImageFd = open(imageFile, O_RDWR|O_DIRECT, 0644);
-               if (RootImageFd < 0 || fstat(RootImageFd, &st) < 0) {
-                       err(1, "Unable to open/create %s", imageFile);
-                       /* NOT REACHED */
+                       info->unit = i;
+                       info->fd = fd;
+                       memcpy(info->fname, fname, l);
+
+                       if (i == 0)
+                               rootdevnames[0] = "ufs:vkd0a";
+
+                       DiskNum++;
+               } else {
+                        warnx("vkd%d (%s) > VKD_MAX", DiskNum, fname);
+                        continue;
                }
-               rootdevnames[0] = "ufs:vkd0a";
        }
 }
 
@@ -913,7 +949,7 @@ init_netif(char *netifExp[], int netifExpNum)
 
                netif = strtok(netifExp[i], ":");
                if (netif == NULL) {
-                       warnx("Invalide argument to '-I'");
+                       warnx("Invalid argument to '-I'");
                        continue;
                }