Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 294c875a authored by Bart Van Assche's avatar Bart Van Assche Committed by Roland Dreier
Browse files

IB/srp: Suppress superfluous error messages



Keep track of the connection state.  Only report QP errors while
connected.  Only invoke ib_send_cm_dreq() when connected so that
invoking srp_disconnect_target() after having received a DREQ does not
cause an error message to be printed.

Signed-off-by: default avatarBart Van Assche <bvanassche@acm.org>
Acked-by: default avatarDavid Dillow <dillowda@ornl.gov>
Signed-off-by: default avatarRoland Dreier <roland@purestorage.com>
parent 4f0af697
Loading
Loading
Loading
Loading
+30 −8
Original line number Diff line number Diff line
@@ -428,18 +428,35 @@ static int srp_send_req(struct srp_target_port *target)
	return status;
}

static bool srp_change_conn_state(struct srp_target_port *target,
				  bool connected)
{
	bool changed = false;

	spin_lock_irq(&target->lock);
	if (target->connected != connected) {
		target->connected = connected;
		changed = true;
	}
	spin_unlock_irq(&target->lock);

	return changed;
}

static void srp_disconnect_target(struct srp_target_port *target)
{
	if (srp_change_conn_state(target, false)) {
		/* XXX should send SRP_I_LOGOUT request */

		init_completion(&target->done);
		if (ib_send_cm_dreq(target->cm_id, NULL, 0)) {
			shost_printk(KERN_DEBUG, target->scsi_host,
				     PFX "Sending CM DREQ failed\n");
		return;
	}
		} else {
			wait_for_completion(&target->done);
		}
	}
}

static bool srp_change_state(struct srp_target_port *target,
			    enum srp_target_state old,
@@ -515,6 +532,8 @@ static int srp_connect_target(struct srp_target_port *target)
	int retries = 3;
	int ret;

	WARN_ON_ONCE(target->connected);

	target->qp_in_error = false;

	ret = srp_lookup_path(target);
@@ -536,6 +555,7 @@ static int srp_connect_target(struct srp_target_port *target)
		 */
		switch (target->status) {
		case 0:
			srp_change_conn_state(target, true);
			return 0;

		case SRP_PORT_REDIRECT:
@@ -1274,7 +1294,7 @@ static void srp_handle_qp_err(enum ib_wc_status wc_status,
			      enum ib_wc_opcode wc_opcode,
			      struct srp_target_port *target)
{
	if (!target->qp_in_error) {
	if (target->connected && !target->qp_in_error) {
		shost_printk(KERN_ERR, target->scsi_host,
			     PFX "failed %s status %d\n",
			     wc_opcode & IB_WC_RECV ? "receive" : "send",
@@ -1630,6 +1650,7 @@ static int srp_cm_handler(struct ib_cm_id *cm_id, struct ib_cm_event *event)
	case IB_CM_DREQ_RECEIVED:
		shost_printk(KERN_WARNING, target->scsi_host,
			     PFX "DREQ received - connection closed\n");
		srp_change_conn_state(target, false);
		if (ib_send_cm_drep(cm_id, NULL, 0))
			shost_printk(KERN_ERR, target->scsi_host,
				     PFX "Sending CM DREP failed\n");
@@ -1942,6 +1963,7 @@ static int srp_add_target(struct srp_host *host, struct srp_target_port *target)
	spin_unlock(&host->target_lock);

	target->state = SRP_TARGET_LIVE;
	target->connected = false;

	scsi_scan_target(&target->scsi_host->shost_gendev,
			 0, target->scsi_id, SCAN_WILD_CARD, 0);
+1 −0
Original line number Diff line number Diff line
@@ -163,6 +163,7 @@ struct srp_target_port {
	int			path_query_id;

	u32			rq_tmo_jiffies;
	bool			connected;

	struct ib_cm_id	       *cm_id;