On 2019-01-24 18:23, Stefano Garzarella wrote: > If the WRITE_ZEROES feature is enabled, we check this > command in the test_basic(). > > Signed-off-by: Stefano Garzarella <sgarz...@redhat.com> > --- > tests/virtio-blk-test.c | 63 +++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 63 insertions(+) > > diff --git a/tests/virtio-blk-test.c b/tests/virtio-blk-test.c > index 04c608764b..8cabbcb85a 100644 > --- a/tests/virtio-blk-test.c > +++ b/tests/virtio-blk-test.c > @@ -231,6 +231,69 @@ static void test_basic(QVirtioDevice *dev, > QGuestAllocator *alloc, > > 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 = g_malloc0(512);
Wouldn't it be more interesting to do a memset(req.data, 0xaa, 512) or something similar here, to see whether zeroes or 0xaa is written? > + dwz_hdr = (struct virtio_blk_discard_write_zeroes *)req.data; > + dwz_hdr->sector = 0; > + dwz_hdr->num_sectors = 1; > + dwz_hdr->flags = 0; > + > + 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, false, 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); > + > + 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)) { > /* Write and read with 2 descriptor layout */ > /* Write request */ >