diff options
Diffstat (limited to 'drivers/s390/scsi/zfcp_scsi.c')
-rw-r--r-- | drivers/s390/scsi/zfcp_scsi.c | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/drivers/s390/scsi/zfcp_scsi.c b/drivers/s390/scsi/zfcp_scsi.c index e7d065209065..e8fbeaeb5fbf 100644 --- a/drivers/s390/scsi/zfcp_scsi.c +++ b/drivers/s390/scsi/zfcp_scsi.c | |||
@@ -486,10 +486,12 @@ static void zfcp_set_rport_dev_loss_tmo(struct fc_rport *rport, u32 timeout) | |||
486 | */ | 486 | */ |
487 | static void zfcp_scsi_dev_loss_tmo_callbk(struct fc_rport *rport) | 487 | static void zfcp_scsi_dev_loss_tmo_callbk(struct fc_rport *rport) |
488 | { | 488 | { |
489 | struct zfcp_port *port = rport->dd_data; | 489 | struct zfcp_port *port; |
490 | 490 | ||
491 | write_lock_irq(&zfcp_data.config_lock); | 491 | write_lock_irq(&zfcp_data.config_lock); |
492 | port->rport = NULL; | 492 | port = rport->dd_data; |
493 | if (port) | ||
494 | port->rport = NULL; | ||
493 | write_unlock_irq(&zfcp_data.config_lock); | 495 | write_unlock_irq(&zfcp_data.config_lock); |
494 | } | 496 | } |
495 | 497 | ||
@@ -503,9 +505,18 @@ static void zfcp_scsi_dev_loss_tmo_callbk(struct fc_rport *rport) | |||
503 | */ | 505 | */ |
504 | static void zfcp_scsi_terminate_rport_io(struct fc_rport *rport) | 506 | static void zfcp_scsi_terminate_rport_io(struct fc_rport *rport) |
505 | { | 507 | { |
506 | struct zfcp_port *port = rport->dd_data; | 508 | struct zfcp_port *port; |
509 | |||
510 | write_lock_irq(&zfcp_data.config_lock); | ||
511 | port = rport->dd_data; | ||
512 | if (port) | ||
513 | zfcp_port_get(port); | ||
514 | write_unlock_irq(&zfcp_data.config_lock); | ||
507 | 515 | ||
508 | zfcp_erp_port_reopen(port, 0, "sctrpi1", NULL); | 516 | if (port) { |
517 | zfcp_erp_port_reopen(port, 0, "sctrpi1", NULL); | ||
518 | zfcp_port_put(port); | ||
519 | } | ||
509 | } | 520 | } |
510 | 521 | ||
511 | static void zfcp_scsi_rport_register(struct zfcp_port *port) | 522 | static void zfcp_scsi_rport_register(struct zfcp_port *port) |
@@ -534,8 +545,10 @@ static void zfcp_scsi_rport_register(struct zfcp_port *port) | |||
534 | 545 | ||
535 | static void zfcp_scsi_rport_block(struct zfcp_port *port) | 546 | static void zfcp_scsi_rport_block(struct zfcp_port *port) |
536 | { | 547 | { |
537 | if (port->rport) | 548 | struct fc_rport *rport = port->rport; |
538 | fc_remote_port_delete(port->rport); | 549 | |
550 | if (rport) | ||
551 | fc_remote_port_delete(rport); | ||
539 | } | 552 | } |
540 | 553 | ||
541 | void zfcp_scsi_schedule_rport_register(struct zfcp_port *port) | 554 | void zfcp_scsi_schedule_rport_register(struct zfcp_port *port) |