examples/dd: validate block count and max in flight params

Signed-off-by: David Disseldorp <ddiss@suse.de>
This commit is contained in:
David Disseldorp
2017-01-04 18:22:43 +01:00
parent e8afafb32d
commit 2b9abd9ac8

View File

@@ -23,16 +23,17 @@
#include <poll.h> #include <poll.h>
#include <getopt.h> #include <getopt.h>
#include <unistd.h> #include <unistd.h>
#include <limits.h>
#include "iscsi.h" #include "iscsi.h"
#include "scsi-lowlevel.h" #include "scsi-lowlevel.h"
const char *initiator = "iqn.2010-11.ronnie:iscsi-inq"; const char *initiator = "iqn.2010-11.ronnie:iscsi-inq";
int max_in_flight = 50; uint32_t max_in_flight = 50;
int blocks_per_io = 200; uint32_t blocks_per_io = 200;
struct client { struct client {
int finished; int finished;
int in_flight; uint32_t in_flight;
struct iscsi_context *src_iscsi; struct iscsi_context *src_iscsi;
int src_lun; int src_lun;
@@ -153,7 +154,7 @@ void read_cb(struct iscsi_context *iscsi _U_, int status, void *command_data, vo
void fill_read_queue(struct client *client) void fill_read_queue(struct client *client)
{ {
int num_blocks; uint32_t num_blocks;
while(client->in_flight < max_in_flight && client->pos < client->src_num_blocks) { while(client->in_flight < max_in_flight && client->pos < client->src_num_blocks) {
struct scsi_task *task; struct scsi_task *task;
@@ -214,6 +215,8 @@ int main(int argc, char *argv[])
while ((c = getopt_long(argc, argv, "d:s:i:m:b:p6n", long_options, while ((c = getopt_long(argc, argv, "d:s:i:m:b:p6n", long_options,
&option_index)) != -1) { &option_index)) != -1) {
char *endptr;
switch (c) { switch (c) {
case 'd': case 'd':
dst_url = optarg; dst_url = optarg;
@@ -231,10 +234,20 @@ int main(int argc, char *argv[])
client.use_16_for_rw = 1; client.use_16_for_rw = 1;
break; break;
case 'm': case 'm':
max_in_flight = atoi(optarg); max_in_flight = strtoul(optarg, &endptr, 10);
if (*endptr != '\0' || max_in_flight == UINT_MAX) {
fprintf(stderr, "Invalid max in flight: %s\n",
optarg);
exit(10);
}
break; break;
case 'b': case 'b':
blocks_per_io = atoi(optarg); blocks_per_io = strtoul(optarg, &endptr, 10);
if (*endptr != '\0' || blocks_per_io == UINT_MAX) {
fprintf(stderr, "Invalid blocks per I/O: %s\n",
optarg);
exit(10);
}
break; break;
case 'n': case 'n':
client.ignore_errors = 1; client.ignore_errors = 1;