examples/iscsi-dd: use common iscsi_endpoint struct

Signed-off-by: David Disseldorp <ddiss@suse.de>
This commit is contained in:
David Disseldorp
2020-08-06 19:41:29 +02:00
parent c54c4cd202
commit eb4c8e20ff

View File

@@ -32,22 +32,23 @@ const char *initiator = "iqn.2010-11.ronnie:iscsi-inq";
uint32_t max_in_flight = 50;
uint32_t blocks_per_io = 200;
struct iscsi_endpoint {
struct iscsi_context *iscsi;
int lun;
int blocksize;
uint64_t num_blocks;
struct scsi_inquiry_device_designator tgt_desig;
};
struct client {
int finished;
uint32_t in_flight;
struct iscsi_context *src_iscsi;
int src_lun;
int src_blocksize;
uint64_t src_num_blocks;
struct scsi_inquiry_device_designator src_tgt_desig;
struct iscsi_endpoint src;
struct iscsi_endpoint dst;
uint64_t pos;
struct iscsi_context *dst_iscsi;
int dst_lun;
int dst_blocksize;
uint64_t dst_num_blocks;
struct scsi_inquiry_device_designator dst_tgt_desig;
int use_16_for_rw;
int use_xcopy;
int progress;
@@ -87,10 +88,10 @@ void write_cb(struct iscsi_context *iscsi, int status, void *command_data, void
fill_read_queue(client);
if (client->progress) {
printf("\r%"PRIu64" of %"PRIu64" blocks transferred.", client->pos, client->src_num_blocks);
printf("\r%"PRIu64" of %"PRIu64" blocks transferred.", client->pos, client->src.num_blocks);
}
if ((client->in_flight == 0) && (client->pos == client->src_num_blocks)) {
if ((client->in_flight == 0) && (client->pos == client->src.num_blocks)) {
client->finished = 1;
if (client->progress) {
printf("\n");
@@ -134,20 +135,20 @@ void read_cb(struct iscsi_context *iscsi _U_, int status, void *command_data, vo
printf("Failed to unmarshall READ16 CDB.\n");
exit(10);
}
task2 = iscsi_write16_task(client->dst_iscsi, client->dst_lun,
read16_cdb->lba, task->datain.data, task->datain.size,
client->dst_blocksize, 0, 0, 0, 0, 0,
write_cb, wt);
task2 = iscsi_write16_task(client->dst.iscsi, client->dst.lun,
read16_cdb->lba, task->datain.data, task->datain.size,
client->dst.blocksize, 0, 0, 0, 0, 0,
write_cb, wt);
} else {
read10_cdb = scsi_cdb_unmarshall(task, SCSI_OPCODE_READ10);
if (read10_cdb == NULL) {
printf("Failed to unmarshall READ16 CDB.\n");
exit(10);
}
task2 = iscsi_write10_task(client->dst_iscsi, client->dst_lun,
read10_cdb->lba, task->datain.data, task->datain.size,
client->dst_blocksize, 0, 0, 0, 0, 0,
write_cb, wt);
task2 = iscsi_write10_task(client->dst.iscsi, client->dst.lun,
read10_cdb->lba, task->datain.data, task->datain.size,
client->dst.blocksize, 0, 0, 0, 0, 0,
write_cb, wt);
}
if (task2 == NULL) {
printf("failed to send read16 command\n");
@@ -161,27 +162,27 @@ void fill_read_queue(struct client *client)
{
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;
client->in_flight++;
num_blocks = client->src_num_blocks - client->pos;
num_blocks = client->src.num_blocks - client->pos;
if (num_blocks > blocks_per_io) {
num_blocks = blocks_per_io;
}
if (client->use_16_for_rw) {
task = iscsi_read16_task(client->src_iscsi,
client->src_lun, client->pos,
num_blocks * client->src_blocksize,
client->src_blocksize, 0, 0, 0, 0, 0,
read_cb, client);
task = iscsi_read16_task(client->src.iscsi,
client->src.lun, client->pos,
num_blocks * client->src.blocksize,
client->src.blocksize, 0, 0, 0, 0, 0,
read_cb, client);
} else {
task = iscsi_read10_task(client->src_iscsi,
client->src_lun, client->pos,
num_blocks * client->src_blocksize,
client->src_blocksize, 0, 0, 0, 0, 0,
read_cb, client);
task = iscsi_read10_task(client->src.iscsi,
client->src.lun, client->pos,
num_blocks * client->src.blocksize,
client->src.blocksize, 0, 0, 0, 0, 0,
read_cb, client);
}
if (task == NULL) {
printf("failed to send read10/16 command\n");
@@ -300,10 +301,10 @@ void xcopy_cb(struct iscsi_context *iscsi _U_, int status, void *command_data, v
if (client->progress) {
printf("\r%"PRIu64" of %"PRIu64" blocks transferred.",
client->pos, client->src_num_blocks);
client->pos, client->src.num_blocks);
}
if ((client->in_flight == 0) && (client->pos == client->src_num_blocks)) {
if ((client->in_flight == 0) && (client->pos == client->src.num_blocks)) {
client->finished = 1;
if (client->progress) {
printf("\n");
@@ -314,7 +315,7 @@ void xcopy_cb(struct iscsi_context *iscsi _U_, int status, void *command_data, v
void fill_xcopy_queue(struct client *client)
{
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 iscsi_data data;
unsigned char *xcopybuf;
@@ -325,7 +326,7 @@ void fill_xcopy_queue(struct client *client)
client->in_flight++;
num_blocks = client->src_num_blocks - client->pos;
num_blocks = client->src.num_blocks - client->pos;
if (num_blocks > blocks_per_io) {
num_blocks = blocks_per_io;
}
@@ -345,11 +346,11 @@ void fill_xcopy_queue(struct client *client)
/* Initialise CSCD list with one src + one dst descriptor */
offset = XCOPY_DESC_OFFSET;
offset += populate_tgt_desc(xcopybuf + offset,
&client->src_tgt_desig,
0, client->src_blocksize);
&client->src.tgt_desig,
0, client->src.blocksize);
offset += populate_tgt_desc(xcopybuf + offset,
&client->dst_tgt_desig,
0, client->dst_blocksize);
&client->dst.tgt_desig,
0, client->dst.blocksize);
tgt_desc_len = offset - XCOPY_DESC_OFFSET;
/* Initialise one segment descriptor */
@@ -361,8 +362,8 @@ void fill_xcopy_queue(struct client *client)
populate_param_header(xcopybuf, 1, 0, LIST_ID_USAGE_DISCARD, 0,
tgt_desc_len, seg_desc_len, 0);
task = iscsi_extended_copy_task(client->src_iscsi,
client->src_lun,
task = iscsi_extended_copy_task(client->src.iscsi,
client->src.lun,
&data, xcopy_cb, client);
if (task == NULL) {
printf("failed to send XCOPY command\n");
@@ -651,77 +652,77 @@ int main(int argc, char *argv[])
usage_exit(10);
}
client.src_iscsi = iscsi_create_context(initiator);
if (client.src_iscsi == NULL) {
client.src.iscsi = iscsi_create_context(initiator);
if (client.src.iscsi == NULL) {
fprintf(stderr, "Failed to create context\n");
exit(10);
}
iscsi_url = iscsi_parse_full_url(client.src_iscsi, src_url);
iscsi_url = iscsi_parse_full_url(client.src.iscsi, src_url);
if (iscsi_url == NULL) {
fprintf(stderr, "Failed to parse URL: %s\n",
iscsi_get_error(client.src_iscsi));
iscsi_get_error(client.src.iscsi));
exit(10);
}
iscsi_set_session_type(client.src_iscsi, ISCSI_SESSION_NORMAL);
iscsi_set_header_digest(client.src_iscsi, ISCSI_HEADER_DIGEST_NONE_CRC32C);
if (iscsi_full_connect_sync(client.src_iscsi, iscsi_url->portal, iscsi_url->lun) != 0) {
fprintf(stderr, "Login Failed. %s\n", iscsi_get_error(client.src_iscsi));
iscsi_set_session_type(client.src.iscsi, ISCSI_SESSION_NORMAL);
iscsi_set_header_digest(client.src.iscsi, ISCSI_HEADER_DIGEST_NONE_CRC32C);
if (iscsi_full_connect_sync(client.src.iscsi, iscsi_url->portal, iscsi_url->lun) != 0) {
fprintf(stderr, "Login Failed. %s\n", iscsi_get_error(client.src.iscsi));
iscsi_destroy_url(iscsi_url);
iscsi_destroy_context(client.src_iscsi);
iscsi_destroy_context(client.src.iscsi);
exit(10);
}
client.src_lun = iscsi_url->lun;
client.src.lun = iscsi_url->lun;
iscsi_destroy_url(iscsi_url);
readcap(client.src_iscsi, client.src_lun, client.use_16_for_rw,
&client.src_blocksize, &client.src_num_blocks);
readcap(client.src.iscsi, client.src.lun, client.use_16_for_rw,
&client.src.blocksize, &client.src.num_blocks);
if (client.use_xcopy) {
cscd_ident_inq(client.src_iscsi, client.src_lun,
&client.src_tgt_desig);
cscd_param_check(client.src_iscsi, client.src_lun,
client.src_blocksize);
cscd_ident_inq(client.src.iscsi, client.src.lun,
&client.src.tgt_desig);
cscd_param_check(client.src.iscsi, client.src.lun,
client.src.blocksize);
}
client.dst_iscsi = iscsi_create_context(initiator);
if (client.dst_iscsi == NULL) {
client.dst.iscsi = iscsi_create_context(initiator);
if (client.dst.iscsi == NULL) {
fprintf(stderr, "Failed to create context\n");
exit(10);
}
iscsi_url = iscsi_parse_full_url(client.dst_iscsi, dst_url);
iscsi_url = iscsi_parse_full_url(client.dst.iscsi, dst_url);
if (iscsi_url == NULL) {
fprintf(stderr, "Failed to parse URL: %s\n",
iscsi_get_error(client.dst_iscsi));
iscsi_get_error(client.dst.iscsi));
exit(10);
}
iscsi_set_session_type(client.dst_iscsi, ISCSI_SESSION_NORMAL);
iscsi_set_header_digest(client.dst_iscsi, ISCSI_HEADER_DIGEST_NONE_CRC32C);
if (iscsi_full_connect_sync(client.dst_iscsi, iscsi_url->portal, iscsi_url->lun) != 0) {
fprintf(stderr, "Login Failed. %s\n", iscsi_get_error(client.dst_iscsi));
iscsi_set_session_type(client.dst.iscsi, ISCSI_SESSION_NORMAL);
iscsi_set_header_digest(client.dst.iscsi, ISCSI_HEADER_DIGEST_NONE_CRC32C);
if (iscsi_full_connect_sync(client.dst.iscsi, iscsi_url->portal, iscsi_url->lun) != 0) {
fprintf(stderr, "Login Failed. %s\n", iscsi_get_error(client.dst.iscsi));
iscsi_destroy_url(iscsi_url);
iscsi_destroy_context(client.dst_iscsi);
iscsi_destroy_context(client.dst.iscsi);
exit(10);
}
client.dst_lun = iscsi_url->lun;
client.dst.lun = iscsi_url->lun;
iscsi_destroy_url(iscsi_url);
readcap(client.dst_iscsi, client.dst_lun, client.use_16_for_rw,
&client.dst_blocksize, &client.dst_num_blocks);
readcap(client.dst.iscsi, client.dst.lun, client.use_16_for_rw,
&client.dst.blocksize, &client.dst.num_blocks);
if (client.use_xcopy) {
cscd_ident_inq(client.dst_iscsi, client.dst_lun,
&client.dst_tgt_desig);
cscd_param_check(client.dst_iscsi, client.dst_lun,
client.dst_blocksize);
cscd_ident_inq(client.dst.iscsi, client.dst.lun,
&client.dst.tgt_desig);
cscd_param_check(client.dst.iscsi, client.dst.lun,
client.dst.blocksize);
}
if (client.src_blocksize != client.dst_blocksize) {
fprintf(stderr, "source LUN has different blocksize than destination than destination (%d != %d sectors)\n", client.src_blocksize, client.dst_blocksize);
if (client.src.blocksize != client.dst.blocksize) {
fprintf(stderr, "source LUN has different blocksize than destination than destination (%d != %d sectors)\n", client.src.blocksize, client.dst.blocksize);
exit(10);
}
if (client.src_num_blocks > client.dst_num_blocks) {
fprintf(stderr, "source LUN is bigger than destination (%"PRIu64" > %"PRIu64" sectors)\n", client.src_num_blocks, client.dst_num_blocks);
if (client.src.num_blocks > client.dst.num_blocks) {
fprintf(stderr, "source LUN is bigger than destination (%"PRIu64" > %"PRIu64" sectors)\n", client.src.num_blocks, client.dst.num_blocks);
exit(10);
}
@@ -737,10 +738,10 @@ int main(int argc, char *argv[])
}
while (client.finished == 0) {
pfd[0].fd = iscsi_get_fd(client.src_iscsi);
pfd[0].events = iscsi_which_events(client.src_iscsi);
pfd[1].fd = iscsi_get_fd(client.dst_iscsi);
pfd[1].events = iscsi_which_events(client.dst_iscsi);
pfd[0].fd = iscsi_get_fd(client.src.iscsi);
pfd[0].events = iscsi_which_events(client.src.iscsi);
pfd[1].fd = iscsi_get_fd(client.dst.iscsi);
pfd[1].events = iscsi_which_events(client.dst.iscsi);
if (!pfd[0].events && !pfd[1].events) {
sleep(1);
@@ -751,12 +752,12 @@ int main(int argc, char *argv[])
printf("Poll failed");
exit(10);
}
if (iscsi_service(client.src_iscsi, pfd[0].revents) < 0) {
printf("iscsi_service failed with : %s\n", iscsi_get_error(client.src_iscsi));
if (iscsi_service(client.src.iscsi, pfd[0].revents) < 0) {
printf("iscsi_service failed with : %s\n", iscsi_get_error(client.src.iscsi));
break;
}
if (iscsi_service(client.dst_iscsi, pfd[1].revents) < 0) {
printf("iscsi_service failed with : %s\n", iscsi_get_error(client.dst_iscsi));
if (iscsi_service(client.dst.iscsi, pfd[1].revents) < 0) {
printf("iscsi_service failed with : %s\n", iscsi_get_error(client.dst.iscsi));
break;
}
}
@@ -766,14 +767,14 @@ int main(int argc, char *argv[])
gettime_ret = clock_gettime(CLOCK_MONOTONIC, &end_time);
if (gettime_ret == 0) {
show_perf(&start_time, &end_time, client.pos,
client.src_blocksize);
client.src.blocksize);
}
}
iscsi_logout_sync(client.src_iscsi);
iscsi_destroy_context(client.src_iscsi);
iscsi_logout_sync(client.dst_iscsi);
iscsi_destroy_context(client.dst_iscsi);
iscsi_logout_sync(client.src.iscsi);
iscsi_destroy_context(client.src.iscsi);
iscsi_logout_sync(client.dst.iscsi);
iscsi_destroy_context(client.dst.iscsi);
return 0;
}