qemu-iotests: test zone append operation
The patch tests zone append writes by reporting the zone wp after the completion of the call. "zap -p" option can print the sector offset value after completion, which should be the start sector where the append write begins. Signed-off-by: Sam Li <faithilikerun@gmail.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Message-id: 20230508051510.177850-4-faithilikerun@gmail.com Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
4751d09adc
commit
fe4fe70d27
@ -1874,6 +1874,80 @@ static const cmdinfo_t zone_reset_cmd = {
|
||||
.oneline = "reset a zone write pointer in zone block device",
|
||||
};
|
||||
|
||||
static int do_aio_zone_append(BlockBackend *blk, QEMUIOVector *qiov,
|
||||
int64_t *offset, int flags, int *total)
|
||||
{
|
||||
int async_ret = NOT_DONE;
|
||||
|
||||
blk_aio_zone_append(blk, offset, qiov, flags, aio_rw_done, &async_ret);
|
||||
while (async_ret == NOT_DONE) {
|
||||
main_loop_wait(false);
|
||||
}
|
||||
|
||||
*total = qiov->size;
|
||||
return async_ret < 0 ? async_ret : 1;
|
||||
}
|
||||
|
||||
static int zone_append_f(BlockBackend *blk, int argc, char **argv)
|
||||
{
|
||||
int ret;
|
||||
bool pflag = false;
|
||||
int flags = 0;
|
||||
int total = 0;
|
||||
int64_t offset;
|
||||
char *buf;
|
||||
int c, nr_iov;
|
||||
int pattern = 0xcd;
|
||||
QEMUIOVector qiov;
|
||||
|
||||
if (optind > argc - 3) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if ((c = getopt(argc, argv, "p")) != -1) {
|
||||
pflag = true;
|
||||
}
|
||||
|
||||
offset = cvtnum(argv[optind]);
|
||||
if (offset < 0) {
|
||||
print_cvtnum_err(offset, argv[optind]);
|
||||
return offset;
|
||||
}
|
||||
optind++;
|
||||
nr_iov = argc - optind;
|
||||
buf = create_iovec(blk, &qiov, &argv[optind], nr_iov, pattern,
|
||||
flags & BDRV_REQ_REGISTERED_BUF);
|
||||
if (buf == NULL) {
|
||||
return -EINVAL;
|
||||
}
|
||||
ret = do_aio_zone_append(blk, &qiov, &offset, flags, &total);
|
||||
if (ret < 0) {
|
||||
printf("zone append failed: %s\n", strerror(-ret));
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (pflag) {
|
||||
printf("After zap done, the append sector is 0x%" PRIx64 "\n",
|
||||
tosector(offset));
|
||||
}
|
||||
|
||||
out:
|
||||
qemu_io_free(blk, buf, qiov.size,
|
||||
flags & BDRV_REQ_REGISTERED_BUF);
|
||||
qemu_iovec_destroy(&qiov);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const cmdinfo_t zone_append_cmd = {
|
||||
.name = "zone_append",
|
||||
.altname = "zap",
|
||||
.cfunc = zone_append_f,
|
||||
.argmin = 3,
|
||||
.argmax = 4,
|
||||
.args = "offset len [len..]",
|
||||
.oneline = "append write a number of bytes at a specified offset",
|
||||
};
|
||||
|
||||
static int truncate_f(BlockBackend *blk, int argc, char **argv);
|
||||
static const cmdinfo_t truncate_cmd = {
|
||||
.name = "truncate",
|
||||
@ -2672,6 +2746,7 @@ static void __attribute((constructor)) init_qemuio_commands(void)
|
||||
qemuio_add_command(&zone_close_cmd);
|
||||
qemuio_add_command(&zone_finish_cmd);
|
||||
qemuio_add_command(&zone_reset_cmd);
|
||||
qemuio_add_command(&zone_append_cmd);
|
||||
qemuio_add_command(&truncate_cmd);
|
||||
qemuio_add_command(&length_cmd);
|
||||
qemuio_add_command(&info_cmd);
|
||||
|
@ -82,6 +82,22 @@ echo "(5) resetting the second zone"
|
||||
$QEMU_IO $IMG -c "zrs 268435456 268435456"
|
||||
echo "After resetting a zone:"
|
||||
$QEMU_IO $IMG -c "zrp 268435456 1"
|
||||
echo
|
||||
echo
|
||||
echo "(6) append write" # the physical block size of the device is 4096
|
||||
$QEMU_IO $IMG -c "zrp 0 1"
|
||||
$QEMU_IO $IMG -c "zap -p 0 0x1000 0x2000"
|
||||
echo "After appending the first zone firstly:"
|
||||
$QEMU_IO $IMG -c "zrp 0 1"
|
||||
$QEMU_IO $IMG -c "zap -p 0 0x1000 0x2000"
|
||||
echo "After appending the first zone secondly:"
|
||||
$QEMU_IO $IMG -c "zrp 0 1"
|
||||
$QEMU_IO $IMG -c "zap -p 268435456 0x1000 0x2000"
|
||||
echo "After appending the second zone firstly:"
|
||||
$QEMU_IO $IMG -c "zrp 268435456 1"
|
||||
$QEMU_IO $IMG -c "zap -p 268435456 0x1000 0x2000"
|
||||
echo "After appending the second zone secondly:"
|
||||
$QEMU_IO $IMG -c "zrp 268435456 1"
|
||||
|
||||
# success, all done
|
||||
echo "*** done"
|
||||
|
@ -50,4 +50,20 @@ start: 0x80000, len 0x80000, cap 0x80000, wptr 0x100000, zcond:14, [type: 2]
|
||||
(5) resetting the second zone
|
||||
After resetting a zone:
|
||||
start: 0x80000, len 0x80000, cap 0x80000, wptr 0x80000, zcond:1, [type: 2]
|
||||
|
||||
|
||||
(6) append write
|
||||
start: 0x0, len 0x80000, cap 0x80000, wptr 0x0, zcond:1, [type: 2]
|
||||
After zap done, the append sector is 0x0
|
||||
After appending the first zone firstly:
|
||||
start: 0x0, len 0x80000, cap 0x80000, wptr 0x18, zcond:2, [type: 2]
|
||||
After zap done, the append sector is 0x18
|
||||
After appending the first zone secondly:
|
||||
start: 0x0, len 0x80000, cap 0x80000, wptr 0x30, zcond:2, [type: 2]
|
||||
After zap done, the append sector is 0x80000
|
||||
After appending the second zone firstly:
|
||||
start: 0x80000, len 0x80000, cap 0x80000, wptr 0x80018, zcond:2, [type: 2]
|
||||
After zap done, the append sector is 0x80018
|
||||
After appending the second zone secondly:
|
||||
start: 0x80000, len 0x80000, cap 0x80000, wptr 0x80030, zcond:2, [type: 2]
|
||||
*** done
|
||||
|
Loading…
Reference in New Issue
Block a user