diff options
Diffstat (limited to 'drivers/scsi/libsas/sas_init.c')
-rw-r--r-- | drivers/scsi/libsas/sas_init.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/drivers/scsi/libsas/sas_init.c b/drivers/scsi/libsas/sas_init.c index afd928bf903e..c81a63b5dc71 100644 --- a/drivers/scsi/libsas/sas_init.c +++ b/drivers/scsi/libsas/sas_init.c | |||
@@ -110,6 +110,7 @@ void sas_hash_addr(u8 *hashed, const u8 *sas_addr) | |||
110 | 110 | ||
111 | int sas_register_ha(struct sas_ha_struct *sas_ha) | 111 | int sas_register_ha(struct sas_ha_struct *sas_ha) |
112 | { | 112 | { |
113 | char name[64]; | ||
113 | int error = 0; | 114 | int error = 0; |
114 | 115 | ||
115 | mutex_init(&sas_ha->disco_mutex); | 116 | mutex_init(&sas_ha->disco_mutex); |
@@ -143,10 +144,24 @@ int sas_register_ha(struct sas_ha_struct *sas_ha) | |||
143 | goto Undo_ports; | 144 | goto Undo_ports; |
144 | } | 145 | } |
145 | 146 | ||
147 | error = -ENOMEM; | ||
148 | snprintf(name, sizeof(name), "%s_event_q", dev_name(sas_ha->dev)); | ||
149 | sas_ha->event_q = create_singlethread_workqueue(name); | ||
150 | if (!sas_ha->event_q) | ||
151 | goto Undo_ports; | ||
152 | |||
153 | snprintf(name, sizeof(name), "%s_disco_q", dev_name(sas_ha->dev)); | ||
154 | sas_ha->disco_q = create_singlethread_workqueue(name); | ||
155 | if (!sas_ha->disco_q) | ||
156 | goto Undo_event_q; | ||
157 | |||
146 | INIT_LIST_HEAD(&sas_ha->eh_done_q); | 158 | INIT_LIST_HEAD(&sas_ha->eh_done_q); |
147 | INIT_LIST_HEAD(&sas_ha->eh_ata_q); | 159 | INIT_LIST_HEAD(&sas_ha->eh_ata_q); |
148 | 160 | ||
149 | return 0; | 161 | return 0; |
162 | |||
163 | Undo_event_q: | ||
164 | destroy_workqueue(sas_ha->event_q); | ||
150 | Undo_ports: | 165 | Undo_ports: |
151 | sas_unregister_ports(sas_ha); | 166 | sas_unregister_ports(sas_ha); |
152 | Undo_phys: | 167 | Undo_phys: |
@@ -177,6 +192,9 @@ int sas_unregister_ha(struct sas_ha_struct *sas_ha) | |||
177 | __sas_drain_work(sas_ha); | 192 | __sas_drain_work(sas_ha); |
178 | mutex_unlock(&sas_ha->drain_mutex); | 193 | mutex_unlock(&sas_ha->drain_mutex); |
179 | 194 | ||
195 | destroy_workqueue(sas_ha->disco_q); | ||
196 | destroy_workqueue(sas_ha->event_q); | ||
197 | |||
180 | return 0; | 198 | return 0; |
181 | } | 199 | } |
182 | 200 | ||