aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Baldwin <jhb@FreeBSD.org>2021-09-17 16:55:06 +0000
committerJohn Baldwin <jhb@FreeBSD.org>2021-09-17 16:55:48 +0000
commitc6efcb1281f3518a92fdc579d2c3c3c74eb6070c (patch)
treeb201205ec7aaefda99ffb0e1b6f10f60ca9e898c
parent7eb138a9e53636366e615bdf04062fedc044bcea (diff)
downloadsrc-c6efcb1281f3518a92fdc579d2c3c3c74eb6070c.tar.gz
src-c6efcb1281f3518a92fdc579d2c3c3c74eb6070c.zip
bhyve: Support setting the disk serial number for VirtIO block devices.
Reviewed by: allanjude Obtained from: illumos Differential Revision: https://reviews.freebsd.org/D31983
-rw-r--r--usr.sbin/bhyve/bhyve_config.512
-rw-r--r--usr.sbin/bhyve/pci_virtio_block.c27
2 files changed, 28 insertions, 11 deletions
diff --git a/usr.sbin/bhyve/bhyve_config.5 b/usr.sbin/bhyve/bhyve_config.5
index a6f621048c1a..25bd818d6148 100644
--- a/usr.sbin/bhyve/bhyve_config.5
+++ b/usr.sbin/bhyve/bhyve_config.5
@@ -23,7 +23,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.Dd April 20, 2021
+.Dd September 17, 2021
.Dt BHYVE_CONFIG 5
.Os
.Sh NAME
@@ -514,6 +514,16 @@ The path of a directory on the host to export to the guest.
.It Va ro Ta bool Ta false Ta
If true, the guest filesystem is read-only.
.El
+.Ss VirtIO Block Device Settings
+In addition to the block device settings described above, each
+VirtIO block device supports the following settings:
+.Bl -column "model" "integer" "generated"
+.It Sy Name Ta Sy Format Ta Sy Default Ta Sy Description
+.It Va ser Ta string Ta generated Ta
+Serial number of up to twenty characters.
+A default serial number is generated using a hash of the backing
+store's pathname.
+.El
.Ss VirtIO Console Device Settings
Each VirtIO Console device contains one or more console ports.
Each port stores its settings in a node named
diff --git a/usr.sbin/bhyve/pci_virtio_block.c b/usr.sbin/bhyve/pci_virtio_block.c
index 3718b2d7eff0..385b812be84c 100644
--- a/usr.sbin/bhyve/pci_virtio_block.c
+++ b/usr.sbin/bhyve/pci_virtio_block.c
@@ -453,7 +453,7 @@ pci_vtblk_init(struct vmctx *ctx, struct pci_devinst *pi, nvlist_t *nvl)
{
char bident[sizeof("XX:X:X")];
struct blockif_ctxt *bctxt;
- const char *path;
+ const char *path, *serial;
MD5_CTX mdctx;
u_char digest[16];
struct pci_vtblk_softc *sc;
@@ -498,16 +498,23 @@ pci_vtblk_init(struct vmctx *ctx, struct pci_devinst *pi, nvlist_t *nvl)
/* sc->vbsc_vq.vq_notify = we have no per-queue notify */
/*
- * Create an identifier for the backing file. Use parts of the
- * md5 sum of the filename
+ * If an explicit identifier is not given, create an
+ * identifier using parts of the md5 sum of the filename.
*/
- path = get_config_value_node(nvl, "path");
- MD5Init(&mdctx);
- MD5Update(&mdctx, path, strlen(path));
- MD5Final(digest, &mdctx);
- snprintf(sc->vbsc_ident, VTBLK_BLK_ID_BYTES,
- "BHYVE-%02X%02X-%02X%02X-%02X%02X",
- digest[0], digest[1], digest[2], digest[3], digest[4], digest[5]);
+ bzero(sc->vbsc_ident, VTBLK_BLK_ID_BYTES);
+ if ((serial = get_config_value_node(nvl, "serial")) != NULL ||
+ (serial = get_config_value_node(nvl, "ser")) != NULL) {
+ strlcpy(sc->vbsc_ident, serial, VTBLK_BLK_ID_BYTES);
+ } else {
+ path = get_config_value_node(nvl, "path");
+ MD5Init(&mdctx);
+ MD5Update(&mdctx, path, strlen(path));
+ MD5Final(digest, &mdctx);
+ snprintf(sc->vbsc_ident, VTBLK_BLK_ID_BYTES,
+ "BHYVE-%02X%02X-%02X%02X-%02X%02X",
+ digest[0], digest[1], digest[2], digest[3], digest[4],
+ digest[5]);
+ }
/* setup virtio block config space */
sc->vbsc_cfg.vbc_capacity = size / VTBLK_BSIZE; /* 512-byte units */