qemu-iotests: Fix regression in 136 on aio_read invalid
Commit 093ea232 removed the ability for aio_read and aio_write to artificially inflate the invalid statistics counters for block devices, since it no longer flags unaligned offset or length. Add 'aio_read -i' and 'aio_write -i' to restore the ability, and update test 136 to use it. Reported-by: Kevin Wolf <kwolf@redhat.com> Signed-off-by: Eric Blake <eblake@redhat.com> Message-id: 1463416983-28318-4-git-send-email-eblake@redhat.com Signed-off-by: Max Reitz <mreitz@redhat.com>
This commit is contained in:
		
							parent
							
								
									9e28bb26c2
								
							
						
					
					
						commit
						37546ff28f
					
				| @ -1274,6 +1274,7 @@ static void aio_read_help(void) | |||||||
| " used to ensure all outstanding aio requests have been completed.\n" | " used to ensure all outstanding aio requests have been completed.\n" | ||||||
| " -C, -- report statistics in a machine parsable format\n" | " -C, -- report statistics in a machine parsable format\n" | ||||||
| " -P, -- use a pattern to verify read data\n" | " -P, -- use a pattern to verify read data\n" | ||||||
|  | " -i, -- treat request as invalid, for exercising stats\n" | ||||||
| " -v, -- dump buffer to standard output\n" | " -v, -- dump buffer to standard output\n" | ||||||
| " -q, -- quiet mode, do not show I/O statistics\n" | " -q, -- quiet mode, do not show I/O statistics\n" | ||||||
| "\n"); | "\n"); | ||||||
| @ -1286,7 +1287,7 @@ static const cmdinfo_t aio_read_cmd = { | |||||||
|     .cfunc      = aio_read_f, |     .cfunc      = aio_read_f, | ||||||
|     .argmin     = 2, |     .argmin     = 2, | ||||||
|     .argmax     = -1, |     .argmax     = -1, | ||||||
|     .args       = "[-Cqv] [-P pattern] off len [len..]", |     .args       = "[-Ciqv] [-P pattern] off len [len..]", | ||||||
|     .oneline    = "asynchronously reads a number of bytes", |     .oneline    = "asynchronously reads a number of bytes", | ||||||
|     .help       = aio_read_help, |     .help       = aio_read_help, | ||||||
| }; | }; | ||||||
| @ -1297,7 +1298,7 @@ static int aio_read_f(BlockBackend *blk, int argc, char **argv) | |||||||
|     struct aio_ctx *ctx = g_new0(struct aio_ctx, 1); |     struct aio_ctx *ctx = g_new0(struct aio_ctx, 1); | ||||||
| 
 | 
 | ||||||
