tests/virtio-blk: add test for WRITE_ZEROES command
If the WRITE_ZEROES feature is enabled, we check this command in the test_basic(). Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Acked-by: Thomas Huth <thuth@redhat.com> Signed-off-by: Stefano Garzarella <sgarzare@redhat.com> Message-id: 20190221103314.58500-10-sgarzare@redhat.com Message-Id: <20190221103314.58500-10-sgarzare@redhat.com> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
ca1a98042b
commit
06879094bb
@ -255,6 +255,68 @@ static void test_basic(QVirtioDevice *dev, QGuestAllocator *alloc,
|
|||||||
|
|
||||||
guest_free(alloc, req_addr);
|
guest_free(alloc, req_addr);
|
||||||
|
|
||||||
|
if (features & (1u << VIRTIO_BLK_F_WRITE_ZEROES)) {
|
||||||
|
struct virtio_blk_discard_write_zeroes dwz_hdr;
|
||||||
|
void *expected;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* WRITE_ZEROES request on the same sector of previous test where
|
||||||
|
* we wrote "TEST".
|
||||||
|
*/
|
||||||
|
req.type = VIRTIO_BLK_T_WRITE_ZEROES;
|
||||||
|
req.data = (char *) &dwz_hdr;
|
||||||
|
dwz_hdr.sector = 0;
|
||||||
|
dwz_hdr.num_sectors = 1;
|
||||||
|
dwz_hdr.flags = 0;
|
||||||
|
|
||||||
|
virtio_blk_fix_dwz_hdr(dev, &dwz_hdr);
|
||||||
|
|
||||||
|
req_addr = virtio_blk_request(alloc, dev, &req, sizeof(dwz_hdr));
|
||||||
|
|
||||||
|
free_head = qvirtqueue_add(vq, req_addr, 16, false, true);
|
||||||
|
qvirtqueue_add(vq, req_addr + 16, sizeof(dwz_hdr), false, true);
|
||||||
|
qvirtqueue_add(vq, req_addr + 16 + sizeof(dwz_hdr), 1, true, false);
|
||||||
|
|
||||||
|
qvirtqueue_kick(dev, vq, free_head);
|
||||||
|
|
||||||
|
qvirtio_wait_used_elem(dev, vq, free_head, NULL,
|
||||||
|
QVIRTIO_BLK_TIMEOUT_US);
|
||||||
|
status = readb(req_addr + 16 + sizeof(dwz_hdr));
|
||||||
|
g_assert_cmpint(status, ==, 0);
|
||||||
|
|
||||||
|
guest_free(alloc, req_addr);
|
||||||
|
|
||||||
|
/* Read request to check if the sector contains all zeroes */
|
||||||
|
req.type = VIRTIO_BLK_T_IN;
|
||||||
|
req.ioprio = 1;
|
||||||
|
req.sector = 0;
|
||||||
|
req.data = g_malloc0(512);
|
||||||
|
|
||||||
|
req_addr = virtio_blk_request(alloc, dev, &req, 512);
|
||||||
|
|
||||||
|
g_free(req.data);
|
||||||
|
|
||||||
|
free_head = qvirtqueue_add(vq, req_addr, 16, false, true);
|
||||||
|
qvirtqueue_add(vq, req_addr + 16, 512, true, true);
|
||||||
|
qvirtqueue_add(vq, req_addr + 528, 1, true, false);
|
||||||
|
|
||||||
|
qvirtqueue_kick(dev, vq, free_head);
|
||||||
|
|
||||||
|
qvirtio_wait_used_elem(dev, vq, free_head, NULL,
|
||||||
|
QVIRTIO_BLK_TIMEOUT_US);
|
||||||
|
status = readb(req_addr + 528);
|
||||||
|
g_assert_cmpint(status, ==, 0);
|
||||||
|
|
||||||
|
data = g_malloc(512);
|
||||||
|
expected = g_malloc0(512);
|
||||||
|
memread(req_addr + 16, data, 512);
|
||||||
|
g_assert_cmpmem(data, 512, expected, 512);
|
||||||
|
g_free(expected);
|
||||||
|
g_free(data);
|
||||||
|
|
||||||
|
guest_free(alloc, req_addr);
|
||||||
|
}
|
||||||
|
|
||||||
if (features & (1u << VIRTIO_F_ANY_LAYOUT)) {
|
if (features & (1u << VIRTIO_F_ANY_LAYOUT)) {
|
||||||
/* Write and read with 2 descriptor layout */
|
/* Write and read with 2 descriptor layout */
|
||||||
/* Write request */
|
/* Write request */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user