diff options
| -rw-r--r-- | drivers/block/virtio_blk.c | 37 | ||||
| -rw-r--r-- | include/linux/virtio_blk.h | 4 |
2 files changed, 3 insertions, 38 deletions
diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c index 55635d1f697d..51042f0ba7e1 100644 --- a/drivers/block/virtio_blk.c +++ b/drivers/block/virtio_blk.c | |||
| @@ -182,34 +182,6 @@ static void do_virtblk_request(struct request_queue *q) | |||
| 182 | vblk->vq->vq_ops->kick(vblk->vq); | 182 | vblk->vq->vq_ops->kick(vblk->vq); |
| 183 | } | 183 | } |
| 184 | 184 | ||
| 185 | /* return ATA identify data | ||
| 186 | */ | ||
| 187 | static int virtblk_identify(struct gendisk *disk, void *argp) | ||
| 188 | { | ||
| 189 | struct virtio_blk *vblk = disk->private_data; | ||
| 190 | void *opaque; | ||
| 191 | int err = -ENOMEM; | ||
| 192 | |||
| 193 | opaque = kmalloc(VIRTIO_BLK_ID_BYTES, GFP_KERNEL); | ||
| 194 | if (!opaque) | ||
| 195 | goto out; | ||
| 196 | |||
| 197 | err = virtio_config_buf(vblk->vdev, VIRTIO_BLK_F_IDENTIFY, | ||
| 198 | offsetof(struct virtio_blk_config, identify), opaque, | ||
| 199 | VIRTIO_BLK_ID_BYTES); | ||
| 200 | |||
| 201 | if (err) | ||
| 202 | goto out_kfree; | ||
| 203 | |||
| 204 | if (copy_to_user(argp, opaque, VIRTIO_BLK_ID_BYTES)) | ||
| 205 | err = -EFAULT; | ||
| 206 | |||
| 207 | out_kfree: | ||
| 208 | kfree(opaque); | ||
| 209 | out: | ||
| 210 | return err; | ||
| 211 | } | ||
| 212 | |||
| 213 | static void virtblk_prepare_flush(struct request_queue *q, struct request *req) | 185 | static void virtblk_prepare_flush(struct request_queue *q, struct request *req) |
| 214 | { | 186 | { |
| 215 | req->cmd_type = REQ_TYPE_LINUX_BLOCK; | 187 | req->cmd_type = REQ_TYPE_LINUX_BLOCK; |
| @@ -221,10 +193,6 @@ static int virtblk_ioctl(struct block_device *bdev, fmode_t mode, | |||
| 221 | { | 193 | { |
| 222 | struct gendisk *disk = bdev->bd_disk; | 194 | struct gendisk *disk = bdev->bd_disk; |
| 223 | struct virtio_blk *vblk = disk->private_data; | 195 | struct virtio_blk *vblk = disk->private_data; |
| 224 | void __user *argp = (void __user *)data; | ||
| 225 | |||
| 226 | if (cmd == HDIO_GET_IDENTITY) | ||
| 227 | return virtblk_identify(disk, argp); | ||
| 228 | 196 | ||
| 229 | /* | 197 | /* |
| 230 | * Only allow the generic SCSI ioctls if the host can support it. | 198 | * Only allow the generic SCSI ioctls if the host can support it. |
| @@ -232,7 +200,8 @@ static int virtblk_ioctl(struct block_device *bdev, fmode_t mode, | |||
| 232 | if (!virtio_has_feature(vblk->vdev, VIRTIO_BLK_F_SCSI)) | 200 | if (!virtio_has_feature(vblk->vdev, VIRTIO_BLK_F_SCSI)) |
| 233 | return -ENOTTY; | 201 | return -ENOTTY; |
| 234 | 202 | ||
| 235 | return scsi_cmd_ioctl(disk->queue, disk, mode, cmd, argp); | 203 | return scsi_cmd_ioctl(disk->queue, disk, mode, cmd, |
| 204 | (void __user *)data); | ||
| 236 | } | 205 | } |
| 237 | 206 | ||
| 238 | /* We provide getgeo only to please some old bootloader/partitioning tools */ | 207 | /* We provide getgeo only to please some old bootloader/partitioning tools */ |
| @@ -443,7 +412,7 @@ static struct virtio_device_id id_table[] = { | |||
| 443 | static unsigned int features[] = { | 412 | static unsigned int features[] = { |
| 444 | VIRTIO_BLK_F_BARRIER, VIRTIO_BLK_F_SEG_MAX, VIRTIO_BLK_F_SIZE_MAX, | 413 | VIRTIO_BLK_F_BARRIER, VIRTIO_BLK_F_SEG_MAX, VIRTIO_BLK_F_SIZE_MAX, |
| 445 | VIRTIO_BLK_F_GEOMETRY, VIRTIO_BLK_F_RO, VIRTIO_BLK_F_BLK_SIZE, | 414 | VIRTIO_BLK_F_GEOMETRY, VIRTIO_BLK_F_RO, VIRTIO_BLK_F_BLK_SIZE, |
| 446 | VIRTIO_BLK_F_SCSI, VIRTIO_BLK_F_IDENTIFY, VIRTIO_BLK_F_FLUSH | 415 | VIRTIO_BLK_F_SCSI, VIRTIO_BLK_F_FLUSH |
| 447 | }; | 416 | }; |
| 448 | 417 | ||
| 449 | /* | 418 | /* |
diff --git a/include/linux/virtio_blk.h b/include/linux/virtio_blk.h index 1e19470d2da2..fd294c56d571 100644 --- a/include/linux/virtio_blk.h +++ b/include/linux/virtio_blk.h | |||
| @@ -14,11 +14,8 @@ | |||
| 14 | #define VIRTIO_BLK_F_RO 5 /* Disk is read-only */ | 14 | #define VIRTIO_BLK_F_RO 5 /* Disk is read-only */ |
| 15 | #define VIRTIO_BLK_F_BLK_SIZE 6 /* Block size of disk is available*/ | 15 | #define VIRTIO_BLK_F_BLK_SIZE 6 /* Block size of disk is available*/ |
| 16 | #define VIRTIO_BLK_F_SCSI 7 /* Supports scsi command passthru */ | 16 | #define VIRTIO_BLK_F_SCSI 7 /* Supports scsi command passthru */ |
| 17 | #define VIRTIO_BLK_F_IDENTIFY 8 /* ATA IDENTIFY supported */ | ||
| 18 | #define VIRTIO_BLK_F_FLUSH 9 /* Cache flush command support */ | 17 | #define VIRTIO_BLK_F_FLUSH 9 /* Cache flush command support */ |
| 19 | 18 | ||
| 20 | #define VIRTIO_BLK_ID_BYTES (sizeof(__u16[256])) /* IDENTIFY DATA */ | ||
| 21 | |||
| 22 | struct virtio_blk_config { | 19 | struct virtio_blk_config { |
| 23 | /* The capacity (in 512-byte sectors). */ | 20 | /* The capacity (in 512-byte sectors). */ |
| 24 | __u64 capacity; | 21 | __u64 capacity; |
| @@ -34,7 +31,6 @@ struct virtio_blk_config { | |||
| 34 | } geometry; | 31 | } geometry; |
| 35 | /* block size of device (if VIRTIO_BLK_F_BLK_SIZE) */ | 32 | /* block size of device (if VIRTIO_BLK_F_BLK_SIZE) */ |
| 36 | __u32 blk_size; | 33 | __u32 blk_size; |
| 37 | __u8 identify[VIRTIO_BLK_ID_BYTES]; | ||
| 38 | } __attribute__((packed)); | 34 | } __attribute__((packed)); |
| 39 | 35 | ||
| 40 | /* | 36 | /* |
