]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
kvm tools: Implement VIRTIO_BLK_T_GET_ID
authorSasha Levin <levinsasha928@gmail.com>
Sat, 16 Jul 2011 09:28:23 +0000 (12:28 +0300)
committerPekka Enberg <penberg@kernel.org>
Mon, 18 Jul 2011 08:38:14 +0000 (11:38 +0300)
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 <levinsasha928@gmail.com>
Signed-off-by: Pekka Enberg <penberg@kernel.org>
tools/kvm/disk/core.c
tools/kvm/include/kvm/disk-image.h
tools/kvm/virtio/blk.c

index 965bbe5baac672b5cd49d8188d9d1e393555038e..b488888b5b82b104a57f63a480ce3d75c7a94293 100644 (file)
@@ -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
index 1363fe11d0b7085bd013fe785c4b1a0acb771e1f..75b54f90cc3265ddd3402d0d8b8e5dcf4ba52bdf 100644 (file)
@@ -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);
index f2a728c8562491b5723d47fbdc295381d577a452..f5ecdd913912c60f10f8be8a15b4ff81642b36c6 100644 (file)
@@ -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;