diff --git a/disk/core.c b/disk/core.c index 965bbe5..b488888 100644 --- a/disk/core.c +++ b/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/include/kvm/disk-image.h b/include/kvm/disk-image.h index 1363fe1..75b54f9 100644 --- a/include/kvm/disk-image.h +++ b/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/virtio/blk.c b/virtio/blk.c index f2a728c..f5ecdd9 100644 --- a/virtio/blk.c +++ b/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;