From 6bf28d407813297e5a1c57f9c7c6154f878d9792 Mon Sep 17 00:00:00 2001 From: Sasha Levin Date: Sat, 16 Jul 2011 12:28:23 +0300 Subject: [PATCH] kvm tools: Implement VIRTIO_BLK_T_GET_ID Return device id when requested by virtio-blk. Device id is currently based on the device information and the inode number of the underlying disk image. Signed-off-by: Sasha Levin Signed-off-by: Pekka Enberg --- tools/kvm/disk/core.c | 11 +++++++++++ tools/kvm/include/kvm/disk-image.h | 1 + tools/kvm/virtio/blk.c | 4 ++++ 3 files changed, 16 insertions(+) diff --git a/tools/kvm/disk/core.c b/tools/kvm/disk/core.c index 965bbe5baac6..b488888b5b82 100644 --- a/tools/kvm/disk/core.c +++ b/tools/kvm/disk/core.c @@ -207,3 +207,14 @@ ssize_t disk_image__write(struct disk_image *disk, u64 sector, const struct iove return total; } + +ssize_t disk_image__get_serial(struct disk_image *disk, void *buffer, ssize_t *len) +{ + struct stat st; + + if (fstat(disk->fd, &st) != 0) + return 0; + + *len = snprintf(buffer, *len, "%lu%lu%lu", st.st_dev, st.st_rdev, st.st_ino); + return *len; +} \ No newline at end of file diff --git a/tools/kvm/include/kvm/disk-image.h b/tools/kvm/include/kvm/disk-image.h index 1363fe11d0b7..75b54f90cc32 100644 --- a/tools/kvm/include/kvm/disk-image.h +++ b/tools/kvm/include/kvm/disk-image.h @@ -59,6 +59,7 @@ void disk_image__close_all(struct disk_image **disks, int count); int disk_image__flush(struct disk_image *disk); ssize_t disk_image__read(struct disk_image *disk, u64 sector, const struct iovec *iov, int iovcount); ssize_t disk_image__write(struct disk_image *disk, u64 sector, const struct iovec *iov, int iovcount); +ssize_t disk_image__get_serial(struct disk_image *disk, void *buffer, ssize_t *len); struct disk_image *raw_image__probe(int fd, struct stat *st, bool readonly); struct disk_image *blkdev__probe(const char *filename, struct stat *st); diff --git a/tools/kvm/virtio/blk.c b/tools/kvm/virtio/blk.c index f2a728c85624..f5ecdd913912 100644 --- a/tools/kvm/virtio/blk.c +++ b/tools/kvm/virtio/blk.c @@ -152,6 +152,10 @@ static void virtio_blk_do_io_request(struct kvm *kvm, void *param) case VIRTIO_BLK_T_FLUSH: block_cnt = disk_image__flush(bdev->disk); break; + case VIRTIO_BLK_T_GET_ID: + block_cnt = VIRTIO_BLK_ID_BYTES; + disk_image__get_serial(bdev->disk, (iov + 1)->iov_base, &block_cnt); + break; default: pr_warning("request type %d", req->type); block_cnt = -1; -- 2.39.5