diff options
| author | Bart Van Assche <bvanassche@acm.org> | 2011-12-25 07:18:12 -0500 |
|---|---|---|
| committer | Roland Dreier <roland@purestorage.com> | 2012-11-30 20:40:31 -0500 |
| commit | 294c875a65269361defd7aeb97804ba99eb57cbf (patch) | |
| tree | 64b3567dda8122a701516dfa432fee53f3b644ed /drivers/infiniband | |
| parent | 4f0af69799b0e7b9805c4d174169f5ed7bf315c1 (diff) | |
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: Bart Van Assche <bvanassche@acm.org>
Acked-by: David Dillow <dillowda@ornl.gov>
Signed-off-by: Roland Dreier <roland@purestorage.com>
Diffstat (limited to 'drivers/infiniband')
| -rw-r--r-- | drivers/infiniband/ulp/srp/ib_srp.c | 38 | ||||
| -rw-r--r-- | drivers/infiniband/ulp/srp/ib_srp.h | 1 |
2 files changed, 31 insertions, 8 deletions
diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c index f0843ef28e1..3c64bf400c2 100644 --- a/drivers/infiniband/ulp/srp/ib_srp.c +++ b/drivers/infiniband/ulp/srp/ib_srp.c | |||
| @@ -428,17 +428,34 @@ static int srp_send_req(struct srp_target_port *target) | |||
| 428 | return status; | 428 | return status; |
| 429 | } | 429 | } |
| 430 | 430 | ||
| 431 | static bool srp_change_conn_state(struct srp_target_port *target, | ||
| 432 | bool connected) | ||
| 433 | { | ||
| 434 | bool changed = false; | ||
| 435 | |||
| 436 | spin_lock_irq(&target->lock); | ||
| 437 | if (target->connected != connected) { | ||
| 438 | target->connected = connected; | ||
| 439 | changed = true; | ||
| 440 | } | ||
| 441 | spin_unlock_irq(&target->lock); | ||
| 442 | |||
| 443 | return changed; | ||
| 444 | } | ||
| 445 | |||
| 431 | static void srp_disconnect_target(struct srp_target_port *target) | 446 | static void srp_disconnect_target(struct srp_target_port *target) |
| 432 | { | 447 | { |
| 433 | /* XXX should send SRP_I_LOGOUT request */ | 448 | if (srp_change_conn_state(target, false)) { |
| 449 | /* XXX should send SRP_I_LOGOUT request */ | ||
| 434 | 450 | ||
| 435 | init_completion(&target->done); | 451 | init_completion(&target->done); |
| 436 | if (ib_send_cm_dreq(target->cm_id, NULL, 0)) { | 452 | if (ib_send_cm_dreq(target->cm_id, NULL, 0)) { |
| 437 | shost_printk(KERN_DEBUG, target->scsi_host, | 453 | shost_printk(KERN_DEBUG, target->scsi_host, |
| 438 | PFX "Sending CM DREQ failed\n"); | 454 | PFX "Sending CM DREQ failed\n"); |
| 439 | return; | 455 | } else { |
| 456 | wait_for_completion(&target->done); | ||
| 457 | } | ||
| 440 | } | 458 | } |
| 441 | wait_for_completion(&target->done); | ||
| 442 | } | 459 | } |
| 443 | 460 | ||
| 444 | static bool srp_change_state(struct srp_target_port *target, | 461 | static bool srp_change_state(struct srp_target_port *target, |
| @@ -515,6 +532,8 @@ static int srp_connect_target(struct srp_target_port *target) | |||
| 515 | int retries = 3; | 532 | int retries = 3; |
| 516 | int ret; | 533 | int ret; |
| 517 | 534 | ||
| 535 | WARN_ON_ONCE(target->connected); | ||
| 536 | |||
| 518 | target->qp_in_error = false; | 537 | target->qp_in_error = false; |
| 519 | 538 | ||
| 520 | ret = srp_lookup_path(target); | 539 | ret = srp_lookup_path(target); |
| @@ -536,6 +555,7 @@ static int srp_connect_target(struct srp_target_port *target) | |||
| 536 | */ | 555 | */ |
| 537 | switch (target->status) { | 556 | switch (target->status) { |
| 538 | case 0: | 557 | case 0: |
| 558 | srp_change_conn_state(target, true); | ||
| 539 | return 0; | 559 | return 0; |
| 540 | 560 | ||
| 541 | case SRP_PORT_REDIRECT: | 561 | case SRP_PORT_REDIRECT: |
| @@ -1274,7 +1294,7 @@ static void srp_handle_qp_err(enum ib_wc_status wc_status, | |||
| 1274 | enum ib_wc_opcode wc_opcode, | 1294 | enum ib_wc_opcode wc_opcode, |
| 1275 | struct srp_target_port *target) | 1295 | struct srp_target_port *target) |
| 1276 | { | 1296 | { |
| 1277 | if (!target->qp_in_error) { | 1297 | if (target->connected && !target->qp_in_error) { |
| 1278 | shost_printk(KERN_ERR, target->scsi_host, | 1298 | shost_printk(KERN_ERR, target->scsi_host, |
| 1279 | PFX "failed %s status %d\n", | 1299 | PFX "failed %s status %d\n", |
| 1280 | wc_opcode & IB_WC_RECV ? "receive" : "send", | 1300 | 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) | |||
| 1630 | case IB_CM_DREQ_RECEIVED: | 1650 | case IB_CM_DREQ_RECEIVED: |
| 1631 | shost_printk(KERN_WARNING, target->scsi_host, | 1651 | shost_printk(KERN_WARNING, target->scsi_host, |
| 1632 | PFX "DREQ received - connection closed\n"); | 1652 | PFX "DREQ received - connection closed\n"); |
| 1653 | srp_change_conn_state(target, false); | ||
| 1633 | if (ib_send_cm_drep(cm_id, NULL, 0)) | 1654 | if (ib_send_cm_drep(cm_id, NULL, 0)) |
| 1634 | shost_printk(KERN_ERR, target->scsi_host, | 1655 | shost_printk(KERN_ERR, target->scsi_host, |
| 1635 | PFX "Sending CM DREP failed\n"); | 1656 | PFX "Sending CM DREP failed\n"); |
| @@ -1942,6 +1963,7 @@ static int srp_add_target(struct srp_host *host, struct srp_target_port *target) | |||
| 1942 | spin_unlock(&host->target_lock); | 1963 | spin_unlock(&host->target_lock); |
| 1943 | 1964 | ||
| 1944 | target->state = SRP_TARGET_LIVE; | 1965 | target->state = SRP_TARGET_LIVE; |
| 1966 | target->connected = false; | ||
| 1945 | 1967 | ||
| 1946 | scsi_scan_target(&target->scsi_host->shost_gendev, | 1968 | scsi_scan_target(&target->scsi_host->shost_gendev, |
| 1947 | 0, target->scsi_id, SCAN_WILD_CARD, 0); | 1969 | 0, target->scsi_id, SCAN_WILD_CARD, 0); |
diff --git a/drivers/infiniband/ulp/srp/ib_srp.h b/drivers/infiniband/ulp/srp/ib_srp.h index 02dc3acb718..ef95fa4ca3e 100644 --- a/drivers/infiniband/ulp/srp/ib_srp.h +++ b/drivers/infiniband/ulp/srp/ib_srp.h | |||
| @@ -163,6 +163,7 @@ struct srp_target_port { | |||
| 163 | int path_query_id; | 163 | int path_query_id; |
| 164 | 164 | ||
| 165 | u32 rq_tmo_jiffies; | 165 | u32 rq_tmo_jiffies; |
| 166 | bool connected; | ||
| 166 | 167 | ||
| 167 | struct ib_cm_id *cm_id; | 168 | struct ib_cm_id *cm_id; |
| 168 | 169 | ||
