examples/dd: validate block count and max in flight params
Signed-off-by: David Disseldorp <ddiss@suse.de>
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user