diff options
author | Brian King <brking@linux.vnet.ibm.com> | 2009-05-28 17:17:28 -0400 |
---|---|---|
committer | James Bottomley <James.Bottomley@HansenPartnership.com> | 2009-06-08 14:07:42 -0400 |
commit | 43c8da907ccc656935d1085701f4db83385d8a59 (patch) | |
tree | 586046bab83b676553104d7b80894863ba31872a /drivers/scsi/ibmvscsi/ibmvfc.h | |
parent | 7d0e462247241b8ec2d377306203b58c7f423553 (diff) |
[SCSI] ibmvfc: Fix deadlock in EH
Fixes the following deadlock scenario shown below. We currently allow
queuecommand to send commands when the ibmvfc workqueue is scanning for
new rports, so we should also allow EH to function at this time as well.
scsi_eh_3 D 0000000000000000 12304 1279 2
Call Trace:
[c0000002f7257730] [c0000002f72577e0] 0xc0000002f72577e0 (unreliable)
[c0000002f7257900] [c0000000000118f4] .__switch_to+0x158/0x1a0
[c0000002f72579a0] [c0000000004f8b40] .schedule+0x8d4/0x9dc
[c0000002f7257b60] [c0000000004f8f08] .schedule_timeout+0xa8/0xe8
[c0000002f7257c50] [d0000000001d23e0] .ibmvfc_wait_while_resetting+0xe4/0x140 [ibmvfc]
[c0000002f7257d20] [d0000000001d3984] .ibmvfc_eh_abort_handler+0x60/0xe4 [ibmvfc]
[c0000002f7257dc0] [d000000000366714] .scsi_error_handler+0x38c/0x674 [scsi_mod]
[c0000002f7257f00] [c0000000000a7470] .kthread+0x78/0xc4
[c0000002f7257f90] [c000000000029b8c] .kernel_thread+0x4c/0x68
ibmvfc_3 D 0000000000000000 12432 1280 2
Call Trace:
[c0000002f7253540] [c0000002f72535f0] 0xc0000002f72535f0 (unreliable)
[c0000002f7253710] [c0000000000118f4] .__switch_to+0x158/0x1a0
[c0000002f72537b0] [c0000000004f8b40] .schedule+0x8d4/0x9dc
[c0000002f7253970] [c0000000004f8e98] .schedule_timeout+0x38/0xe8
[c0000002f7253a60] [c0000000004f80cc] .wait_for_common+0x138/0x220
[c0000002f7253b40] [c0000000000a2784] .flush_cpu_workqueue+0xac/0xcc
[c0000002f7253c10] [c0000000000a2960] .flush_workqueue+0x58/0xa0
[c0000002f7253ca0] [d0000000000827fc] .fc_flush_work+0x4c/0x64 [scsi_transport_fc]
[c0000002f7253d20] [d000000000082db4] .fc_remote_port_add+0x48/0x6c4 [scsi_transport_fc]
[c0000002f7253dd0] [d0000000001d7d04] .ibmvfc_work+0x820/0xa7c [ibmvfc]
[c0000002f7253f00] [c0000000000a7470] .kthread+0x78/0xc4
[c0000002f7253f90] [c000000000029b8c] .kernel_thread+0x4c/0x68
fc_wq_3 D 0000000000000000 10720 1283 2
Call Trace:
[c0000002f559ac30] [c0000002f559ace0] 0xc0000002f559ace0 (unreliable)
[c0000002f559ae00] [c0000000000118f4] .__switch_to+0x158/0x1a0
[c0000002f559aea0] [c0000000004f8b40] .schedule+0x8d4/0x9dc
[c0000002f559b060] [c0000000004f8e98] .schedule_timeout+0x38/0xe8
[c0000002f559b150] [c0000000004f80cc] .wait_for_common+0x138/0x220
[c0000002f559b230] [c0000000002721c4] .blk_execute_rq+0xb4/0x100
[c0000002f559b360] [d00000000036a1f8] .scsi_execute+0x118/0x194 [scsi_mod]
[c0000002f559b420] [d00000000036a32c] .scsi_execute_req+0xb8/0x124 [scsi_mod]
[c0000002f559b500] [d0000000000c1330] .sd_sync_cache+0x8c/0x108 [sd_mod]
[c0000002f559b5e0] [d0000000000c15b4] .sd_shutdown+0x9c/0x158 [sd_mod]
[c0000002f559b660] [d0000000000c16d0] .sd_remove+0x60/0xb4 [sd_mod]
[c0000002f559b700] [c000000000392ecc] .__device_release_driver+0xd0/0x118
[c0000002f559b7a0] [c000000000393080] .device_release_driver+0x30/0x54
[c0000002f559b830] [c000000000392108] .bus_remove_device+0x128/0x16c
[c0000002f559b8d0] [c00000000038f94c] .device_del+0x158/0x234
[c0000002f559b960] [d00000000036f078] .__scsi_remove_device+0x5c/0xd4 [scsi_mod]
[c0000002f559b9f0] [d00000000036f124] .scsi_remove_device+0x34/0x58 [scsi_mod]
[c0000002f559ba80] [d00000000036f204] .__scsi_remove_target+0xb4/0x120 [scsi_mod]
[c0000002f559bb10] [d00000000036f338] .__remove_child+0x2c/0x44 [scsi_mod]
[c0000002f559bb90] [c00000000038f11c] .device_for_each_child+0x54/0xb4
[c0000002f559bc50] [d00000000036f2e0] .scsi_remove_target+0x70/0x9c [scsi_mod]
[c0000002f559bce0] [d000000000083454] .fc_starget_delete+0x24/0x3c [scsi_transport_fc]
[c0000002f559bd70] [c0000000000a2368] .run_workqueue+0x118/0x208
[c0000002f559be30] [c0000000000a2580] .worker_thread+0x128/0x154
[c0000002f559bf00] [c0000000000a7470] .kthread+0x78/0xc4
[c0000002f559bf90] [c000000000029b8c] .kernel_thread+0x4c/0x68
Signed-off-by: Brian King <brking@linux.vnet.ibm.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Diffstat (limited to 'drivers/scsi/ibmvscsi/ibmvfc.h')
-rw-r--r-- | drivers/scsi/ibmvscsi/ibmvfc.h | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/drivers/scsi/ibmvscsi/ibmvfc.h b/drivers/scsi/ibmvscsi/ibmvfc.h index 4dac3560c1a4..3a6a725fd396 100644 --- a/drivers/scsi/ibmvscsi/ibmvfc.h +++ b/drivers/scsi/ibmvscsi/ibmvfc.h | |||
@@ -575,7 +575,6 @@ enum ibmvfc_target_action { | |||
575 | IBMVFC_TGT_ACTION_NONE = 0, | 575 | IBMVFC_TGT_ACTION_NONE = 0, |
576 | IBMVFC_TGT_ACTION_INIT, | 576 | IBMVFC_TGT_ACTION_INIT, |
577 | IBMVFC_TGT_ACTION_INIT_WAIT, | 577 | IBMVFC_TGT_ACTION_INIT_WAIT, |
578 | IBMVFC_TGT_ACTION_ADD_RPORT, | ||
579 | IBMVFC_TGT_ACTION_DEL_RPORT, | 578 | IBMVFC_TGT_ACTION_DEL_RPORT, |
580 | }; | 579 | }; |
581 | 580 | ||
@@ -588,6 +587,7 @@ struct ibmvfc_target { | |||
588 | int target_id; | 587 | int target_id; |
589 | enum ibmvfc_target_action action; | 588 | enum ibmvfc_target_action action; |
590 | int need_login; | 589 | int need_login; |
590 | int add_rport; | ||
591 | int init_retries; | 591 | int init_retries; |
592 | u32 cancel_key; | 592 | u32 cancel_key; |
593 | struct ibmvfc_service_parms service_parms; | 593 | struct ibmvfc_service_parms service_parms; |
@@ -635,7 +635,6 @@ enum ibmvfc_host_action { | |||
635 | IBMVFC_HOST_ACTION_ALLOC_TGTS, | 635 | IBMVFC_HOST_ACTION_ALLOC_TGTS, |
636 | IBMVFC_HOST_ACTION_TGT_INIT, | 636 | IBMVFC_HOST_ACTION_TGT_INIT, |
637 | IBMVFC_HOST_ACTION_TGT_DEL_FAILED, | 637 | IBMVFC_HOST_ACTION_TGT_DEL_FAILED, |
638 | IBMVFC_HOST_ACTION_TGT_ADD, | ||
639 | }; | 638 | }; |
640 | 639 | ||
641 | enum ibmvfc_host_state { | 640 | enum ibmvfc_host_state { |
@@ -682,6 +681,7 @@ struct ibmvfc_host { | |||
682 | int client_migrated; | 681 | int client_migrated; |
683 | int reinit; | 682 | int reinit; |
684 | int delay_init; | 683 | int delay_init; |
684 | int scan_complete; | ||
685 | int events_to_log; | 685 | int events_to_log; |
686 | #define IBMVFC_AE_LINKUP 0x0001 | 686 | #define IBMVFC_AE_LINKUP 0x0001 |
687 | #define IBMVFC_AE_LINKDOWN 0x0002 | 687 | #define IBMVFC_AE_LINKDOWN 0x0002 |
@@ -692,6 +692,7 @@ struct ibmvfc_host { | |||
692 | void (*job_step) (struct ibmvfc_host *); | 692 | void (*job_step) (struct ibmvfc_host *); |
693 | struct task_struct *work_thread; | 693 | struct task_struct *work_thread; |
694 | struct tasklet_struct tasklet; | 694 | struct tasklet_struct tasklet; |
695 | struct work_struct rport_add_work_q; | ||
695 | wait_queue_head_t init_wait_q; | 696 | wait_queue_head_t init_wait_q; |
696 | wait_queue_head_t work_wait_q; | 697 | wait_queue_head_t work_wait_q; |
697 | }; | 698 | }; |