[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 -- john.coo...@third-harmonic.com
/* 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); }