From: john cooper <john.cooper@redhat.com>
To: KVM list <kvm@vger.kernel.org>, qemu-devel@nongnu.org
Cc: john.cooper@redhat.com, Rusty Russell <rusty@rustcorp.com.au>,
Christoph Hellwig <hch@lst.de>
Subject: [Qemu-devel] Re: [PATCH 2/2] Add serial number support for virtio_blk, V4a
Date: Wed, 03 Jun 2009 17:07:19 -0400 [thread overview]
Message-ID: <4A26E607.3070901@redhat.com> (raw)
In-Reply-To: <4A1F6130.9070705@redhat.com>
This patch extracts the opaque data from pci i/o
region 0 via the added VIRTIO_BLK_F_IDENTIFY
field. By convention this data takes the form of
that returned by an ATA IDENTIFY DEVICE command,
however the driver (except for structure size)
makes no interpretation of the data. The structure
data is copied wholesale to userspace via a
HDIO_GET_IDENTITY ioctl command (eg: hdparm -i <dev>).
Signed-off-by: john cooper <john.cooper@redhat.com>
---
drivers/block/virtio_blk.c | 41 ++++++++++++++++++++++++++++++++++++++---
include/linux/virtio_blk.h | 6 ++++++
2 files changed, 44 insertions(+), 3 deletions(-)
=================================================================
--- a/drivers/block/virtio_blk.c
+++ b/drivers/block/virtio_blk.c
@@ -146,12 +146,46 @@ static void do_virtblk_request(struct re
vblk->vq->vq_ops->kick(vblk->vq);
}
+/* return ATA identify data
+ */
+static int virtblk_identify(struct gendisk *disk, void *argp)
+{
+ struct virtio_blk *vblk = disk->private_data;
+ void *opaque;
+ int err = -ENOMEM;
+
+ opaque = kmalloc(VIRTIO_BLK_ID_BYTES, GFP_KERNEL);
+ if (!opaque)
+ goto out;
+
+ err = virtio_config_buf(vblk->vdev, VIRTIO_BLK_F_IDENTIFY,
+ offsetof(struct virtio_blk_config, identify), opaque,
+ VIRTIO_BLK_ID_BYTES);
+
+ if (err)
+ goto out_kfree;
+
+ if (copy_to_user(argp, opaque, VIRTIO_BLK_ID_BYTES))
+ err = -EFAULT;
+
+out_kfree:
+ kfree(opaque);
+out:
+ return err;
+}
+
static int virtblk_ioctl(struct block_device *bdev, fmode_t mode,
unsigned cmd, unsigned long data)
{
- return scsi_cmd_ioctl(bdev->bd_disk->queue,
- bdev->bd_disk, mode, cmd,
- (void __user *)data);
+ struct gendisk *disk = bdev->bd_disk;
+ void __user *argp = (void __user *)data;
+
+ switch (cmd) {
+ case HDIO_GET_IDENTITY:
+ return virtblk_identify(disk, argp);
+ default:
+ return scsi_cmd_ioctl(disk->queue, disk, mode, cmd, argp);
+ }
}
/* We provide getgeo only to please some old bootloader/partitioning tools */
@@ -356,6 +390,7 @@ static struct virtio_device_id id_table[
static unsigned int features[] = {
VIRTIO_BLK_F_BARRIER, VIRTIO_BLK_F_SEG_MAX, VIRTIO_BLK_F_SIZE_MAX,
VIRTIO_BLK_F_GEOMETRY, VIRTIO_BLK_F_RO, VIRTIO_BLK_F_BLK_SIZE,
+ VIRTIO_BLK_F_IDENTIFY
};
static struct virtio_driver virtio_blk = {
=================================================================
--- a/include/linux/virtio_blk.h
+++ b/include/linux/virtio_blk.h
@@ -15,7 +15,12 @@
#define VIRTIO_BLK_F_GEOMETRY 4 /* Legacy geometry available */
#define VIRTIO_BLK_F_RO 5 /* Disk is read-only */
#define VIRTIO_BLK_F_BLK_SIZE 6 /* Block size of disk is available*/
+#define VIRTIO_BLK_F_IDENTIFY 8 /* ATA IDENTIFY supported */
+#define VIRTIO_BLK_ID_BYTES (sizeof (__u16[256])) /* IDENTIFY DATA */
+
+/* mapped into pci i/o region 0
+ */
struct virtio_blk_config
{
/* The capacity (in 512-byte sectors). */
@@ -32,6 +37,7 @@ struct virtio_blk_config
} geometry;
/* block size of device (if VIRTIO_BLK_F_BLK_SIZE) */
__u32 blk_size;
+ __u8 identify[VIRTIO_BLK_ID_BYTES];
} __attribute__((packed));
/* These two define direction. */
--
john.cooper@redhat.com
next prev parent reply other threads:[~2009-06-03 21:11 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-05-29 4:14 [Qemu-devel] [PATCH 0/2] Add serial number support for virtio_blk, V4 john cooper
2009-06-03 21:06 ` [Qemu-devel] Re: [PATCH 0/2] Add serial number support for virtio_blk, V4a john cooper
2009-06-03 21:07 ` [Qemu-devel] Re: [PATCH 1/2] " john cooper
2009-06-03 21:07 ` john cooper [this message]
2009-06-04 6:31 ` [Qemu-devel] Re: [PATCH 2/2] " Rusty Russell
2009-06-09 12:19 ` [Qemu-devel] [PATCH] " Rusty Russell
2009-06-09 12:42 ` [Qemu-devel] " Jens Axboe
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4A26E607.3070901@redhat.com \
--to=john.cooper@redhat.com \
--cc=hch@lst.de \
--cc=kvm@vger.kernel.org \
--cc=qemu-devel@nongnu.org \
--cc=rusty@rustcorp.com.au \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).