examples/iscsi-dd: use common init function for src and dst endpoints

Remove a bunch of duplicate code by sharing a function for source and
destination endpoint initialization.

Signed-off-by: David Disseldorp <ddiss@suse.de>
This commit is contained in:
David Disseldorp
2020-08-07 13:42:32 +02:00
parent eb4c8e20ff
commit 37e6e112b6

View File

@@ -562,11 +562,59 @@ static void show_perf(struct timespec *start_time,
" %g%c/s.\n", num_blocks, block_size, elapsed, ubytes_per_sec, u[i]);
}
static void iscsi_endpoint_init(const char *url,
const char *usage,
int use_16_for_rw,
int use_xcopy,
struct iscsi_endpoint *endpoint)
{
struct iscsi_url *iscsi_url;
if (url == NULL) {
fprintf(stderr, "You must specify a %s url\n"
" --%s iscsi://<host>[:<port>]/<target-iqn>/<lun>\n",
usage, usage);
usage_exit(10);
}
endpoint->iscsi = iscsi_create_context(initiator);
if (endpoint->iscsi == NULL) {
fprintf(stderr, "Failed to create context\n");
exit(10);
}
iscsi_url = iscsi_parse_full_url(endpoint->iscsi, url);
if (iscsi_url == NULL) {
fprintf(stderr, "Failed to parse URL: %s\n",
iscsi_get_error(endpoint->iscsi));
iscsi_destroy_context(endpoint->iscsi);
exit(10);
}
iscsi_set_session_type(endpoint->iscsi, ISCSI_SESSION_NORMAL);
iscsi_set_header_digest(endpoint->iscsi, ISCSI_HEADER_DIGEST_NONE_CRC32C);
if (iscsi_full_connect_sync(endpoint->iscsi, iscsi_url->portal, iscsi_url->lun) != 0) {
fprintf(stderr, "Login Failed. %s\n", iscsi_get_error(endpoint->iscsi));
iscsi_destroy_url(iscsi_url);
iscsi_destroy_context(endpoint->iscsi);
exit(10);
}
endpoint->lun = iscsi_url->lun;
iscsi_destroy_url(iscsi_url);
readcap(endpoint->iscsi, endpoint->lun, use_16_for_rw,
&endpoint->blocksize, &endpoint->num_blocks);
if (use_xcopy) {
cscd_ident_inq(endpoint->iscsi, endpoint->lun,
&endpoint->tgt_desig);
cscd_param_check(endpoint->iscsi, endpoint->lun,
endpoint->blocksize);
}
}
int main(int argc, char *argv[])
{
char *src_url = NULL;
char *dst_url = NULL;
struct iscsi_url *iscsi_url;
int c;
struct pollfd pfd[2];
struct client client;
@@ -641,80 +689,10 @@ int main(int argc, char *argv[])
}
}
if (src_url == NULL) {
fprintf(stderr, "You must specify source url\n"
" --src iscsi://<host>[:<port>]/<target-iqn>/<lun>\n");
usage_exit(10);
}
if (dst_url == NULL) {
fprintf(stderr, "You must specify destination url\n"
" --dst iscsi://<host>[:<port>]/<target-iqn>/<lun>\n");
usage_exit(10);
}
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);
if (iscsi_url == NULL) {
fprintf(stderr, "Failed to parse URL: %s\n",
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_destroy_url(iscsi_url);
iscsi_destroy_context(client.src.iscsi);
exit(10);
}
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);
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);
}
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);
if (iscsi_url == NULL) {
fprintf(stderr, "Failed to parse URL: %s\n",
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_destroy_url(iscsi_url);
iscsi_destroy_context(client.dst.iscsi);
exit(10);
}
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);
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);
}
iscsi_endpoint_init(src_url, "src", client.use_16_for_rw,
client.use_xcopy, &client.src);
iscsi_endpoint_init(dst_url, "dst", client.use_16_for_rw,
client.use_xcopy, &client.dst);
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);