diff options
author | Swen Schillig <swen@vnet.ibm.com> | 2009-11-24 10:54:05 -0500 |
---|---|---|
committer | James Bottomley <James.Bottomley@suse.de> | 2009-12-04 13:02:07 -0500 |
commit | 6b183334c23969d52d4d9f775da554480d05ca4d (patch) | |
tree | 32f791e10aff8be2acaede6c3881b6561a65cc5a /drivers/s390 | |
parent | c1fad4176464281e776022dee7d029144afbeb13 (diff) |
[SCSI] zfcp: Remove STATUS_COMMON_REMOVE flag as it is not required anymore
The flag ZFCP_STATUS_COMMON_REMOVE was used to indicate that a
resource is not ready to be used or about to be removed from the
system. This is now better done by an improved list handling
and therefore the additional indicator is not required anymore.
Signed-off-by: Swen Schillig <swen@vnet.ibm.com>
Signed-off-by: Christof Schmitt <christof.schmitt@de.ibm.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Diffstat (limited to 'drivers/s390')
-rw-r--r-- | drivers/s390/scsi/zfcp_aux.c | 27 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_ccw.c | 7 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_def.h | 1 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_erp.c | 6 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_fc.c | 1 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_sysfs.c | 70 |
6 files changed, 34 insertions, 78 deletions
diff --git a/drivers/s390/scsi/zfcp_aux.c b/drivers/s390/scsi/zfcp_aux.c index 12de1ce9a92d..6b94f8d0609c 100644 --- a/drivers/s390/scsi/zfcp_aux.c +++ b/drivers/s390/scsi/zfcp_aux.c | |||
@@ -245,9 +245,9 @@ struct zfcp_unit *zfcp_get_unit_by_lun(struct zfcp_port *port, u64 fcp_lun) | |||
245 | 245 | ||
246 | read_lock_irqsave(&port->unit_list_lock, flags); | 246 | read_lock_irqsave(&port->unit_list_lock, flags); |
247 | list_for_each_entry(unit, &port->unit_list, list) | 247 | list_for_each_entry(unit, &port->unit_list, list) |
248 | if ((unit->fcp_lun == fcp_lun) && | 248 | if (unit->fcp_lun == fcp_lun) { |
249 | !(atomic_read(&unit->status) & ZFCP_STATUS_COMMON_REMOVE)) { | 249 | if (!get_device(&unit->sysfs_device)) |
250 | get_device(&unit->sysfs_device); | 250 | unit = NULL; |
251 | read_unlock_irqrestore(&port->unit_list_lock, flags); | 251 | read_unlock_irqrestore(&port->unit_list_lock, flags); |
252 | return unit; | 252 | return unit; |
253 | } | 253 | } |
@@ -270,9 +270,9 @@ struct zfcp_port *zfcp_get_port_by_wwpn(struct zfcp_adapter *adapter, | |||
270 | 270 | ||
271 | read_lock_irqsave(&adapter->port_list_lock, flags); | 271 | read_lock_irqsave(&adapter->port_list_lock, flags); |
272 | list_for_each_entry(port, &adapter->port_list, list) | 272 | list_for_each_entry(port, &adapter->port_list, list) |
273 | if ((port->wwpn == wwpn) && | 273 | if (port->wwpn == wwpn) { |
274 | !(atomic_read(&port->status) & ZFCP_STATUS_COMMON_REMOVE)) { | 274 | if (!get_device(&port->sysfs_device)) |
275 | get_device(&port->sysfs_device); | 275 | port = NULL; |
276 | read_unlock_irqrestore(&adapter->port_list_lock, flags); | 276 | read_unlock_irqrestore(&adapter->port_list_lock, flags); |
277 | return port; | 277 | return port; |
278 | } | 278 | } |
@@ -334,9 +334,6 @@ struct zfcp_unit *zfcp_unit_enqueue(struct zfcp_port *port, u64 fcp_lun) | |||
334 | } | 334 | } |
335 | retval = -EINVAL; | 335 | retval = -EINVAL; |
336 | 336 | ||
337 | /* mark unit unusable as long as sysfs registration is not complete */ | ||
338 | atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &unit->status); | ||
339 | |||
340 | INIT_WORK(&unit->scsi_work, zfcp_scsi_scan); | 337 | INIT_WORK(&unit->scsi_work, zfcp_scsi_scan); |
341 | 338 | ||
342 | spin_lock_init(&unit->latencies.lock); | 339 | spin_lock_init(&unit->latencies.lock); |
@@ -360,7 +357,6 @@ struct zfcp_unit *zfcp_unit_enqueue(struct zfcp_port *port, u64 fcp_lun) | |||
360 | list_add_tail(&unit->list, &port->unit_list); | 357 | list_add_tail(&unit->list, &port->unit_list); |
361 | write_unlock_irq(&port->unit_list_lock); | 358 | write_unlock_irq(&port->unit_list_lock); |
362 | 359 | ||
363 | atomic_clear_mask(ZFCP_STATUS_COMMON_REMOVE, &unit->status); | ||
364 | atomic_set_mask(ZFCP_STATUS_COMMON_RUNNING, &unit->status); | 360 | atomic_set_mask(ZFCP_STATUS_COMMON_RUNNING, &unit->status); |
365 | 361 | ||
366 | return unit; | 362 | return unit; |
@@ -565,17 +561,12 @@ struct zfcp_adapter *zfcp_adapter_enqueue(struct ccw_device *ccw_device) | |||
565 | 561 | ||
566 | adapter->service_level.seq_print = zfcp_print_sl; | 562 | adapter->service_level.seq_print = zfcp_print_sl; |
567 | 563 | ||
568 | /* mark adapter unusable as long as sysfs registration is not complete */ | ||
569 | atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &adapter->status); | ||
570 | |||
571 | dev_set_drvdata(&ccw_device->dev, adapter); | 564 | dev_set_drvdata(&ccw_device->dev, adapter); |
572 | 565 | ||
573 | if (sysfs_create_group(&ccw_device->dev.kobj, | 566 | if (sysfs_create_group(&ccw_device->dev.kobj, |
574 | &zfcp_sysfs_adapter_attrs)) | 567 | &zfcp_sysfs_adapter_attrs)) |
575 | goto failed; | 568 | goto failed; |
576 | 569 | ||
577 | atomic_clear_mask(ZFCP_STATUS_COMMON_REMOVE, &adapter->status); | ||
578 | |||
579 | if (!zfcp_adapter_scsi_register(adapter)) | 570 | if (!zfcp_adapter_scsi_register(adapter)) |
580 | return adapter; | 571 | return adapter; |
581 | 572 | ||
@@ -692,9 +683,6 @@ struct zfcp_port *zfcp_port_enqueue(struct zfcp_adapter *adapter, u64 wwpn, | |||
692 | port->sysfs_device.parent = &adapter->ccw_device->dev; | 683 | port->sysfs_device.parent = &adapter->ccw_device->dev; |
693 | port->sysfs_device.release = zfcp_port_release; | 684 | port->sysfs_device.release = zfcp_port_release; |
694 | 685 | ||
695 | /* mark port unusable as long as sysfs registration is not complete */ | ||
696 | atomic_set_mask(status | ZFCP_STATUS_COMMON_REMOVE, &port->status); | ||
697 | |||
698 | if (dev_set_name(&port->sysfs_device, "0x%016llx", | 686 | if (dev_set_name(&port->sysfs_device, "0x%016llx", |
699 | (unsigned long long)wwpn)) { | 687 | (unsigned long long)wwpn)) { |
700 | kfree(port); | 688 | kfree(port); |
@@ -715,8 +703,7 @@ struct zfcp_port *zfcp_port_enqueue(struct zfcp_adapter *adapter, u64 wwpn, | |||
715 | list_add_tail(&port->list, &adapter->port_list); | 703 | list_add_tail(&port->list, &adapter->port_list); |
716 | write_unlock_irq(&adapter->port_list_lock); | 704 | write_unlock_irq(&adapter->port_list_lock); |
717 | 705 | ||
718 | atomic_clear_mask(ZFCP_STATUS_COMMON_REMOVE, &port->status); | 706 | atomic_set_mask(status | ZFCP_STATUS_COMMON_RUNNING, &port->status); |
719 | atomic_set_mask(ZFCP_STATUS_COMMON_RUNNING, &port->status); | ||
720 | 707 | ||
721 | return port; | 708 | return port; |
722 | 709 | ||
diff --git a/drivers/s390/scsi/zfcp_ccw.c b/drivers/s390/scsi/zfcp_ccw.c index 4d35902a0cc5..c22cb72a5ae8 100644 --- a/drivers/s390/scsi/zfcp_ccw.c +++ b/drivers/s390/scsi/zfcp_ccw.c | |||
@@ -113,16 +113,11 @@ static void zfcp_ccw_remove(struct ccw_device *cdev) | |||
113 | write_lock_irq(&adapter->port_list_lock); | 113 | write_lock_irq(&adapter->port_list_lock); |
114 | list_for_each_entry_safe(port, p, &adapter->port_list, list) { | 114 | list_for_each_entry_safe(port, p, &adapter->port_list, list) { |
115 | write_lock(&port->unit_list_lock); | 115 | write_lock(&port->unit_list_lock); |
116 | list_for_each_entry_safe(unit, u, &port->unit_list, list) { | 116 | list_for_each_entry_safe(unit, u, &port->unit_list, list) |
117 | atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, | ||
118 | &unit->status); | ||
119 | list_move(&unit->list, &unit_remove_lh); | 117 | list_move(&unit->list, &unit_remove_lh); |
120 | } | ||
121 | write_unlock(&port->unit_list_lock); | 118 | write_unlock(&port->unit_list_lock); |
122 | atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &port->status); | ||
123 | list_move(&port->list, &port_remove_lh); | 119 | list_move(&port->list, &port_remove_lh); |
124 | } | 120 | } |
125 | atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &adapter->status); | ||
126 | write_unlock_irq(&adapter->port_list_lock); | 121 | write_unlock_irq(&adapter->port_list_lock); |
127 | zfcp_ccw_adapter_put(adapter); /* put from zfcp_ccw_adapter_by_cdev */ | 122 | zfcp_ccw_adapter_put(adapter); /* put from zfcp_ccw_adapter_by_cdev */ |
128 | 123 | ||
diff --git a/drivers/s390/scsi/zfcp_def.h b/drivers/s390/scsi/zfcp_def.h index 7e84e1624d16..08fa31302f75 100644 --- a/drivers/s390/scsi/zfcp_def.h +++ b/drivers/s390/scsi/zfcp_def.h | |||
@@ -205,7 +205,6 @@ struct zfcp_ls_adisc { | |||
205 | #define ZFCP_COMMON_FLAGS 0xfff00000 | 205 | #define ZFCP_COMMON_FLAGS 0xfff00000 |
206 | 206 | ||
207 | /* common status bits */ | 207 | /* common status bits */ |
208 | #define ZFCP_STATUS_COMMON_REMOVE 0x80000000 | ||
209 | #define ZFCP_STATUS_COMMON_RUNNING 0x40000000 | 208 | #define ZFCP_STATUS_COMMON_RUNNING 0x40000000 |
210 | #define ZFCP_STATUS_COMMON_ERP_FAILED 0x20000000 | 209 | #define ZFCP_STATUS_COMMON_ERP_FAILED 0x20000000 |
211 | #define ZFCP_STATUS_COMMON_UNBLOCKED 0x10000000 | 210 | #define ZFCP_STATUS_COMMON_UNBLOCKED 0x10000000 |
diff --git a/drivers/s390/scsi/zfcp_erp.c b/drivers/s390/scsi/zfcp_erp.c index 788fd3a4cd23..3454c2a3b6b1 100644 --- a/drivers/s390/scsi/zfcp_erp.c +++ b/drivers/s390/scsi/zfcp_erp.c | |||
@@ -174,7 +174,8 @@ static struct zfcp_erp_action *zfcp_erp_setup_act(int need, | |||
174 | 174 | ||
175 | switch (need) { | 175 | switch (need) { |
176 | case ZFCP_ERP_ACTION_REOPEN_UNIT: | 176 | case ZFCP_ERP_ACTION_REOPEN_UNIT: |
177 | get_device(&unit->sysfs_device); | 177 | if (!get_device(&unit->sysfs_device)) |
178 | return NULL; | ||
178 | atomic_set_mask(ZFCP_STATUS_COMMON_ERP_INUSE, &unit->status); | 179 | atomic_set_mask(ZFCP_STATUS_COMMON_ERP_INUSE, &unit->status); |
179 | erp_action = &unit->erp_action; | 180 | erp_action = &unit->erp_action; |
180 | if (!(atomic_read(&unit->status) & ZFCP_STATUS_COMMON_RUNNING)) | 181 | if (!(atomic_read(&unit->status) & ZFCP_STATUS_COMMON_RUNNING)) |
@@ -183,7 +184,8 @@ static struct zfcp_erp_action *zfcp_erp_setup_act(int need, | |||
183 | 184 | ||
184 | case ZFCP_ERP_ACTION_REOPEN_PORT: | 185 | case ZFCP_ERP_ACTION_REOPEN_PORT: |
185 | case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED: | 186 | case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED: |
186 | get_device(&port->sysfs_device); | 187 | if (!get_device(&port->sysfs_device)) |
188 | return NULL; | ||
187 | zfcp_erp_action_dismiss_port(port); | 189 | zfcp_erp_action_dismiss_port(port); |
188 | atomic_set_mask(ZFCP_STATUS_COMMON_ERP_INUSE, &port->status); | 190 | atomic_set_mask(ZFCP_STATUS_COMMON_ERP_INUSE, &port->status); |
189 | erp_action = &port->erp_action; | 191 | erp_action = &port->erp_action; |
diff --git a/drivers/s390/scsi/zfcp_fc.c b/drivers/s390/scsi/zfcp_fc.c index 3e3e72cc724b..9252b65a13a5 100644 --- a/drivers/s390/scsi/zfcp_fc.c +++ b/drivers/s390/scsi/zfcp_fc.c | |||
@@ -589,7 +589,6 @@ static void zfcp_fc_validate_port(struct zfcp_port *port, struct list_head *lh) | |||
589 | !list_empty(&port->unit_list)) | 589 | !list_empty(&port->unit_list)) |
590 | return; | 590 | return; |
591 | 591 | ||
592 | atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &port->status); | ||
593 | list_move_tail(&port->list, lh); | 592 | list_move_tail(&port->list, lh); |
594 | } | 593 | } |
595 | 594 | ||
diff --git a/drivers/s390/scsi/zfcp_sysfs.c b/drivers/s390/scsi/zfcp_sysfs.c index 901cc9a6ed20..35e920b4fd8a 100644 --- a/drivers/s390/scsi/zfcp_sysfs.c +++ b/drivers/s390/scsi/zfcp_sysfs.c | |||
@@ -104,10 +104,8 @@ static ssize_t zfcp_sysfs_##_feat##_failed_store(struct device *dev, \ | |||
104 | unsigned long val; \ | 104 | unsigned long val; \ |
105 | int retval = 0; \ | 105 | int retval = 0; \ |
106 | \ | 106 | \ |
107 | if (atomic_read(&_feat->status) & ZFCP_STATUS_COMMON_REMOVE) { \ | 107 | if (!(_feat && get_device(&_feat->sysfs_device))) \ |
108 | retval = -EBUSY; \ | 108 | return -EBUSY; \ |
109 | goto out; \ | ||
110 | } \ | ||
111 | \ | 109 | \ |
112 | if (strict_strtoul(buf, 0, &val) || val != 0) { \ | 110 | if (strict_strtoul(buf, 0, &val) || val != 0) { \ |
113 | retval = -EINVAL; \ | 111 | retval = -EINVAL; \ |
@@ -120,6 +118,7 @@ static ssize_t zfcp_sysfs_##_feat##_failed_store(struct device *dev, \ | |||
120 | _reopen_id, NULL); \ | 118 | _reopen_id, NULL); \ |
121 | zfcp_erp_wait(_adapter); \ | 119 | zfcp_erp_wait(_adapter); \ |
122 | out: \ | 120 | out: \ |
121 | put_device(&_feat->sysfs_device); \ | ||
123 | return retval ? retval : (ssize_t) count; \ | 122 | return retval ? retval : (ssize_t) count; \ |
124 | } \ | 123 | } \ |
125 | static ZFCP_DEV_ATTR(_feat, failed, S_IWUSR | S_IRUGO, \ | 124 | static ZFCP_DEV_ATTR(_feat, failed, S_IWUSR | S_IRUGO, \ |
@@ -161,11 +160,6 @@ static ssize_t zfcp_sysfs_adapter_failed_store(struct device *dev, | |||
161 | if (!adapter) | 160 | if (!adapter) |
162 | return -ENODEV; | 161 | return -ENODEV; |
163 | 162 | ||
164 | if (atomic_read(&adapter->status) & ZFCP_STATUS_COMMON_REMOVE) { | ||
165 | retval = -EBUSY; | ||
166 | goto out; | ||
167 | } | ||
168 | |||
169 | if (strict_strtoul(buf, 0, &val) || val != 0) { | 163 | if (strict_strtoul(buf, 0, &val) || val != 0) { |
170 | retval = -EINVAL; | 164 | retval = -EINVAL; |
171 | goto out; | 165 | goto out; |
@@ -195,14 +189,9 @@ static ssize_t zfcp_sysfs_port_rescan_store(struct device *dev, | |||
195 | if (!adapter) | 189 | if (!adapter) |
196 | return -ENODEV; | 190 | return -ENODEV; |
197 | 191 | ||
198 | if (atomic_read(&adapter->status) & ZFCP_STATUS_COMMON_REMOVE) { | ||
199 | ret = -EBUSY; | ||
200 | goto out; | ||
201 | } | ||
202 | |||
203 | ret = zfcp_fc_scan_ports(adapter); | 192 | ret = zfcp_fc_scan_ports(adapter); |
204 | out: | ||
205 | zfcp_ccw_adapter_put(adapter); | 193 | zfcp_ccw_adapter_put(adapter); |
194 | |||
206 | return ret ? ret : (ssize_t) count; | 195 | return ret ? ret : (ssize_t) count; |
207 | } | 196 | } |
208 | static ZFCP_DEV_ATTR(adapter, port_rescan, S_IWUSR, NULL, | 197 | static ZFCP_DEV_ATTR(adapter, port_rescan, S_IWUSR, NULL, |
@@ -216,28 +205,19 @@ static ssize_t zfcp_sysfs_port_remove_store(struct device *dev, | |||
216 | struct zfcp_adapter *adapter = zfcp_ccw_adapter_by_cdev(cdev); | 205 | struct zfcp_adapter *adapter = zfcp_ccw_adapter_by_cdev(cdev); |
217 | struct zfcp_port *port; | 206 | struct zfcp_port *port; |
218 | u64 wwpn; | 207 | u64 wwpn; |
219 | int retval = 0; | 208 | int retval = -EINVAL; |
220 | 209 | ||
221 | if (!adapter) | 210 | if (!adapter) |
222 | return -ENODEV; | 211 | return -ENODEV; |
223 | 212 | ||
224 | if (atomic_read(&adapter->status) & ZFCP_STATUS_COMMON_REMOVE) { | 213 | if (strict_strtoull(buf, 0, (unsigned long long *) &wwpn)) |
225 | retval = -EBUSY; | ||
226 | goto out; | 214 | goto out; |
227 | } | ||
228 | |||
229 | if (strict_strtoull(buf, 0, (unsigned long long *) &wwpn)) { | ||
230 | retval = -EINVAL; | ||
231 | goto out; | ||
232 | } | ||
233 | 215 | ||
234 | port = zfcp_get_port_by_wwpn(adapter, wwpn); | 216 | port = zfcp_get_port_by_wwpn(adapter, wwpn); |
235 | if (!port) { | 217 | if (!port) |
236 | retval = -ENXIO; | ||
237 | goto out; | 218 | goto out; |
238 | } | 219 | else |
239 | 220 | retval = 0; | |
240 | atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &port->status); | ||
241 | 221 | ||
242 | write_lock_irq(&adapter->port_list_lock); | 222 | write_lock_irq(&adapter->port_list_lock); |
243 | list_del(&port->list); | 223 | list_del(&port->list); |
@@ -283,10 +263,8 @@ static ssize_t zfcp_sysfs_unit_add_store(struct device *dev, | |||
283 | u64 fcp_lun; | 263 | u64 fcp_lun; |
284 | int retval = -EINVAL; | 264 | int retval = -EINVAL; |
285 | 265 | ||
286 | if (atomic_read(&port->status) & ZFCP_STATUS_COMMON_REMOVE) { | 266 | if (!(port && get_device(&port->sysfs_device))) |
287 | retval = -EBUSY; | 267 | return -EBUSY; |
288 | goto out; | ||
289 | } | ||
290 | 268 | ||
291 | if (strict_strtoull(buf, 0, (unsigned long long *) &fcp_lun)) | 269 | if (strict_strtoull(buf, 0, (unsigned long long *) &fcp_lun)) |
292 | goto out; | 270 | goto out; |
@@ -294,13 +272,14 @@ static ssize_t zfcp_sysfs_unit_add_store(struct device *dev, | |||
294 | unit = zfcp_unit_enqueue(port, fcp_lun); | 272 | unit = zfcp_unit_enqueue(port, fcp_lun); |
295 | if (IS_ERR(unit)) | 273 | if (IS_ERR(unit)) |
296 | goto out; | 274 | goto out; |
297 | 275 | else | |
298 | retval = 0; | 276 | retval = 0; |
299 | 277 | ||
300 | zfcp_erp_unit_reopen(unit, 0, "syuas_1", NULL); | 278 | zfcp_erp_unit_reopen(unit, 0, "syuas_1", NULL); |
301 | zfcp_erp_wait(unit->port->adapter); | 279 | zfcp_erp_wait(unit->port->adapter); |
302 | flush_work(&unit->scsi_work); | 280 | flush_work(&unit->scsi_work); |
303 | out: | 281 | out: |
282 | put_device(&port->sysfs_device); | ||
304 | return retval ? retval : (ssize_t) count; | 283 | return retval ? retval : (ssize_t) count; |
305 | } | 284 | } |
306 | static DEVICE_ATTR(unit_add, S_IWUSR, NULL, zfcp_sysfs_unit_add_store); | 285 | static DEVICE_ATTR(unit_add, S_IWUSR, NULL, zfcp_sysfs_unit_add_store); |
@@ -313,29 +292,23 @@ static ssize_t zfcp_sysfs_unit_remove_store(struct device *dev, | |||
313 | sysfs_device); | 292 | sysfs_device); |
314 | struct zfcp_unit *unit; | 293 | struct zfcp_unit *unit; |
315 | u64 fcp_lun; | 294 | u64 fcp_lun; |
316 | int retval = 0; | 295 | int retval = -EINVAL; |
317 | 296 | ||
318 | if (atomic_read(&port->status) & ZFCP_STATUS_COMMON_REMOVE) { | 297 | if (!(port && get_device(&port->sysfs_device))) |
319 | retval = -EBUSY; | 298 | return -EBUSY; |
320 | goto out; | ||
321 | } | ||
322 | 299 | ||
323 | if (strict_strtoull(buf, 0, (unsigned long long *) &fcp_lun)) { | 300 | if (strict_strtoull(buf, 0, (unsigned long long *) &fcp_lun)) |
324 | retval = -EINVAL; | ||
325 | goto out; | 301 | goto out; |
326 | } | ||
327 | 302 | ||
328 | unit = zfcp_get_unit_by_lun(port, fcp_lun); | 303 | unit = zfcp_get_unit_by_lun(port, fcp_lun); |
329 | if (!unit) { | 304 | if (!unit) |
330 | retval = -EINVAL; | ||
331 | goto out; | 305 | goto out; |
332 | } | 306 | else |
307 | retval = 0; | ||
333 | 308 | ||
334 | /* wait for possible timeout during SCSI probe */ | 309 | /* wait for possible timeout during SCSI probe */ |
335 | flush_work(&unit->scsi_work); | 310 | flush_work(&unit->scsi_work); |
336 | 311 | ||
337 | atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &unit->status); | ||
338 | |||
339 | write_lock_irq(&port->unit_list_lock); | 312 | write_lock_irq(&port->unit_list_lock); |
340 | list_del(&unit->list); | 313 | list_del(&unit->list); |
341 | write_unlock_irq(&port->unit_list_lock); | 314 | write_unlock_irq(&port->unit_list_lock); |
@@ -345,6 +318,7 @@ static ssize_t zfcp_sysfs_unit_remove_store(struct device *dev, | |||
345 | zfcp_erp_unit_shutdown(unit, 0, "syurs_1", NULL); | 318 | zfcp_erp_unit_shutdown(unit, 0, "syurs_1", NULL); |
346 | zfcp_device_unregister(&unit->sysfs_device, &zfcp_sysfs_unit_attrs); | 319 | zfcp_device_unregister(&unit->sysfs_device, &zfcp_sysfs_unit_attrs); |
347 | out: | 320 | out: |
321 | put_device(&port->sysfs_device); | ||
348 | return retval ? retval : (ssize_t) count; | 322 | return retval ? retval : (ssize_t) count; |
349 | } | 323 | } |
350 | static DEVICE_ATTR(unit_remove, S_IWUSR, NULL, zfcp_sysfs_unit_remove_store); | 324 | static DEVICE_ATTR(unit_remove, S_IWUSR, NULL, zfcp_sysfs_unit_remove_store); |