Commit 1dc9a762 authored by Shuhei Matsumoto's avatar Shuhei Matsumoto Committed by Tomasz Zawadzki
Browse files

lib/scsi: Check pending tasks for the SCSI device only from the specific initiator



Refine the public helper function spdk_scsi_dev_has_pending_tasks to
be able to check tasks only from the specific initiator.

Then use the function in iSCSI target to fix the issue.

Besides add UT code to test the updated spdk_scsi_dev_has_pending_tasks().
Automated multi hosts test is much better but some UT code will be of any
help to mitigate the risk of degradation.

Fixes #985

Signed-off-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Change-Id: I50afb940de7174360c8a30479450850002a3e525
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/471337


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
parent f9583f2c
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -233,10 +233,13 @@ struct spdk_scsi_lun *spdk_scsi_dev_get_lun(struct spdk_scsi_dev *dev, int lun_i
 * Check whether the SCSI device has any pending task.
 *
 * \param dev SCSI device.
 * \param initiator_port Check tasks only from the initiator if specified, or
 * all all tasks otherwise.
 *
 * \return true if the SCSI device has any pending task, or false otherwise.
 */
bool spdk_scsi_dev_has_pending_tasks(const struct spdk_scsi_dev *dev);
bool spdk_scsi_dev_has_pending_tasks(const struct spdk_scsi_dev *dev,
				     const struct spdk_scsi_port *initiator_port);

/**
 * Destruct the SCSI decice.
+4 −2
Original line number Diff line number Diff line
@@ -660,7 +660,8 @@ _iscsi_conn_check_pending_tasks(void *arg)
{
	struct spdk_iscsi_conn *conn = arg;

	if (conn->dev != NULL && spdk_scsi_dev_has_pending_tasks(conn->dev)) {
	if (conn->dev != NULL &&
	    spdk_scsi_dev_has_pending_tasks(conn->dev, conn->initiator_port)) {
		return 1;
	}

@@ -685,7 +686,8 @@ spdk_iscsi_conn_destruct(struct spdk_iscsi_conn *conn)
		iscsi_conn_cleanup_backend(conn);
	}

	if (conn->dev != NULL && spdk_scsi_dev_has_pending_tasks(conn->dev)) {
	if (conn->dev != NULL &&
	    spdk_scsi_dev_has_pending_tasks(conn->dev, conn->initiator_port)) {
		conn->shutdown_timer = spdk_poller_register(_iscsi_conn_check_pending_tasks, conn, 1000);
	} else {
		_iscsi_conn_destruct(conn);
+4 −3
Original line number Diff line number Diff line
@@ -419,14 +419,15 @@ spdk_scsi_dev_get_lun(struct spdk_scsi_dev *dev, int lun_id)
}

bool
spdk_scsi_dev_has_pending_tasks(const struct spdk_scsi_dev *dev)
spdk_scsi_dev_has_pending_tasks(const struct spdk_scsi_dev *dev,
				const struct spdk_scsi_port *initiator_port)
{
	int i;

	for (i = 0; i < SPDK_SCSI_DEV_MAX_LUN; ++i) {
		if (dev->lun[i] &&
		    (spdk_scsi_lun_has_pending_tasks(dev->lun[i], NULL) ||
		     spdk_scsi_lun_has_pending_mgmt_tasks(dev->lun[i], NULL))) {
		    (spdk_scsi_lun_has_pending_tasks(dev->lun[i], initiator_port) ||
		     spdk_scsi_lun_has_pending_mgmt_tasks(dev->lun[i], initiator_port))) {
			return true;
		}
	}
+2 −1
Original line number Diff line number Diff line
@@ -250,7 +250,8 @@ process_removed_devs(struct spdk_vhost_scsi_session *svsession)
		state = &svsession->scsi_dev_state[i];
		dev = state->dev;

		if (dev && state->status == VHOST_SCSI_DEV_REMOVING && !spdk_scsi_dev_has_pending_tasks(dev)) {
		if (dev && state->status == VHOST_SCSI_DEV_REMOVING &&
		    !spdk_scsi_dev_has_pending_tasks(dev, NULL)) {
			/* detach the device from this session */
			spdk_scsi_dev_free_io_channels(dev);
			state->dev = NULL;
+2 −1
Original line number Diff line number Diff line
@@ -90,7 +90,8 @@ DEFINE_STUB(spdk_scsi_dev_get_lun, struct spdk_scsi_lun *,
	    (struct spdk_scsi_dev *dev, int lun_id), NULL);

DEFINE_STUB(spdk_scsi_dev_has_pending_tasks, bool,
	    (const struct spdk_scsi_dev *dev), true);
	    (const struct spdk_scsi_dev *dev, const struct spdk_scsi_port *initiator_port),
	    true);

DEFINE_STUB(spdk_scsi_lun_open, int,
	    (struct spdk_scsi_lun *lun, spdk_scsi_lun_remove_cb_t hotremove_cb,
Loading