socsvn commit: r257161 - soc2013/zcore/head/usr.sbin/bhyve

zcore at FreeBSD.org zcore at FreeBSD.org
Mon Sep 9 14:27:19 UTC 2013


Author: zcore
Date: Mon Sep  9 14:27:18 2013
New Revision: 257161
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=257161

Log:
  add multi backing files support
  
  we can support up to 6 backing files. Each backing file per port.

Modified:
  soc2013/zcore/head/usr.sbin/bhyve/pci_ahci.c

Modified: soc2013/zcore/head/usr.sbin/bhyve/pci_ahci.c
==============================================================================
--- soc2013/zcore/head/usr.sbin/bhyve/pci_ahci.c	Mon Sep  9 14:26:35 2013	(r257160)
+++ soc2013/zcore/head/usr.sbin/bhyve/pci_ahci.c	Mon Sep  9 14:27:18 2013	(r257161)
@@ -753,42 +753,47 @@
 static int
 pci_ahci_init(struct vmctx *ctx, struct pci_devinst *pi, char *opts)
 {
-	int i;
+	int i, ret = 0;
 	struct pci_ahci_softc *sc;
-	char bident[sizeof("XX:X")];
-	struct blockif_ctxt *bctxt;
+	char *str, *cpy, *fstr;
 
 	if (opts == NULL) {
 		printf("pci_ahci: backing device required\n");
 		return (1);
 	}
+	str = cpy = strdup(opts);
 
 	dbg = fopen("/tmp/log", "w+");
 	DPRINTF(("pci_ahci initializing\n"));
 
-	/*
-	 * Attempt to open the backing image. Use the PCI slot/func
-	 * for the identifier string since that uniquely identifies
-	 * a storage device.
-	 */
-	snprintf(bident, sizeof(bident), "%d:%d", pi->pi_slot, pi->pi_func);
-
-	bctxt = blockif_open(opts, bident);
-	if (bctxt == NULL)
-		return (1);
-
 	sc = malloc(sizeof(struct pci_ahci_softc));
 	memset(sc, 0, sizeof(struct pci_ahci_softc));
-
 	pi->pi_arg = sc;
 	sc->asc_pi = pi;
-
-	sc->port[0].bctx = bctxt;
-
 	sc->ports = MAX_PORTS;
+
 	for (i = 0; i < sc->ports; i++) {
-		if (!sc->port[i].bctx)
-			continue;
+		char bident[sizeof("XX:X:X")];
+		struct blockif_ctxt *bctxt;
+
+		fstr = strsep(&str, ",");
+		if (fstr == NULL)
+			break;
+		/*
+		 * Attempt to open the backing image. Use the PCI
+		 * slot/func/ahci_port for the identifier string
+		 * since that uniquely identifies a storage device.
+		 */
+		snprintf(bident, sizeof(bident), "%d:%d:%d",
+				pi->pi_slot, pi->pi_func, i);
+
+		bctxt = blockif_open(fstr, bident);
+		if (bctxt == NULL) {
+			ret = 1;
+			goto open_fail;
+		}
+
+		sc->port[i].bctx = bctxt;
 		sc->port[i].pr_sc = sc;
 		pthread_cond_init(&sc->port[i].flush_cond, NULL);
 		/*
@@ -821,7 +826,15 @@
 	
 	pci_emul_alloc_bar(pi, 5, PCIBAR_MEM32, AHCI_OFFSET+sc->ports*AHCI_STEP);
 
-	return (0);
+open_fail:
+	free(cpy);
+	if (ret) {
+		int n;
+		for (n = i - 1; n >= 0; n--)
+			blockif_close(sc->port[n].bctx);
+		free(sc);
+	}
+	return ret;
 }
 
 static void


More information about the svn-soc-all mailing list