Add serial number support for virtio_blk
cover Add serial number support for virtio_blk
[Repost -- neglected to add qemu-devel in my prior post.]
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.patch
which provides the qemu missing bits to interpret a '-drive .. serial=XYZ ..' flag, and
virtio_blk-serial.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 kvm-84 and 2.6.28 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);
}