Hello community, here is the log from the commit of package libiscsi for openSUSE:Factory checked in at 2020-08-15 21:18:38 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/libiscsi (Old) and /work/SRC/openSUSE:Factory/.libiscsi.new.3399 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libiscsi" Sat Aug 15 21:18:38 2020 rev:14 rq:826266 version:1.19.0+git.20200812 Changes: -------- --- /work/SRC/openSUSE:Factory/libiscsi/libiscsi.changes 2020-05-29 21:13:40.226387096 +0200 +++ /work/SRC/openSUSE:Factory/.libiscsi.new.3399/libiscsi.changes 2020-08-15 21:19:00.731576485 +0200 @@ -1,0 +2,18 @@ +Thu Aug 13 11:36:17 UTC 2020 - Martin Pluskal <mplus...@suse.com> + +- Update to version 1.19.0+git.20200812: + * .travis.yml: Also build for the ppc64le architecture + * iscsi-ls: Fix iser url scheme parsing + * test-tool: Use block_size instead of hardcoded 512 bytes + * examples/iscsi-dd: use common init function for src and dst endpoints + * examples/iscsi-dd: use common iscsi_endpoint struct + * iscsi-perf: Add explicit casts to avoid two warnings + * socket: Make the pdu timeout handling aware of old iscsi context + * libiscsi: Make the cancellation aware of the pdus in old iscsi context + * pdu: Remove the checking for iscsi->is_loggedin in iscsi_cancel_pdus() + * libiscsi: Avoid discontinuities in cmdsn ordering in some cases + * test-tool: Use block_size instead of hardcoded 512 bytes + * exclude ld_iscsi.so from RPM + * include iser-private.h in make dist tarball + +------------------------------------------------------------------- Old: ---- libiscsi-1.19.0+git.20200521.obscpio New: ---- libiscsi-1.19.0+git.20200812.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ libiscsi.spec ++++++ --- /var/tmp/diff_new_pack.1KEJck/_old 2020-08-15 21:19:01.675577024 +0200 +++ /var/tmp/diff_new_pack.1KEJck/_new 2020-08-15 21:19:01.679577027 +0200 @@ -18,7 +18,7 @@ %define sover 9 Name: libiscsi -Version: 1.19.0+git.20200521 +Version: 1.19.0+git.20200812 Release: 0 Summary: iSCSI client library and utilities License: GPL-2.0-only AND LGPL-2.1-only ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.1KEJck/_old 2020-08-15 21:19:01.723577051 +0200 +++ /var/tmp/diff_new_pack.1KEJck/_new 2020-08-15 21:19:01.723577051 +0200 @@ -3,4 +3,4 @@ <param name="url">g...@github.com:sahlberg/libiscsi.git</param> <param name="changesrevision">e6bcdf5fdbf39729399c4f0914661ca1055107a1</param></service><service name="tar_scm"> <param name="url">https://github.com/sahlberg/libiscsi.git</param> - <param name="changesrevision">33c66f2c39a01b4e109270ffcc83e2e2daf73ecb</param></service></servicedata> \ No newline at end of file + <param name="changesrevision">e9cefe7e421b19f9b984ff3fc8e76856cb439d14</param></service></servicedata> \ No newline at end of file ++++++ libiscsi-1.19.0+git.20200521.obscpio -> libiscsi-1.19.0+git.20200812.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libiscsi-1.19.0+git.20200521/.travis.yml new/libiscsi-1.19.0+git.20200812/.travis.yml --- old/libiscsi-1.19.0+git.20200521/.travis.yml 2020-05-22 03:39:49.000000000 +0200 +++ new/libiscsi-1.19.0+git.20200812/.travis.yml 2020-08-13 05:07:10.000000000 +0200 @@ -4,6 +4,10 @@ - linux - osx +arch: + - amd64 + - ppc64le + addons: apt: packages: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libiscsi-1.19.0+git.20200521/Makefile.am new/libiscsi-1.19.0+git.20200812/Makefile.am --- old/libiscsi-1.19.0+git.20200521/Makefile.am 2020-05-22 03:39:49.000000000 +0200 +++ new/libiscsi-1.19.0+git.20200812/Makefile.am 2020-08-13 05:07:10.000000000 +0200 @@ -29,5 +29,6 @@ iscsi_includedir = $(includedir)/iscsi dist_iscsi_include_HEADERS = include/iscsi.h include/scsi-lowlevel.h -dist_noinst_HEADERS = include/iscsi-private.h include/md5.h include/slist.h +dist_noinst_HEADERS = include/iscsi-private.h include/md5.h include/slist.h \ + include/iser-private.h diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libiscsi-1.19.0+git.20200521/examples/iscsi-dd.c new/libiscsi-1.19.0+git.20200812/examples/iscsi-dd.c --- old/libiscsi-1.19.0+git.20200521/examples/iscsi-dd.c 2020-05-22 03:39:49.000000000 +0200 +++ new/libiscsi-1.19.0+git.20200812/examples/iscsi-dd.c 2020-08-13 05:07:10.000000000 +0200 @@ -32,22 +32,23 @@ 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 @@ 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 @@ 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 @@ { 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 @@ 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 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 @@ 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 @@ /* 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 @@ 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"); @@ -561,11 +562,59 @@ " %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; @@ -640,88 +689,18 @@ } } - 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); + 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 +716,10 @@ } 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 +730,12 @@ 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 +745,14 @@ 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; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libiscsi-1.19.0+git.20200521/lib/iscsi-command.c new/libiscsi-1.19.0+git.20200812/lib/iscsi-command.c --- old/libiscsi-1.19.0+git.20200521/lib/iscsi-command.c 2020-05-22 03:39:49.000000000 +0200 +++ new/libiscsi-1.19.0+git.20200812/lib/iscsi-command.c 2020-08-13 05:07:10.000000000 +0200 @@ -271,7 +271,7 @@ iscsi_pdu_set_expxferlen(pdu, task->expxferlen); /* cmdsn */ - iscsi_pdu_set_cmdsn(pdu, iscsi->cmdsn++); + iscsi_pdu_set_cmdsn(pdu, iscsi->cmdsn); /* cdb */ iscsi_pdu_set_cdb(pdu, task); @@ -285,6 +285,7 @@ iscsi->drv->free_pdu(iscsi, pdu); return -1; } + iscsi->cmdsn++; /* The F flag is not set. This means we haven't sent all the unsolicited * data yet. Sent as much as we are allowed as a train of DATA-OUT PDUs. @@ -2667,6 +2668,9 @@ struct scsi_task *task) { struct iscsi_pdu *pdu; + struct iscsi_pdu *next_pdu; + uint32_t cmdsn_gap = 0; + int ret = -1; for (pdu = iscsi->waitpdu; pdu; pdu = pdu->next) { if (pdu->itt == task->itt) { @@ -2679,22 +2683,45 @@ return 0; } } - for (pdu = iscsi->outqueue; pdu; pdu = pdu->next) { + for (pdu = iscsi->outqueue; pdu; pdu = next_pdu) { + next_pdu = pdu->next; + + if (cmdsn_gap > 0) { + iscsi_pdu_set_cmdsn(pdu, pdu->cmdsn - cmdsn_gap); + } + if (pdu->itt == task->itt) { ISCSI_LIST_REMOVE(&iscsi->outqueue, pdu); if (pdu->callback) { pdu->callback(iscsi, SCSI_STATUS_CANCELLED, NULL, pdu->private_data); } + if (!(pdu->outdata.data[0] & ISCSI_PDU_IMMEDIATE) && + (pdu->outdata.data[0] & 0x3f) != ISCSI_PDU_DATA_OUT) { + iscsi->cmdsn--; + cmdsn_gap++; + } iscsi->drv->free_pdu(iscsi, pdu); - return 0; + ret = 0; + if (!cmdsn_gap) { + break; + } } } - return -1; + + if (iscsi->old_iscsi) { + return iscsi_scsi_cancel_task(iscsi->old_iscsi, task); + } + + return ret; } void iscsi_scsi_cancel_all_tasks(struct iscsi_context *iscsi) { iscsi_cancel_pdus(iscsi); + + if (iscsi->old_iscsi) { + iscsi_cancel_pdus(iscsi->old_iscsi); + } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libiscsi-1.19.0+git.20200521/lib/nop.c new/libiscsi-1.19.0+git.20200812/lib/nop.c --- old/libiscsi-1.19.0+git.20200521/lib/nop.c 2020-05-22 03:39:49.000000000 +0200 +++ new/libiscsi-1.19.0+git.20200812/lib/nop.c 2020-08-13 05:07:10.000000000 +0200 @@ -64,7 +64,7 @@ iscsi_pdu_set_lun(pdu, 0); /* cmdsn */ - iscsi_pdu_set_cmdsn(pdu, iscsi->cmdsn++); + iscsi_pdu_set_cmdsn(pdu, iscsi->cmdsn); pdu->callback = cb; pdu->private_data = private_data; @@ -83,6 +83,7 @@ return -1; } + iscsi->cmdsn++; iscsi->nops_in_flight++; ISCSI_LOG(iscsi, (iscsi->nops_in_flight > 1) ? 1 : 6, "NOP Out Send (nops_in_flight: %d, pdu->cmdsn %08x, pdu->itt %08x, pdu->ttt %08x, iscsi->maxcmdsn %08x, iscsi->expcmdsn %08x)", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libiscsi-1.19.0+git.20200521/lib/pdu.c new/libiscsi-1.19.0+git.20200812/lib/pdu.c --- old/libiscsi-1.19.0+git.20200521/lib/pdu.c 2020-05-22 03:39:49.000000000 +0200 +++ new/libiscsi-1.19.0+git.20200812/lib/pdu.c 2020-08-13 05:07:10.000000000 +0200 @@ -719,10 +719,14 @@ struct iscsi_pdu *pdu; struct iscsi_pdu *next_pdu; time_t t = time(NULL); + uint32_t cmdsn_gap = 0; for (pdu = iscsi->outqueue; pdu; pdu = next_pdu) { next_pdu = pdu->next; + if (cmdsn_gap > 0) { + iscsi_pdu_set_cmdsn(pdu, pdu->cmdsn - cmdsn_gap); + } if (pdu->scsi_timeout == 0) { /* no timeout for this pdu */ continue; @@ -731,6 +735,11 @@ /* not expired yet */ continue; } + if (!(pdu->outdata.data[0] & ISCSI_PDU_IMMEDIATE) && + (pdu->outdata.data[0] & 0x3f) != ISCSI_PDU_DATA_OUT) { + iscsi->cmdsn--; + cmdsn_gap++; + } ISCSI_LIST_REMOVE(&iscsi->outqueue, pdu); iscsi_set_error(iscsi, "command timed out"); iscsi_dump_pdu_header(iscsi, pdu->outdata.data); @@ -775,21 +784,21 @@ while ((pdu = iscsi->outqueue)) { ISCSI_LIST_REMOVE(&iscsi->outqueue, pdu); - if (iscsi->is_loggedin && pdu->callback) { - /* If an error happened during connect/login, - we don't want to call any of the callbacks. - */ + if (pdu->callback) { pdu->callback(iscsi, SCSI_STATUS_CANCELLED, NULL, pdu->private_data); } iscsi->drv->free_pdu(iscsi, pdu); + if (!(pdu->outdata.data[0] & ISCSI_PDU_IMMEDIATE) && + (pdu->outdata.data[0] & 0x3f) != ISCSI_PDU_DATA_OUT) { + iscsi->cmdsn--; + } + + } while ((pdu = iscsi->waitpdu)) { ISCSI_LIST_REMOVE(&iscsi->waitpdu, pdu); - if (iscsi->is_loggedin && pdu->callback) { - /* If an error happened during connect/login, - we don't want to call any of the callbacks. - */ + if (pdu->callback) { pdu->callback(iscsi, SCSI_STATUS_CANCELLED, NULL, pdu->private_data); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libiscsi-1.19.0+git.20200521/lib/socket.c new/libiscsi-1.19.0+git.20200812/lib/socket.c --- old/libiscsi-1.19.0+git.20200521/lib/socket.c 2020-05-22 03:39:49.000000000 +0200 +++ new/libiscsi-1.19.0+git.20200812/lib/socket.c 2020-08-13 05:07:10.000000000 +0200 @@ -913,7 +913,7 @@ return iscsi_reconnect(iscsi); } else { if (iscsi->old_iscsi) { - return 0; + goto check_timeout; } } } @@ -999,8 +999,14 @@ return iscsi_service_reconnect_if_loggedin(iscsi); } } + +check_timeout: iscsi_timeout_scan(iscsi); + if (iscsi->old_iscsi) { + iscsi_timeout_scan(iscsi->old_iscsi); + } + return 0; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libiscsi-1.19.0+git.20200521/packaging/RPM/libiscsi.spec.in new/libiscsi-1.19.0+git.20200812/packaging/RPM/libiscsi.spec.in --- old/libiscsi-1.19.0+git.20200521/packaging/RPM/libiscsi.spec.in 2020-05-22 03:39:49.000000000 +0200 +++ new/libiscsi-1.19.0+git.20200812/packaging/RPM/libiscsi.spec.in 2020-08-13 05:07:10.000000000 +0200 @@ -70,7 +70,6 @@ %files utils %doc COPYING LICENCE-GPL-2.txt LICENCE-LGPL-2.1.txt README TODO -%{_bindir}/ld_iscsi.so %{_bindir}/iscsi-ls %{_bindir}/iscsi-inq %{_bindir}/iscsi-perf diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libiscsi-1.19.0+git.20200521/test-tool/iscsi-support.c new/libiscsi-1.19.0+git.20200812/test-tool/iscsi-support.c --- old/libiscsi-1.19.0+git.20200521/test-tool/iscsi-support.c 2020-05-22 03:39:49.000000000 +0200 +++ new/libiscsi-1.19.0+git.20200812/test-tool/iscsi-support.c 2020-08-13 05:07:10.000000000 +0200 @@ -1308,19 +1308,18 @@ { struct scsi_task *task; const uint32_t lba = 1; - const int blksize = 512; - const uint32_t datalen = 1 * blksize; + const uint32_t datalen = 1 * block_size; int ret = 0; /* - * try to read the second 512-byte block + * try to read the second block */ logging(LOG_VERBOSE, "Send READ10 to verify READ works init=%s", sdev->iscsi_ctx ? sdev->iscsi_ctx->initiator_name : sdev->sgio_dev); - task = scsi_cdb_read10(lba, datalen, blksize, 0, 0, 0, 0, 0); + task = scsi_cdb_read10(lba, datalen, block_size, 0, 0, 0, 0, 0); assert(task != NULL); task = send_scsi_command(sdev, task, NULL); @@ -1351,19 +1350,18 @@ struct scsi_task *task; struct iscsi_data d; const uint32_t lba = 1; - const int blksize = 512; - const uint32_t datalen = 1 * blksize; + const uint32_t datalen = 1 * block_size; int ret = 0; /* - * try to write the second 512-byte block + * try to write the second block */ logging(LOG_VERBOSE, "Send WRITE10 to verify WRITE works init=%s", sdev->iscsi_ctx ? sdev->iscsi_ctx->initiator_name : sdev->sgio_dev); - task = scsi_cdb_write10(lba, datalen, blksize, 0, 0, 0, 0, 0); + task = scsi_cdb_write10(lba, datalen, block_size, 0, 0, 0, 0, 0); assert(task != NULL); d.data = buf; @@ -1391,20 +1389,19 @@ { struct scsi_task *task; const uint32_t lba = 1; - const int blksize = 512; - const uint32_t datalen = 1 * blksize; + const uint32_t datalen = 1 * block_size; int ret = 0; /* - * try to read the second 512-byte block -- should fail + * try to read the second block -- should fail */ logging(LOG_VERBOSE, "Send READ10 to verify READ does not work init=%s", sdev->iscsi_ctx ? sdev->iscsi_ctx->initiator_name : sdev->sgio_dev); - task = scsi_cdb_read10(lba, datalen, blksize, 0, 0, 0, 0, 0); + task = scsi_cdb_read10(lba, datalen, block_size, 0, 0, 0, 0, 0); assert(task != NULL); task = send_scsi_command(sdev, task, NULL); @@ -1438,20 +1435,19 @@ struct scsi_task *task; struct iscsi_data d; const uint32_t lba = 1; - const int blksize = 512; - const uint32_t datalen = 1 * blksize; + const uint32_t datalen = 1 * block_size; int ret = 0; /* - * try to write the second 512-byte block + * try to write the second block */ logging(LOG_VERBOSE, "Send WRITE10 to verify WRITE does not work init=%s", sdev->iscsi_ctx ? sdev->iscsi_ctx->initiator_name : sdev->sgio_dev); - task = scsi_cdb_write10(lba, datalen, blksize, 0, 0, 0, 0, 0); + task = scsi_cdb_write10(lba, datalen, block_size, 0, 0, 0, 0, 0); assert(task != NULL); d.data = buf; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libiscsi-1.19.0+git.20200521/test-tool/test_async_abort_simple.c new/libiscsi-1.19.0+git.20200812/test-tool/test_async_abort_simple.c --- old/libiscsi-1.19.0+git.20200521/test-tool/test_async_abort_simple.c 2020-05-22 03:39:49.000000000 +0200 +++ new/libiscsi-1.19.0+git.20200812/test-tool/test_async_abort_simple.c 2020-08-13 05:07:10.000000000 +0200 @@ -92,7 +92,6 @@ { int ret; struct tests_async_abort_state state = { NULL, 0, 0, 0, 0 }; - int blocksize = 512; int blocks_per_io = 8; unsigned char *buf; uint64_t timeout_sec; @@ -107,18 +106,18 @@ return; } - buf = calloc(blocksize, blocks_per_io); + buf = calloc(block_size, blocks_per_io); CU_ASSERT(buf != NULL); if (!buf) return; /* queue and dispatch write before the abort */ - state.wtask = scsi_cdb_write10(0, blocks_per_io * blocksize, - blocksize, 0, 0, 0, 0, 0); + state.wtask = scsi_cdb_write10(0, blocks_per_io * block_size, + block_size, 0, 0, 0, 0, 0); CU_ASSERT_PTR_NOT_NULL_FATAL(state.wtask); ret = scsi_task_add_data_out_buffer(state.wtask, - blocks_per_io * blocksize, + blocks_per_io * block_size, buf); CU_ASSERT_EQUAL(ret, 0); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libiscsi-1.19.0+git.20200521/test-tool/test_async_lu_reset_simple.c new/libiscsi-1.19.0+git.20200812/test-tool/test_async_lu_reset_simple.c --- old/libiscsi-1.19.0+git.20200521/test-tool/test_async_lu_reset_simple.c 2020-05-22 03:39:49.000000000 +0200 +++ new/libiscsi-1.19.0+git.20200812/test-tool/test_async_lu_reset_simple.c 2020-08-13 05:07:10.000000000 +0200 @@ -91,7 +91,6 @@ { int ret; struct tests_async_reset_state state = { NULL, 0, 0, 0, }; - int blocksize = 512; int blocks_per_io = 8; unsigned char *buf; uint64_t timeout_sec; @@ -106,18 +105,18 @@ return; } - buf = calloc(blocksize, blocks_per_io); + buf = calloc(block_size, blocks_per_io); CU_ASSERT(buf != NULL); if (!buf) return; /* queue and dispatch write before the reset */ - state.wtask = scsi_cdb_write10(0, blocks_per_io * blocksize, - blocksize, 0, 0, 0, 0, 0); + state.wtask = scsi_cdb_write10(0, blocks_per_io * block_size, + block_size, 0, 0, 0, 0, 0); CU_ASSERT_PTR_NOT_NULL_FATAL(state.wtask); ret = scsi_task_add_data_out_buffer(state.wtask, - blocks_per_io * blocksize, + blocks_per_io * block_size, buf); CU_ASSERT_EQUAL(ret, 0); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libiscsi-1.19.0+git.20200521/utils/iscsi-ls.c new/libiscsi-1.19.0+git.20200812/utils/iscsi-ls.c --- old/libiscsi-1.19.0+git.20200521/utils/iscsi-ls.c 2020-05-22 03:39:49.000000000 +0200 +++ new/libiscsi-1.19.0+git.20200812/utils/iscsi-ls.c 2020-08-13 05:07:10.000000000 +0200 @@ -376,7 +376,8 @@ } else if (!strcmp(argv[i], "-U") || !strcmp(argv[i], "--url")) { useurls = 1; - } else if (!strncmp("iscsi://", argv[i], 8)) { + } else if (!strncmp("iscsi://", argv[i], 8) || + !strncmp("iser://", argv[i], 7)) { url = strdup(argv[i]); } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libiscsi-1.19.0+git.20200521/utils/iscsi-perf.c new/libiscsi-1.19.0+git.20200812/utils/iscsi-perf.c --- old/libiscsi-1.19.0+git.20200521/utils/iscsi-perf.c 2020-05-22 03:39:49.000000000 +0200 +++ new/libiscsi-1.19.0+git.20200812/utils/iscsi-perf.c 2020-08-13 05:07:10.000000000 +0200 @@ -369,12 +369,12 @@ scsi_free_scsi_task(task); - client.perf_iov.iov_base = malloc(blocks_per_io * client.blocksize); + client.perf_iov.iov_base = malloc((size_t)(blocks_per_io * client.blocksize)); if (!client.perf_iov.iov_base) { fprintf(stderr, "Out of Memory\n"); exit(10); } - client.perf_iov.iov_len = blocks_per_io * client.blocksize; + client.perf_iov.iov_len = (size_t)(blocks_per_io * client.blocksize); printf("capacity is %" PRIu64 " blocks or %" PRIu64 " byte (%" PRIu64 " MB)\n", client.num_blocks, client.num_blocks * client.blocksize, (client.num_blocks * client.blocksize) >> 20); ++++++ libiscsi.obsinfo ++++++ --- /var/tmp/diff_new_pack.1KEJck/_old 2020-08-15 21:19:01.967577191 +0200 +++ /var/tmp/diff_new_pack.1KEJck/_new 2020-08-15 21:19:01.971577193 +0200 @@ -1,5 +1,5 @@ name: libiscsi -version: 1.19.0+git.20200521 -mtime: 1590111589 -commit: 33c66f2c39a01b4e109270ffcc83e2e2daf73ecb +version: 1.19.0+git.20200812 +mtime: 1597288030 +commit: e9cefe7e421b19f9b984ff3fc8e76856cb439d14