Skip to content

Add serial number support for virtio_blk, V2

john cooper kvm qemu-devel 1 version In review

Get series with b4
b4 am [email protected]

Versions newest first

  1. v1 Latest2 patches 5 repliesIn review

Patches in v1 No applies recorded yet

#Subject and filesSizeRepliesApplied
1/2Add serial number support for virtio_blk, V2hw/virtio-blk.c hw/virtio-blk.h sysemu.h+18 -10 replies
2/2Add serial number support for virtio_blk, V2drivers/block/virtio_blk.c include/linux/virtio_blk.h+42 -30 replies

Reviews trailers per patch

No Reviewed-by, Acked-by or Tested-by trailers for v1 yet.

Read the v1 thread

Cover letter [PATCH 0/2] Add serial number support for virtio_blk, V2

[Resend of earlier patch: 1/2 rebased to qemu-kvm, 2/2 minor tweak]

This patch allows passing of a virtio_blk drive serial number from qemu into a guest's virtio_blk driver, and provides a means to access the serial number from a guest's userspace.

Equivalent functionality currently exists for IDE and SCSI, however it is not yet implemented for virtio. Scenarios exist where guest code relies on a unique drive serial number to correctly identify the machine environment in which it exists.

The following two patches implement the above:

qemu-vblk-serial-2.patch

which provides the qemu missing bits to interpret a '-drive .. serial=XYZ ..' flag, and:

virtio_blk-serial-2.patch

which extracts this information and makes it available to guest userspace via ioctl.

Attached to this patch header is a trivial example program which retrieves the serial number from guest userspace.

The above patches are relative to qemu-kvm.git and 2.6.29.3 respectively.

-john

Signature · 1 line
[email protected]

/* example: retrieve serial number from virtio block device
*/
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <linux/virtio_blk.h>

#define iswhite(c) (!('!' <= (c) && (c) <= '~'))

#ifndef VBLK_GET_SN
#define VBLK_GET_SN ((unsigned int)('V' << 24 | 'B' << 16 | 'L' << 8 | 'K')) #endif

/* get virtblk drive serial#
*/
int main(int ac, char ***av)

{
	int fd, nb, i;
	unsigned char sn[30];
	unsigned char *p;

	sn[0] = sizeof (sn);
	if ((fd = open("/dev/vda", O_RDONLY)) < 0)
		perror("can't open device"), exit(1);
	else if ((nb = ioctl(fd, VBLK_GET_SN, &sn)) < 0)
		perror("can't ioctl device"), exit(1);
	printf("returned %d bytes:\n", nb);
	for (p = sn, i = nb; 0 <= --i; ++p)
		printf("%02x%c", *p, i ? ' ' : '\t');
	for (p = sn, i = nb; 0 <= --i; ++p)
		printf("%c%s", iswhite(*p) ? '.' : *p, i ? "" : "\n");
	return (0);
}