Hello community, here is the log from the commit of package libiscsi for openSUSE:Factory checked in at 2020-11-10 13:38:50 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/libiscsi (Old) and /work/SRC/openSUSE:Factory/.libiscsi.new.11331 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libiscsi" Tue Nov 10 13:38:50 2020 rev:15 rq:846196 version:1.19.0+git.20201023 Changes: -------- --- /work/SRC/openSUSE:Factory/libiscsi/libiscsi.changes 2020-08-15 21:19:00.731576485 +0200 +++ /work/SRC/openSUSE:Factory/.libiscsi.new.11331/libiscsi.changes 2020-11-10 13:39:29.952468041 +0100 @@ -1,0 +2,17 @@ +Thu Nov 5 10:50:08 UTC 2020 - Martin Pluskal <mplus...@suse.com> + +- Update to version 1.19.0+git.20201023: + * test-tool: add COMPARE AND WRITE MiscompareSense test + * lib: parse Information fixed sense field + * lib: parse Information sense descriptor type + * lib: check length for sense key specific sense data descriptors + * lib: drop generic sense data descriptor VALID check + * test-tool: add version descriptor checks for more SBC-3 versions + * test-tool: Fix CmdSN tests + * test-tool/test_async_lu_reset_simple: Move an assert statement + * Remove an unused function from the iSER code + * test-tool: add LogoutDuringIOAsync test case + * test-tool: rename async write dispatch/complete counters + * pdu: fix use after free during cancellation + +------------------------------------------------------------------- Old: ---- libiscsi-1.19.0+git.20200812.obscpio New: ---- libiscsi-1.19.0+git.20201023.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ libiscsi.spec ++++++ --- /var/tmp/diff_new_pack.r0tJKP/_old 2020-11-10 13:39:30.892466173 +0100 +++ /var/tmp/diff_new_pack.r0tJKP/_new 2020-11-10 13:39:30.896466166 +0100 @@ -18,7 +18,7 @@ %define sover 9 Name: libiscsi -Version: 1.19.0+git.20200812 +Version: 1.19.0+git.20201023 Release: 0 Summary: iSCSI client library and utilities License: GPL-2.0-only AND LGPL-2.1-only @@ -80,7 +80,6 @@ %autosetup %build -%global optflags %{optflags} -fcommon autoreconf -fiv %configure \ --enable-manpages \ ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.r0tJKP/_old 2020-11-10 13:39:30.948466062 +0100 +++ /var/tmp/diff_new_pack.r0tJKP/_new 2020-11-10 13:39:30.952466054 +0100 @@ -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">e9cefe7e421b19f9b984ff3fc8e76856cb439d14</param></service></servicedata> \ No newline at end of file + <param name="changesrevision">957cc9623223dcbf9dcf7ee27455dabfb7bd29eb</param></service></servicedata> \ No newline at end of file ++++++ libiscsi-1.19.0+git.20200812.obscpio -> libiscsi-1.19.0+git.20201023.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libiscsi-1.19.0+git.20200812/include/scsi-lowlevel.h new/libiscsi-1.19.0+git.20201023/include/scsi-lowlevel.h --- old/libiscsi-1.19.0+git.20200812/include/scsi-lowlevel.h 2020-08-13 05:07:10.000000000 +0200 +++ new/libiscsi-1.19.0+git.20201023/include/scsi-lowlevel.h 2020-10-24 04:19:12.000000000 +0200 @@ -281,8 +281,10 @@ unsigned sense_specific:1; unsigned ill_param_in_cdb:1; unsigned bit_pointer_valid:1; + unsigned info_valid:1; unsigned char bit_pointer; uint16_t field_pointer; + uint64_t information; }; struct scsi_data { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libiscsi-1.19.0+git.20200812/lib/iscsi-command.c new/libiscsi-1.19.0+git.20201023/lib/iscsi-command.c --- old/libiscsi-1.19.0+git.20200812/lib/iscsi-command.c 2020-08-13 05:07:10.000000000 +0200 +++ new/libiscsi-1.19.0+git.20201023/lib/iscsi-command.c 2020-10-24 04:19:12.000000000 +0200 @@ -326,14 +326,21 @@ const unsigned char *p, *const end = sb + sb_len; for (p = sb; p < end; p += p[1]) { - if (p[1] < 4) /* length */ - break; - if (!(p[2] & 0x80)) /* VALID bit */ + uint8_t addl_len = p[1]; + if (addl_len < 4) break; switch (p[0]) { + case 0: + /* Information descriptor with VALID flag */ + if (addl_len == 0x0a && p[2] & 0x80) { + sense->info_valid = 1; + sense->information = scsi_get_uint64(p + 4); + } + break; case 2: /* Sense key specific sense data descriptor */ - parse_sense_spec(sense, p + 4); + if (addl_len == 0x06) + parse_sense_spec(sense, p + 4); break; } } @@ -347,6 +354,10 @@ case 0x71: /* Fixed format */ sense->key = sb[2] & 0x0f; + if (sb[0] & 0x80) { /* VALID */ + sense->info_valid = 1; + sense->information = scsi_get_uint32(sb + 3); + } sense->ascq = scsi_get_uint16(&sb[12]); parse_sense_spec(sense, sb + 15); break; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libiscsi-1.19.0+git.20200812/lib/iser.c new/libiscsi-1.19.0+git.20201023/lib/iser.c --- old/libiscsi-1.19.0+git.20200812/lib/iser.c 2020-08-13 05:07:10.000000000 +0200 +++ new/libiscsi-1.19.0+git.20201023/lib/iser.c 2020-10-24 04:19:12.000000000 +0200 @@ -204,12 +204,6 @@ return result; } -static inline int -iser_buf_chunk_contains(struct iser_buf_chunk *chunk, void *ptr) { - return ((unsigned char *)ptr >= chunk->buf && - (unsigned char *)ptr < chunk->buf + DATA_BUFFER_CHUNK_SIZE); -} - static void iser_tx_desc_free(struct iscsi_context *iscsi, struct iser_tx_desc *tx_desc) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libiscsi-1.19.0+git.20200812/lib/pdu.c new/libiscsi-1.19.0+git.20201023/lib/pdu.c --- old/libiscsi-1.19.0+git.20200812/lib/pdu.c 2020-08-13 05:07:10.000000000 +0200 +++ new/libiscsi-1.19.0+git.20201023/lib/pdu.c 2020-10-24 04:19:12.000000000 +0200 @@ -788,13 +788,11 @@ 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--; } - - + iscsi->drv->free_pdu(iscsi, pdu); } while ((pdu = iscsi->waitpdu)) { ISCSI_LIST_REMOVE(&iscsi->waitpdu, pdu); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libiscsi-1.19.0+git.20200812/test-tool/iscsi-test-cu.c new/libiscsi-1.19.0+git.20201023/test-tool/iscsi-test-cu.c --- old/libiscsi-1.19.0+git.20200812/test-tool/iscsi-test-cu.c 2020-08-13 05:07:10.000000000 +0200 +++ new/libiscsi-1.19.0+git.20201023/test-tool/iscsi-test-cu.c 2020-10-24 04:19:12.000000000 +0200 @@ -68,6 +68,7 @@ { "Simple", test_compareandwrite_simple }, { "DpoFua", test_compareandwrite_dpofua }, { "Miscompare", test_compareandwrite_miscompare }, + { "MiscompareSense", test_compareandwrite_miscompare_sense }, { "Unwritten", test_compareandwrite_unwritten }, { "InvalidDataOutSize", test_compareandwrite_invalid_dataout_size }, @@ -593,6 +594,7 @@ static CU_TestInfo tests_iscsi_tmf[] = { { "AbortTaskSimpleAsync", test_async_abort_simple }, { "LUNResetSimpleAsync", test_async_lu_reset_simple }, + { "LogoutDuringIOAsync", test_async_io_logout }, CU_TEST_INFO_NULL }; @@ -1359,8 +1361,12 @@ sbc3_support = 0; for (i = 0; i < 8; i++) { - if (inq->version_descriptor[i] == 0x04C0) { - sbc3_support = 1; + switch (inq->version_descriptor[i]) { + case 0x04C0: // SBC-3 (no version claimed) + case 0x04C3: // SBC-3 T10/BSR INCITS 514 revision 35 + case 0x04C5: // SBC-3 T10/BSR INCITS 514 revision 36 + case 0x04C8: // SBC-3 ANSI INCITS 514-2014 + sbc3_support = 1; } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libiscsi-1.19.0+git.20200812/test-tool/iscsi-test-cu.h new/libiscsi-1.19.0+git.20201023/test-tool/iscsi-test-cu.h --- old/libiscsi-1.19.0+git.20200812/test-tool/iscsi-test-cu.h 2020-08-13 05:07:10.000000000 +0200 +++ new/libiscsi-1.19.0+git.20201023/test-tool/iscsi-test-cu.h 2020-10-24 04:19:12.000000000 +0200 @@ -54,6 +54,7 @@ void test_compareandwrite_simple(void); void test_compareandwrite_dpofua(void); void test_compareandwrite_miscompare(void); +void test_compareandwrite_miscompare_sense(void); void test_compareandwrite_unwritten(void); void test_compareandwrite_invalid_dataout_size(void); @@ -258,6 +259,7 @@ void test_write10_dpofua(void); void test_write10_residuals(void); void test_async_write(void); +void test_async_io_logout(void); void test_write12_simple(void); void test_write12_beyond_eol(void); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libiscsi-1.19.0+git.20200812/test-tool/test_async_lu_reset_simple.c new/libiscsi-1.19.0+git.20201023/test-tool/test_async_lu_reset_simple.c --- old/libiscsi-1.19.0+git.20200812/test-tool/test_async_lu_reset_simple.c 2020-08-13 05:07:10.000000000 +0200 +++ new/libiscsi-1.19.0+git.20201023/test-tool/test_async_lu_reset_simple.c 2020-10-24 04:19:12.000000000 +0200 @@ -66,6 +66,7 @@ /* command_data NULL if a reconnect occured. see iscsi_reconnect_cb() */ reconnect_succeeded = command_data != NULL; + CU_ASSERT_EQUAL(reconnect_succeeded, 1); if (!reconnect_succeeded) return; tmf_response = *(uint32_t *)command_data; @@ -153,9 +154,6 @@ 0xffffffff, 0, test_async_reset_cb, &state); CU_ASSERT_EQUAL(ret, 0); - CU_ASSERT_EQUAL(reconnect_succeeded, 1); - if (!reconnect_succeeded) - goto out; logging(LOG_VERBOSE, "LU RESET queued"); @@ -197,8 +195,6 @@ CU_FAIL("unexpected WRITE/RESET state"); } -out: - /* Avoid that callbacks get invoked after this test finished */ iscsi_logout_sync(sd->iscsi_ctx); iscsi_destroy_context(sd->iscsi_ctx); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libiscsi-1.19.0+git.20200812/test-tool/test_async_write.c new/libiscsi-1.19.0+git.20201023/test-tool/test_async_write.c --- old/libiscsi-1.19.0+git.20200812/test-tool/test_async_write.c 2020-08-13 05:07:10.000000000 +0200 +++ new/libiscsi-1.19.0+git.20201023/test-tool/test_async_write.c 2020-10-24 04:19:12.000000000 +0200 @@ -1,5 +1,5 @@ /* - Copyright (C) SUSE LINUX GmbH 2016 + Copyright (C) SUSE LLC 2016-2020 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -27,9 +27,11 @@ #include "iscsi-test-cu.h" struct tests_async_write_state { - uint32_t dispatched; - uint32_t completed; + uint32_t io_dispatched; + uint32_t io_completed; uint32_t prev_cmdsn; + uint32_t logout_sent; + uint32_t logout_cmpl; }; static void @@ -39,12 +41,19 @@ struct scsi_task *atask = command_data; struct tests_async_write_state *state = private_data; - state->completed++; + if (state->logout_cmpl) { + CU_ASSERT_EQUAL(status, SCSI_STATUS_CANCELLED); + logging(LOG_VERBOSE, "WRITE10 cancelled after logout"); + return; + } + + state->io_completed++; logging(LOG_VERBOSE, "WRITE10 completed: %d of %d (CmdSN=%d)", - state->completed, state->dispatched, atask->cmdsn); + state->io_completed, state->io_dispatched, atask->cmdsn); CU_ASSERT_NOT_EQUAL(status, SCSI_STATUS_CHECK_CONDITION); - if ((state->completed > 1) && (atask->cmdsn != state->prev_cmdsn + 1)) { + if ((state->io_completed > 1) + && (atask->cmdsn != state->prev_cmdsn + 1)) { logging(LOG_VERBOSE, "out of order completion (CmdSN=%d, prev=%d)", atask->cmdsn, state->prev_cmdsn); @@ -58,7 +67,7 @@ test_async_write(void) { int i, ret; - struct tests_async_write_state state = { 0, 0, 0 }; + struct tests_async_write_state state = { }; int blocks_per_io = 8; int num_ios = 1000; /* IOs in flight concurrently, but all using the same src buffer */ @@ -97,12 +106,12 @@ &state); CU_ASSERT_EQUAL(ret, 0); - state.dispatched++; + state.io_dispatched++; logging(LOG_VERBOSE, "WRITE10 dispatched: %d of %d (cmdsn=%d)", - state.dispatched, num_ios, atask->cmdsn); + state.io_dispatched, num_ios, atask->cmdsn); } - while (state.completed < state.dispatched) { + while (state.io_completed < state.io_dispatched) { struct pollfd pfd; pfd.fd = iscsi_get_fd(sd->iscsi_ctx); @@ -117,3 +126,98 @@ free(buf); } + +static void +test_async_io_logout_cb(struct iscsi_context *iscsi __attribute__((unused)), + int status, void *command_data __attribute__((unused)), + void *private_data) +{ + struct tests_async_write_state *state = private_data; + + state->logout_cmpl++; + logging(LOG_VERBOSE, "Logout completed with %d IOs outstanding", + state->io_dispatched - state->io_completed); + CU_ASSERT_EQUAL(status, SCSI_STATUS_GOOD); +} + +void +test_async_io_logout(void) +{ + int i, ret; + struct tests_async_write_state state = { }; + int blocks_per_io = 8; + int num_ios = 10; + /* IOs in flight concurrently, but all using the same src buffer */ + unsigned char *buf; + + CHECK_FOR_DATALOSS; + CHECK_FOR_SBC; + CHECK_FOR_ISCSI(sd); + + if (maximum_transfer_length + && maximum_transfer_length < (blocks_per_io * num_ios)) { + CU_PASS("[SKIPPED] device too small for async IO test"); + return; + } + + buf = calloc(block_size, blocks_per_io); + CU_ASSERT(buf != NULL); + if (!buf) + return; + + iscsi_set_noautoreconnect(sd->iscsi_ctx, 1); + + for (i = 0; i < num_ios; i++) { + uint32_t lba = i * blocks_per_io; + struct scsi_task *atask; + + atask = scsi_cdb_write10(lba, blocks_per_io * block_size, + block_size, 0, 0, 0, 0, 0); + CU_ASSERT_PTR_NOT_NULL_FATAL(atask); + + ret = scsi_task_add_data_out_buffer(atask, + blocks_per_io * block_size, + buf); + CU_ASSERT_EQUAL(ret, 0); + + ret = iscsi_scsi_command_async(sd->iscsi_ctx, sd->iscsi_lun, + atask, test_async_write_cb, NULL, + &state); + CU_ASSERT_EQUAL(ret, 0); + + state.io_dispatched++; + logging(LOG_VERBOSE, "WRITE10 dispatched: %d of %d (cmdsn=%d)", + state.io_dispatched, num_ios, atask->cmdsn); + } + + while (!state.logout_cmpl) { + struct pollfd pfd; + + pfd.fd = iscsi_get_fd(sd->iscsi_ctx); + pfd.events = iscsi_which_events(sd->iscsi_ctx); + + ret = poll(&pfd, 1, -1); + CU_ASSERT_NOT_EQUAL(ret, -1); + + ret = iscsi_service(sd->iscsi_ctx, pfd.revents); + CU_ASSERT_EQUAL(ret, 0); + + /* attempt logout after one of the dispatch IOs has completed */ + if (!state.logout_sent && state.io_completed > 0) { + ret = iscsi_logout_async(sd->iscsi_ctx, + test_async_io_logout_cb, + &state); + CU_ASSERT_EQUAL(ret, 0); + + state.logout_sent++; + logging(LOG_VERBOSE, + "Logout dispatched following %d IO completions", + state.io_completed); + } + } + + iscsi_destroy_context(sd->iscsi_ctx); + sd->iscsi_ctx = iscsi_context_login(initiatorname1, sd->iscsi_url, &sd->iscsi_lun); + CU_ASSERT_PTR_NOT_NULL(sd->iscsi_ctx); + free(buf); +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libiscsi-1.19.0+git.20200812/test-tool/test_compareandwrite_miscompare.c new/libiscsi-1.19.0+git.20201023/test-tool/test_compareandwrite_miscompare.c --- old/libiscsi-1.19.0+git.20200812/test-tool/test_compareandwrite_miscompare.c 2020-08-13 05:07:10.000000000 +0200 +++ new/libiscsi-1.19.0+git.20201023/test-tool/test_compareandwrite_miscompare.c 2020-10-24 04:19:12.000000000 +0200 @@ -158,3 +158,79 @@ } } } + +void +test_compareandwrite_miscompare_sense(void) +{ + unsigned i; + + CHECK_FOR_DATALOSS; + CHECK_FOR_SBC; + CHECK_FOR_ISCSI(sd); + + if (inq_bl->max_cmp < 1) { + logging(LOG_NORMAL, "[SKIPPED] COMPAREANDWRITE " + "max_cmp less than 1."); + CU_PASS("[SKIPPED] single block COMPAREANDWRITE not supported " + "Skipping test"); + return; + } + + logging(LOG_VERBOSE, LOG_BLANK_LINE); + logging(LOG_VERBOSE, "Test COMPARE_AND_WRITE of 1 block at the " + "start of the LUN"); + + logging(LOG_VERBOSE, "Write 1 block of 'A' at LBA:0"); + memset(scratch, 'A', 2 * block_size); + + WRITE16(sd, 0, block_size, + block_size, 0, 0, 0, 0, 0, scratch, + EXPECT_STATUS_GOOD); + + memset(scratch + block_size, 'B', block_size); + + logging(LOG_VERBOSE, "Overwrite blocks with 'B' " + "at LBA:0 (if they all contain 'A')"); + COMPAREANDWRITE(sd, 0, + scratch, 2 * block_size, block_size, + 0, 0, 0, 0, + EXPECT_STATUS_GOOD); + /* we've confirmed that c&w is supported, time for the proper test... */ + + logging(LOG_VERBOSE, "Vary location of miscompare in %zd bytes and check" + "sense", block_size); + memset(scratch + block_size, 'C', block_size); + + for (i = 0; i < block_size; i++) { + struct scsi_task *tsk; + struct scsi_iovec iov; + + logging(LOG_VERBOSE, "Fill buffer with 'B' except for %d " + "offset", i); + memset(scratch, 'B', block_size); + scratch[i] = 'Z'; + + tsk = scsi_cdb_compareandwrite(0, 2 * block_size, block_size, + 0, 0, 0, 0, 0); + CU_ASSERT(tsk != NULL); + + iov.iov_base = scratch; + iov.iov_len = 2 * block_size; + scsi_task_set_iov_out(tsk, &iov, 1); + + tsk = iscsi_scsi_command_sync(sd->iscsi_ctx, sd->iscsi_lun, + tsk, NULL); + CU_ASSERT_FATAL(tsk != NULL); + CU_ASSERT(tsk->status == SCSI_STATUS_CHECK_CONDITION); + CU_ASSERT(tsk->sense.key == SCSI_SENSE_MISCOMPARE); + CU_ASSERT(tsk->sense.ascq + == SCSI_SENSE_ASCQ_MISCOMPARE_DURING_VERIFY); + if (tsk->sense.info_valid) { + logging(LOG_VERBOSE, "Check Information field provided" + " with miscompare sense response"); + CU_ASSERT_EQUAL(tsk->sense.information, i); + } + + scsi_free_scsi_task(tsk); + } +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libiscsi-1.19.0+git.20200812/test-tool/test_iscsi_cmdsn_toohigh.c new/libiscsi-1.19.0+git.20201023/test-tool/test_iscsi_cmdsn_toohigh.c --- old/libiscsi-1.19.0+git.20200812/test-tool/test_iscsi_cmdsn_toohigh.c 2020-08-13 05:07:10.000000000 +0200 +++ new/libiscsi-1.19.0+git.20201023/test-tool/test_iscsi_cmdsn_toohigh.c 2020-10-24 04:19:12.000000000 +0200 @@ -35,10 +35,12 @@ * iscsi_pdu_set_cmdsn(), which also changes pdu->cmdsn? */ scsi_set_uint32(&pdu->outdata.data[24], iscsi->maxcmdsn + 1); - /* fudge the cmdsn value back to where it should be if this - * pdu is ignored. + /* + * Fudge the cmdsn value back to where it should be if this pdu + * is ignored. The cmdsn value will be incremented by the + * orig_queue_pdu(), so it's off by one. */ - iscsi->cmdsn = iscsi->expcmdsn; + iscsi->cmdsn = iscsi->expcmdsn - 1; break; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libiscsi-1.19.0+git.20200812/test-tool/test_iscsi_cmdsn_toolow.c new/libiscsi-1.19.0+git.20201023/test-tool/test_iscsi_cmdsn_toolow.c --- old/libiscsi-1.19.0+git.20200812/test-tool/test_iscsi_cmdsn_toolow.c 2020-08-13 05:07:10.000000000 +0200 +++ new/libiscsi-1.19.0+git.20201023/test-tool/test_iscsi_cmdsn_toolow.c 2020-10-24 04:19:12.000000000 +0200 @@ -35,10 +35,12 @@ * iscsi_pdu_set_cmdsn(), which also changes pdu->cmdsn? */ scsi_set_uint32(&pdu->outdata.data[24], iscsi->expcmdsn - 1); - /* fudge the cmdsn value back to where it should be if this - * pdu is ignored. + /* + * Fudge the cmdsn value back to where it should be if this pdu + * is ignored. The cmdsn value will be incremented by the + * orig_queue_pdu(), so it's off by one. */ - iscsi->cmdsn = iscsi->expcmdsn; + iscsi->cmdsn = iscsi->expcmdsn - 1; break; } ++++++ libiscsi.obsinfo ++++++ --- /var/tmp/diff_new_pack.r0tJKP/_old 2020-11-10 13:39:31.172465617 +0100 +++ /var/tmp/diff_new_pack.r0tJKP/_new 2020-11-10 13:39:31.172465617 +0100 @@ -1,5 +1,5 @@ name: libiscsi -version: 1.19.0+git.20200812 -mtime: 1597288030 -commit: e9cefe7e421b19f9b984ff3fc8e76856cb439d14 +version: 1.19.0+git.20201023 +mtime: 1603505952 +commit: bc83b0ddb01aa24170c6cb54e3fab4e9a30df77d