diff options
author | Swen Schillig <swen@vnet.ibm.com> | 2009-11-24 10:53:59 -0500 |
---|---|---|
committer | James Bottomley <James.Bottomley@suse.de> | 2009-12-04 13:02:02 -0500 |
commit | f3450c7b917201bb49d67032e9f60d5125675d6a (patch) | |
tree | 404b1c23490b0a5ba3d6cbbb14e64381a12a108a /drivers/s390/scsi/zfcp_sysfs.c | |
parent | ecf0c7721b104c0ce9c8ca534c911f6310cf92a8 (diff) |
[SCSI] zfcp: Replace local reference counting with common kref
Replace the local reference counting by already available mechanisms
offered by kref. Where possible existing device structures were used,
including the same functionality.
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/scsi/zfcp_sysfs.c')
-rw-r--r-- | drivers/s390/scsi/zfcp_sysfs.c | 44 |
1 files changed, 18 insertions, 26 deletions
diff --git a/drivers/s390/scsi/zfcp_sysfs.c b/drivers/s390/scsi/zfcp_sysfs.c index 8430b518357e..b4a7e17932c5 100644 --- a/drivers/s390/scsi/zfcp_sysfs.c +++ b/drivers/s390/scsi/zfcp_sysfs.c | |||
@@ -3,7 +3,7 @@ | |||
3 | * | 3 | * |
4 | * sysfs attributes. | 4 | * sysfs attributes. |
5 | * | 5 | * |
6 | * Copyright IBM Corporation 2008 | 6 | * Copyright IBM Corporation 2008, 2009 |
7 | */ | 7 | */ |
8 | 8 | ||
9 | #define KMSG_COMPONENT "zfcp" | 9 | #define KMSG_COMPONENT "zfcp" |
@@ -140,7 +140,6 @@ static ssize_t zfcp_sysfs_port_remove_store(struct device *dev, | |||
140 | struct zfcp_port *port; | 140 | struct zfcp_port *port; |
141 | u64 wwpn; | 141 | u64 wwpn; |
142 | int retval = 0; | 142 | int retval = 0; |
143 | LIST_HEAD(port_remove_lh); | ||
144 | 143 | ||
145 | mutex_lock(&zfcp_data.config_mutex); | 144 | mutex_lock(&zfcp_data.config_mutex); |
146 | if (atomic_read(&adapter->status) & ZFCP_STATUS_COMMON_REMOVE) { | 145 | if (atomic_read(&adapter->status) & ZFCP_STATUS_COMMON_REMOVE) { |
@@ -154,23 +153,21 @@ static ssize_t zfcp_sysfs_port_remove_store(struct device *dev, | |||
154 | } | 153 | } |
155 | 154 | ||
156 | port = zfcp_get_port_by_wwpn(adapter, wwpn); | 155 | port = zfcp_get_port_by_wwpn(adapter, wwpn); |
157 | if (port && (atomic_read(&port->refcount) == 1)) { | ||
158 | atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &port->status); | ||
159 | write_lock_irq(&adapter->port_list_lock); | ||
160 | list_move(&port->list, &port_remove_lh); | ||
161 | write_unlock_irq(&adapter->port_list_lock); | ||
162 | } else | ||
163 | port = NULL; | ||
164 | |||
165 | if (!port) { | 156 | if (!port) { |
166 | retval = -ENXIO; | 157 | retval = -ENXIO; |
167 | goto out; | 158 | goto out; |
168 | } | 159 | } |
169 | 160 | ||
161 | atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &port->status); | ||
162 | |||
163 | write_lock_irq(&adapter->port_list_lock); | ||
164 | list_del(&port->list); | ||
165 | write_unlock_irq(&adapter->port_list_lock); | ||
166 | |||
167 | put_device(&port->sysfs_device); | ||
168 | |||
170 | zfcp_erp_port_shutdown(port, 0, "syprs_1", NULL); | 169 | zfcp_erp_port_shutdown(port, 0, "syprs_1", NULL); |
171 | zfcp_erp_wait(adapter); | 170 | zfcp_device_unregister(&port->sysfs_device, &zfcp_sysfs_port_attrs); |
172 | zfcp_port_put(port); | ||
173 | zfcp_port_dequeue(port); | ||
174 | out: | 171 | out: |
175 | mutex_unlock(&zfcp_data.config_mutex); | 172 | mutex_unlock(&zfcp_data.config_mutex); |
176 | return retval ? retval : (ssize_t) count; | 173 | return retval ? retval : (ssize_t) count; |
@@ -224,7 +221,6 @@ static ssize_t zfcp_sysfs_unit_add_store(struct device *dev, | |||
224 | zfcp_erp_unit_reopen(unit, 0, "syuas_1", NULL); | 221 | zfcp_erp_unit_reopen(unit, 0, "syuas_1", NULL); |
225 | zfcp_erp_wait(unit->port->adapter); | 222 | zfcp_erp_wait(unit->port->adapter); |
226 | flush_work(&unit->scsi_work); | 223 | flush_work(&unit->scsi_work); |
227 | zfcp_unit_put(unit); | ||
228 | out: | 224 | out: |
229 | mutex_unlock(&zfcp_data.config_mutex); | 225 | mutex_unlock(&zfcp_data.config_mutex); |
230 | return retval ? retval : (ssize_t) count; | 226 | return retval ? retval : (ssize_t) count; |
@@ -239,7 +235,6 @@ static ssize_t zfcp_sysfs_unit_remove_store(struct device *dev, | |||
239 | struct zfcp_unit *unit; | 235 | struct zfcp_unit *unit; |
240 | u64 fcp_lun; | 236 | u64 fcp_lun; |
241 | int retval = 0; | 237 | int retval = 0; |
242 | LIST_HEAD(unit_remove_lh); | ||
243 | 238 | ||
244 | mutex_lock(&zfcp_data.config_mutex); | 239 | mutex_lock(&zfcp_data.config_mutex); |
245 | if (atomic_read(&port->status) & ZFCP_STATUS_COMMON_REMOVE) { | 240 | if (atomic_read(&port->status) & ZFCP_STATUS_COMMON_REMOVE) { |
@@ -261,19 +256,16 @@ static ssize_t zfcp_sysfs_unit_remove_store(struct device *dev, | |||
261 | /* wait for possible timeout during SCSI probe */ | 256 | /* wait for possible timeout during SCSI probe */ |
262 | flush_work(&unit->scsi_work); | 257 | flush_work(&unit->scsi_work); |
263 | 258 | ||
264 | if (atomic_read(&unit->refcount) == 1) { | 259 | atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &unit->status); |
265 | atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &unit->status); | 260 | |
261 | write_lock_irq(&port->unit_list_lock); | ||
262 | list_del(&unit->list); | ||
263 | write_unlock_irq(&port->unit_list_lock); | ||
266 | 264 | ||
267 | write_lock_irq(&port->unit_list_lock); | 265 | put_device(&unit->sysfs_device); |
268 | list_move(&unit->list, &unit_remove_lh); | ||
269 | write_unlock_irq(&port->unit_list_lock); | ||
270 | 266 | ||
271 | zfcp_erp_unit_shutdown(unit, 0, "syurs_1", NULL); | 267 | zfcp_erp_unit_shutdown(unit, 0, "syurs_1", NULL); |
272 | zfcp_erp_wait(unit->port->adapter); | 268 | zfcp_device_unregister(&unit->sysfs_device, &zfcp_sysfs_unit_attrs); |
273 | zfcp_unit_put(unit); | ||
274 | zfcp_unit_dequeue(unit); | ||
275 | } else | ||
276 | zfcp_unit_put(unit); | ||
277 | out: | 269 | out: |
278 | mutex_unlock(&zfcp_data.config_mutex); | 270 | mutex_unlock(&zfcp_data.config_mutex); |
279 | return retval ? retval : (ssize_t) count; | 271 | return retval ? retval : (ssize_t) count; |