diff options
| author | Christian Borntraeger <borntraeger@de.ibm.com> | 2008-05-29 05:08:26 -0400 |
|---|---|---|
| committer | Rusty Russell <rusty@rustcorp.com.au> | 2008-07-24 22:06:05 -0400 |
| commit | 066f4d82a67f621ddd547bfa4b9c94631d8457b0 (patch) | |
| tree | 96bdeadd9af5b16476186df0ea8056175bc16cbb | |
| parent | e962fa660d391fc9b90988e6538c94c858c099f9 (diff) | |
virtio_blk: check for hardsector size from host
Currently virtio_blk assumes a 512 byte hard sector size. This can cause
trouble / performance issues if the backing has a different block size
(like a file on an ext3 file system formatted with 4k block size or a dasd).
Lets add a feature flag that tells the guest to use a different hard sector
size than 512 byte.
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
| -rw-r--r-- | drivers/block/virtio_blk.c | 10 | ||||
| -rw-r--r-- | include/linux/virtio_blk.h | 3 |
2 files changed, 12 insertions, 1 deletions
diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c index dd7ea203f940..42251095134f 100644 --- a/drivers/block/virtio_blk.c +++ b/drivers/block/virtio_blk.c | |||
| @@ -196,6 +196,7 @@ static int virtblk_probe(struct virtio_device *vdev) | |||
| 196 | int err; | 196 | int err; |
| 197 | u64 cap; | 197 | u64 cap; |
| 198 | u32 v; | 198 | u32 v; |
| 199 | u32 blk_size; | ||
| 199 | 200 | ||
| 200 | if (index_to_minor(index) >= 1 << MINORBITS) | 201 | if (index_to_minor(index) >= 1 << MINORBITS) |
| 201 | return -ENOSPC; | 202 | return -ENOSPC; |
| @@ -290,6 +291,13 @@ static int virtblk_probe(struct virtio_device *vdev) | |||
| 290 | if (!err) | 291 | if (!err) |
| 291 | blk_queue_max_hw_segments(vblk->disk->queue, v); | 292 | blk_queue_max_hw_segments(vblk->disk->queue, v); |
| 292 | 293 | ||
| 294 | /* Host can optionally specify the block size of the device */ | ||
| 295 | err = virtio_config_val(vdev, VIRTIO_BLK_F_BLK_SIZE, | ||
| 296 | offsetof(struct virtio_blk_config, blk_size), | ||
| 297 | &blk_size); | ||
| 298 | if (!err) | ||
| 299 | blk_queue_hardsect_size(vblk->disk->queue, blk_size); | ||
| 300 | |||
| 293 | add_disk(vblk->disk); | 301 | add_disk(vblk->disk); |
| 294 | return 0; | 302 | return 0; |
| 295 | 303 | ||
| @@ -330,7 +338,7 @@ static struct virtio_device_id id_table[] = { | |||
| 330 | 338 | ||
| 331 | static unsigned int features[] = { | 339 | static unsigned int features[] = { |
| 332 | VIRTIO_BLK_F_BARRIER, VIRTIO_BLK_F_SEG_MAX, VIRTIO_BLK_F_SIZE_MAX, | 340 | VIRTIO_BLK_F_BARRIER, VIRTIO_BLK_F_SEG_MAX, VIRTIO_BLK_F_SIZE_MAX, |
| 333 | VIRTIO_BLK_F_GEOMETRY, VIRTIO_BLK_F_RO, | 341 | VIRTIO_BLK_F_GEOMETRY, VIRTIO_BLK_F_RO, VIRTIO_BLK_F_BLK_SIZE, |
| 334 | }; | 342 | }; |
| 335 | 343 | ||
| 336 | static struct virtio_driver virtio_blk = { | 344 | static struct virtio_driver virtio_blk = { |
diff --git a/include/linux/virtio_blk.h b/include/linux/virtio_blk.h index 6a66c7f30bcb..c1aef85243bf 100644 --- a/include/linux/virtio_blk.h +++ b/include/linux/virtio_blk.h | |||
| @@ -13,6 +13,7 @@ | |||
| 13 | #define VIRTIO_BLK_F_SEG_MAX 2 /* Indicates maximum # of segments */ | 13 | #define VIRTIO_BLK_F_SEG_MAX 2 /* Indicates maximum # of segments */ |
| 14 | #define VIRTIO_BLK_F_GEOMETRY 4 /* Legacy geometry available */ | 14 | #define VIRTIO_BLK_F_GEOMETRY 4 /* Legacy geometry available */ |
| 15 | #define VIRTIO_BLK_F_RO 5 /* Disk is read-only */ | 15 | #define VIRTIO_BLK_F_RO 5 /* Disk is read-only */ |
| 16 | #define VIRTIO_BLK_F_BLK_SIZE 6 /* Block size of disk is available*/ | ||
| 16 | 17 | ||
| 17 | struct virtio_blk_config | 18 | struct virtio_blk_config |
| 18 | { | 19 | { |
| @@ -28,6 +29,8 @@ struct virtio_blk_config | |||
| 28 | __u8 heads; | 29 | __u8 heads; |
| 29 | __u8 sectors; | 30 | __u8 sectors; |
| 30 | } geometry; | 31 | } geometry; |
| 32 | /* block size of device (if VIRTIO_BLK_F_BLK_SIZE) */ | ||
| 33 | __u32 blk_size; | ||
| 31 | } __attribute__((packed)); | 34 | } __attribute__((packed)); |
| 32 | 35 | ||
| 33 | /* These two define direction. */ | 36 | /* These two define direction. */ |
