Commit e84cf46f authored by Naresh Gottumukkala's avatar Naresh Gottumukkala Committed by Jim Harris
Browse files

nvmf/fc: Delete FC LS pending requests.



As part of IT delete make sure to delete any pending LS requests
for that remote port.

Signed-off-by: default avatarNaresh Gottumukkala <raju.gottumukkala@broadcom.com>
Change-Id: Ic3c60ab40bcf54d56ac57bcde84b85acfc5cf3f0
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/5712


Community-CI: Broadcom CI
Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
parent 1b011d5d
Loading
Loading
Loading
Loading
+43 −6
Original line number Diff line number Diff line
@@ -1093,6 +1093,39 @@ nvmf_ctrlr_is_on_nport(uint8_t port_hdl, uint16_t nport_hdl,
	return false;
}

static void
nvmf_fc_release_ls_rqst(struct spdk_nvmf_fc_hwqp *hwqp,
			struct spdk_nvmf_fc_ls_rqst *ls_rqst)
{
	assert(ls_rqst);

	TAILQ_REMOVE(&hwqp->ls_pending_queue, ls_rqst, ls_pending_link);

	/* Return buffer to chip */
	nvmf_fc_rqpair_buffer_release(hwqp, ls_rqst->rqstbuf.buf_index);
}

static int
nvmf_fc_delete_ls_pending(struct spdk_nvmf_fc_hwqp *hwqp,
			  struct spdk_nvmf_fc_nport *nport,
			  struct spdk_nvmf_fc_remote_port_info *rport)
{
	struct spdk_nvmf_fc_ls_rqst *ls_rqst = NULL, *tmp;
	int num_deleted = 0;

	assert(hwqp);
	assert(nport);
	assert(rport);

	TAILQ_FOREACH_SAFE(ls_rqst, &hwqp->ls_pending_queue, ls_pending_link, tmp) {
		if ((ls_rqst->d_id == nport->d_id) && (ls_rqst->s_id == rport->s_id)) {
			num_deleted++;
			nvmf_fc_release_ls_rqst(hwqp, ls_rqst);
		}
	}
	return num_deleted;
}

static void
nvmf_fc_req_bdev_abort(void *arg1)
{
@@ -1630,9 +1663,7 @@ nvmf_fc_hwqp_process_pending_ls_rqsts(struct spdk_nvmf_fc_hwqp *hwqp)
				/* increment invalid rport counter */
				hwqp->counters.rport_invalid++;
			}
			TAILQ_REMOVE(&hwqp->ls_pending_queue, ls_rqst, ls_pending_link);
			/* Return buffer to chip */
			nvmf_fc_rqpair_buffer_release(hwqp, ls_rqst->rqstbuf.buf_index);
			nvmf_fc_release_ls_rqst(hwqp, ls_rqst);
			continue;
		}
		if (nport->nport_state != SPDK_NVMF_FC_OBJECT_CREATED ||
@@ -1640,9 +1671,7 @@ nvmf_fc_hwqp_process_pending_ls_rqsts(struct spdk_nvmf_fc_hwqp *hwqp)
			SPDK_ERRLOG("%s state not created. Dropping\n",
				    nport->nport_state != SPDK_NVMF_FC_OBJECT_CREATED ?
				    "Nport" : "Rport");
			TAILQ_REMOVE(&hwqp->ls_pending_queue, ls_rqst, ls_pending_link);
			/* Return buffer to chip */
			nvmf_fc_rqpair_buffer_release(hwqp, ls_rqst->rqstbuf.buf_index);
			nvmf_fc_release_ls_rqst(hwqp, ls_rqst);
			continue;
		}

@@ -3317,6 +3346,14 @@ nvmf_fc_adm_evnt_i_t_delete(void *arg)
		goto out;
	}

	/*
	 * We have the rport slated for deletion. At this point clean up
	 * any LS requests that are sitting in the pending list. Do this
	 * first, then, set the states of the rport so that new LS requests
	 * are not accepted. Then start the cleanup.
	 */
	nvmf_fc_delete_ls_pending(&(nport->fc_port->ls_queue), nport, rport);

	/*
	 * We have found exactly one rport. Allocate memory for callback data.
	 */