Skip to content

Commit

Permalink
IB/srp: Suppress superfluous error messages
Browse files Browse the repository at this point in the history
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: Bart Van Assche <bvanassche@acm.org>
Acked-by: David Dillow <dillowda@ornl.gov>
Signed-off-by: Roland Dreier <roland@purestorage.com>
  • Loading branch information
Bart Van Assche authored and Roland Dreier committed Dec 1, 2012
1 parent 4f0af69 commit 294c875
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 8 deletions.
38 changes: 30 additions & 8 deletions drivers/infiniband/ulp/srp/ib_srp.c
Original file line number Diff line number Diff line change
Expand Up @@ -428,17 +428,34 @@ 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)
{
/* XXX should send SRP_I_LOGOUT request */
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;
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");
} else {
wait_for_completion(&target->done);
}
}
wait_for_completion(&target->done);
}

static bool srp_change_state(struct srp_target_port *target,
Expand Down Expand Up @@ -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);
Expand All @@ -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:
Expand Down Expand Up @@ -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",
Expand Down Expand Up @@ -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");
Expand Down Expand Up @@ -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);
Expand Down
1 change: 1 addition & 0 deletions drivers/infiniband/ulp/srp/ib_srp.h
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,7 @@ struct srp_target_port {
int path_query_id;

u32 rq_tmo_jiffies;
bool connected;

struct ib_cm_id *cm_id;

Expand Down

0 comments on commit 294c875

Please sign in to comment.