aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi')
-rw-r--r--drivers/scsi/libfc/fc_disc.c31
1 files changed, 12 insertions, 19 deletions
diff --git a/drivers/scsi/libfc/fc_disc.c b/drivers/scsi/libfc/fc_disc.c
index bbea41e50a57..736f91742064 100644
--- a/drivers/scsi/libfc/fc_disc.c
+++ b/drivers/scsi/libfc/fc_disc.c
@@ -49,7 +49,7 @@ static void fc_disc_gpn_ft_req(struct fc_disc *);
49static void fc_disc_gpn_ft_resp(struct fc_seq *, struct fc_frame *, void *); 49static void fc_disc_gpn_ft_resp(struct fc_seq *, struct fc_frame *, void *);
50static int fc_disc_new_target(struct fc_disc *, struct fc_rport_priv *, 50static int fc_disc_new_target(struct fc_disc *, struct fc_rport_priv *,
51 struct fc_rport_identifiers *); 51 struct fc_rport_identifiers *);
52static void fc_disc_done(struct fc_disc *); 52static void fc_disc_done(struct fc_disc *, enum fc_disc_event);
53static void fc_disc_timeout(struct work_struct *); 53static void fc_disc_timeout(struct work_struct *);
54static void fc_disc_single(struct fc_disc *, struct fc_disc_port *); 54static void fc_disc_single(struct fc_disc *, struct fc_disc_port *);
55static void fc_disc_restart(struct fc_disc *); 55static void fc_disc_restart(struct fc_disc *);
@@ -329,8 +329,7 @@ static void fc_disc_start(void (*disc_callback)(struct fc_lport *,
329 if (rdata) { 329 if (rdata) {
330 kref_get(&rdata->kref); 330 kref_get(&rdata->kref);
331 if (!fc_disc_new_target(disc, rdata, &rdata->ids)) { 331 if (!fc_disc_new_target(disc, rdata, &rdata->ids)) {
332 disc->event = DISC_EV_SUCCESS; 332 fc_disc_done(disc, DISC_EV_SUCCESS);
333 fc_disc_done(disc);
334 } 333 }
335 kref_put(&rdata->kref, rdata->local_port->tt.rport_destroy); 334 kref_put(&rdata->kref, rdata->local_port->tt.rport_destroy);
336 } else { 335 } else {
@@ -404,20 +403,18 @@ static int fc_disc_new_target(struct fc_disc *disc,
404/** 403/**
405 * fc_disc_done() - Discovery has been completed 404 * fc_disc_done() - Discovery has been completed
406 * @disc: FC discovery context 405 * @disc: FC discovery context
406 * @event: discovery completion status
407 *
407 * Locking Note: This function expects that the disc mutex is locked before 408 * Locking Note: This function expects that the disc mutex is locked before
408 * it is called. The discovery callback is then made with the lock released, 409 * it is called. The discovery callback is then made with the lock released,
409 * and the lock is re-taken before returning from this function 410 * and the lock is re-taken before returning from this function
410 */ 411 */
411static void fc_disc_done(struct fc_disc *disc) 412static void fc_disc_done(struct fc_disc *disc, enum fc_disc_event event)
412{ 413{
413 struct fc_lport *lport = disc->lport; 414 struct fc_lport *lport = disc->lport;
414 enum fc_disc_event event;
415 415
416 FC_DISC_DBG(disc, "Discovery complete\n"); 416 FC_DISC_DBG(disc, "Discovery complete\n");
417 417
418 event = disc->event;
419 disc->event = DISC_EV_NONE;
420
421 if (disc->requested) 418 if (disc->requested)
422 fc_disc_gpn_ft_req(disc); 419 fc_disc_gpn_ft_req(disc);
423 else 420 else
@@ -460,11 +457,8 @@ static void fc_disc_error(struct fc_disc *disc, struct fc_frame *fp)
460 } 457 }
461 disc->retry_count++; 458 disc->retry_count++;
462 schedule_delayed_work(&disc->disc_work, delay); 459 schedule_delayed_work(&disc->disc_work, delay);
463 } else { 460 } else
464 /* exceeded retries */ 461 fc_disc_done(disc, DISC_EV_FAILED);
465 disc->event = DISC_EV_FAILED;
466 fc_disc_done(disc);
467 }
468 } 462 }
469} 463}
470 464
@@ -503,10 +497,12 @@ err:
503} 497}
504 498
505/** 499/**
506 * fc_disc_gpn_ft_parse() - Parse the list of IDs and names resulting from a request 500 * fc_disc_gpn_ft_parse() - Parse the body of the dNS GPN_FT response.
507 * @lport: Fibre Channel host port instance 501 * @lport: Fibre Channel host port instance
508 * @buf: GPN_FT response buffer 502 * @buf: GPN_FT response buffer
509 * @len: size of response buffer 503 * @len: size of response buffer
504 *
505 * Goes through the list of IDs and names resulting from a request.
510 */ 506 */
511static int fc_disc_gpn_ft_parse(struct fc_disc *disc, void *buf, size_t len) 507static int fc_disc_gpn_ft_parse(struct fc_disc *disc, void *buf, size_t len)
512{ 508{
@@ -577,8 +573,7 @@ static int fc_disc_gpn_ft_parse(struct fc_disc *disc, void *buf, size_t len)
577 } 573 }
578 574
579 if (np->fp_flags & FC_NS_FID_LAST) { 575 if (np->fp_flags & FC_NS_FID_LAST) {
580 disc->event = DISC_EV_SUCCESS; 576 fc_disc_done(disc, DISC_EV_SUCCESS);
581 fc_disc_done(disc);
582 len = 0; 577 len = 0;
583 break; 578 break;
584 } 579 }
@@ -669,8 +664,7 @@ static void fc_disc_gpn_ft_resp(struct fc_seq *sp, struct fc_frame *fp,
669 FC_DISC_DBG(disc, "GPN_FT rejected reason %x exp %x " 664 FC_DISC_DBG(disc, "GPN_FT rejected reason %x exp %x "
670 "(check zoning)\n", cp->ct_reason, 665 "(check zoning)\n", cp->ct_reason,
671 cp->ct_explan); 666 cp->ct_explan);
672 disc->event = DISC_EV_FAILED; 667 fc_disc_done(disc, DISC_EV_FAILED);
673 fc_disc_done(disc);
674 } else { 668 } else {
675 FC_DISC_DBG(disc, "GPN_FT unexpected response code " 669 FC_DISC_DBG(disc, "GPN_FT unexpected response code "
676 "%x\n", ntohs(cp->ct_cmd)); 670 "%x\n", ntohs(cp->ct_cmd));
@@ -782,7 +776,6 @@ int fc_disc_init(struct fc_lport *lport)
782 776
783 disc->lport = lport; 777 disc->lport = lport;
784 disc->delay = FC_DISC_DELAY; 778 disc->delay = FC_DISC_DELAY;
785 disc->event = DISC_EV_NONE;
786 779
787 return 0; 780 return 0;
788} 781}