|     ctx->blk = blk; |     ctx->blk = blk; | ||||||
|     while ((c = getopt(argc, argv, "CP:qv")) != -1) { |     while ((c = getopt(argc, argv, "CP:iqv")) != -1) { | ||||||
|         switch (c) { |         switch (c) { | ||||||
|         case 'C': |         case 'C': | ||||||
|             ctx->Cflag = true; |             ctx->Cflag = true; | ||||||
| @ -1310,6 +1311,11 @@ static int aio_read_f(BlockBackend *blk, int argc, char **argv) | |||||||
|                 return 0; |                 return 0; | ||||||
|             } |             } | ||||||
|             break; |             break; | ||||||
|  |         case 'i': | ||||||
|  |             printf("injecting invalid read request\n"); | ||||||
|  |             block_acct_invalid(blk_get_stats(blk), BLOCK_ACCT_READ); | ||||||
|  |             g_free(ctx); | ||||||
|  |             return 0; | ||||||
|         case 'q': |         case 'q': | ||||||
|             ctx->qflag = true; |             ctx->qflag = true; | ||||||
|             break; |             break; | ||||||
| @ -1367,6 +1373,7 @@ static void aio_write_help(void) | |||||||
| " -P, -- use different pattern to fill file\n" | " -P, -- use different pattern to fill file\n" | ||||||
| " -C, -- report statistics in a machine parsable format\n" | " -C, -- report statistics in a machine parsable format\n" | ||||||
| " -f, -- use Force Unit Access semantics\n" | " -f, -- use Force Unit Access semantics\n" | ||||||
|  | " -i, -- treat request as invalid, for exercising stats\n" | ||||||
| " -q, -- quiet mode, do not show I/O statistics\n" | " -q, -- quiet mode, do not show I/O statistics\n" | ||||||
| " -u, -- with -z, allow unmapping\n" | " -u, -- with -z, allow unmapping\n" | ||||||
| " -z, -- write zeroes using blk_aio_write_zeroes\n" | " -z, -- write zeroes using blk_aio_write_zeroes\n" | ||||||
| @ -1380,7 +1387,7 @@ static const cmdinfo_t aio_write_cmd = { | |||||||
|     .cfunc      = aio_write_f, |     .cfunc      = aio_write_f, | ||||||
|     .argmin     = 2, |     .argmin     = 2, | ||||||
|     .argmax     = -1, |     .argmax     = -1, | ||||||
|     .args       = "[-Cfquz] [-P pattern] off len [len..]", |     .args       = "[-Cfiquz] [-P pattern] off len [len..]", | ||||||
|     .oneline    = "asynchronously writes a number of bytes", |     .oneline    = "asynchronously writes a number of bytes", | ||||||
|     .help       = aio_write_help, |     .help       = aio_write_help, | ||||||
| }; | }; | ||||||
| @ -1393,7 +1400,7 @@ static int aio_write_f(BlockBackend *blk, int argc, char **argv) | |||||||
|     int flags = 0; |     int flags = 0; | ||||||
| 
 | 
 | ||||||
|     ctx->blk = blk; |     ctx->blk = blk; | ||||||
|     while ((c = getopt(argc, argv, "CfqP:uz")) != -1) { |     while ((c = getopt(argc, argv, "CfiqP:uz")) != -1) { | ||||||
|         switch (c) { |         switch (c) { | ||||||
|         case 'C': |         case 'C': | ||||||
|             ctx->Cflag = true; |             ctx->Cflag = true; | ||||||
| @ -1414,6 +1421,11 @@ static int aio_write_f(BlockBackend *blk, int argc, char **argv) | |||||||
|                 return 0; |                 return 0; | ||||||
|             } |             } | ||||||
|             break; |             break; | ||||||
|  |         case 'i': | ||||||
|  |             printf("injecting invalid write request\n"); | ||||||
|  |             block_acct_invalid(blk_get_stats(blk), BLOCK_ACCT_WRITE); | ||||||
|  |             g_free(ctx); | ||||||
|  |             return 0; | ||||||
|         case 'z': |         case 'z': | ||||||
|             ctx->zflag = true; |             ctx->zflag = true; | ||||||
|             break; |             break; | ||||||
|  | |||||||
| @ -226,18 +226,11 @@ sector = "%d" | |||||||
| 
 | 
 | ||||||
|         highest_offset = wr_ops * wr_size |         highest_offset = wr_ops * wr_size | ||||||
| 
 | 
 | ||||||
|         # Two types of invalid operations: unaligned length and unaligned offset |         for i in range(invalid_rd_ops): | ||||||
|         for i in range(invalid_rd_ops / 2): |             ops.append("aio_read -i 0 512") | ||||||
|             ops.append("aio_read 0 511") |  | ||||||
| 
 | 
 | ||||||
|         for i in range(invalid_rd_ops / 2, invalid_rd_ops): |         for i in range(invalid_wr_ops): | ||||||
|             ops.append("aio_read 13 512") |             ops.append("aio_write -i 0 512") | ||||||
| 
 |  | ||||||
|         for i in range(invalid_wr_ops / 2): |  | ||||||
|             ops.append("aio_write 0 511") |  | ||||||
| 
 |  | ||||||
|         for i in range(invalid_wr_ops / 2, invalid_wr_ops): |  | ||||||
|             ops.append("aio_write 13 512") |  | ||||||
| 
 | 
 | ||||||
|         for i in range(failed_rd_ops): |         for i in range(failed_rd_ops): | ||||||
|             ops.append("aio_read %d 512" % bad_offset) |             ops.append("aio_read %d 512" % bad_offset) | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Eric Blake
						Eric Blake