Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 83245
b: refs/heads/master
c: 9fe4bcf
h: refs/heads/master
i:
  83243: 84fb638
v: v3
  • Loading branch information
David Dillow authored and Roland Dreier committed Feb 5, 2008
1 parent 44f6e31 commit 7b3aa31
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 13 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 893da75956ab48545e8732b46e1cf4350bd25f9c
refs/heads/master: 9fe4bcf45ece0b0081031edaaa41581c85ef7049
53 changes: 41 additions & 12 deletions trunk/drivers/infiniband/ulp/srp/ib_srp.c
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,22 @@ static int srp_init_qp(struct srp_target_port *target,
return ret;
}

static int srp_new_cm_id(struct srp_target_port *target)
{
struct ib_cm_id *new_cm_id;

new_cm_id = ib_create_cm_id(target->srp_host->dev->dev,
srp_cm_handler, target);
if (IS_ERR(new_cm_id))
return PTR_ERR(new_cm_id);

if (target->cm_id)
ib_destroy_cm_id(target->cm_id);
target->cm_id = new_cm_id;

return 0;
}

static int srp_create_target_ib(struct srp_target_port *target)
{
struct ib_qp_init_attr *init_attr;
Expand Down Expand Up @@ -436,6 +452,7 @@ static void srp_remove_work(struct work_struct *work)

static int srp_connect_target(struct srp_target_port *target)
{
int retries = 3;
int ret;

ret = srp_lookup_path(target);
Expand Down Expand Up @@ -468,6 +485,21 @@ static int srp_connect_target(struct srp_target_port *target)
case SRP_DLID_REDIRECT:
break;

case SRP_STALE_CONN:
/* Our current CM id was stale, and is now in timewait.
* Try to reconnect with a new one.
*/
if (!retries-- || srp_new_cm_id(target)) {
shost_printk(KERN_ERR, target->scsi_host, PFX
"giving up on stale connection\n");
target->status = -ECONNRESET;
return target->status;
}

shost_printk(KERN_ERR, target->scsi_host, PFX
"retrying stale connection\n");
break;

default:
return target->status;
}
Expand Down Expand Up @@ -507,7 +539,6 @@ static void srp_reset_req(struct srp_target_port *target, struct srp_request *re

static int srp_reconnect_target(struct srp_target_port *target)
{
struct ib_cm_id *new_cm_id;
struct ib_qp_attr qp_attr;
struct srp_request *req, *tmp;
struct ib_wc wc;
Expand All @@ -526,14 +557,9 @@ static int srp_reconnect_target(struct srp_target_port *target)
* Now get a new local CM ID so that we avoid confusing the
* target in case things are really fouled up.
*/
new_cm_id = ib_create_cm_id(target->srp_host->dev->dev,
srp_cm_handler, target);
if (IS_ERR(new_cm_id)) {
ret = PTR_ERR(new_cm_id);
ret = srp_new_cm_id(target);
if (ret)
goto err;
}
ib_destroy_cm_id(target->cm_id);
target->cm_id = new_cm_id;

qp_attr.qp_state = IB_QPS_RESET;
ret = ib_modify_qp(target->qp, &qp_attr, IB_QP_STATE);
Expand Down Expand Up @@ -1171,6 +1197,11 @@ static void srp_cm_rej_handler(struct ib_cm_id *cm_id,
target->status = -ECONNRESET;
break;

case IB_CM_REJ_STALE_CONN:
shost_printk(KERN_WARNING, shost, " REJ reason: stale connection\n");
target->status = SRP_STALE_CONN;
break;

default:
shost_printk(KERN_WARNING, shost, " REJ reason 0x%x\n",
event->param.rej_rcvd.reason);
Expand Down Expand Up @@ -1862,11 +1893,9 @@ static ssize_t srp_create_target(struct class_device *class_dev,
if (ret)
goto err;

target->cm_id = ib_create_cm_id(host->dev->dev, srp_cm_handler, target);
if (IS_ERR(target->cm_id)) {
ret = PTR_ERR(target->cm_id);
ret = srp_new_cm_id(target);
if (ret)
goto err_free;
}

target->qp_in_error = 0;
ret = srp_connect_target(target);
Expand Down
1 change: 1 addition & 0 deletions trunk/drivers/infiniband/ulp/srp/ib_srp.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ enum {

SRP_PORT_REDIRECT = 1,
SRP_DLID_REDIRECT = 2,
SRP_STALE_CONN = 3,

SRP_MAX_LUN = 512,
SRP_DEF_SG_TABLESIZE = 12,
Expand Down

0 comments on commit 7b3aa31

Please sign in to comment.