aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390/scsi
diff options
context:
space:
mode:
authorSebastian Ott <sebott@linux.vnet.ibm.com>2013-04-26 10:13:49 -0400
committerJames Bottomley <JBottomley@Parallels.com>2013-05-31 19:32:37 -0400
commit86bdf218a717b77cb775b82ce48c7847cb72a86d (patch)
tree44b48f8c9d984e3243d6b8e6bfa6ebed0c5e6222 /drivers/s390/scsi
parent83d4e1c33d9329e6d53cf4ac0a02c98ac83eba05 (diff)
[SCSI] zfcp: cleanup unit sysfs attribute usage
Let the driver core handle device attribute creation and removal. This will simplify the code and eliminates races between attribute availability and userspace notification via uevents. Reviewed-by: Steffen Maier <maier@linux.vnet.ibm.com> Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com> Signed-off-by: Steffen Maier <maier@linux.vnet.ibm.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
Diffstat (limited to 'drivers/s390/scsi')
-rw-r--r--drivers/s390/scsi/zfcp_ccw.c2
-rw-r--r--drivers/s390/scsi/zfcp_ext.h2
-rw-r--r--drivers/s390/scsi/zfcp_sysfs.c7
-rw-r--r--drivers/s390/scsi/zfcp_unit.c9
4 files changed, 9 insertions, 11 deletions
diff --git a/drivers/s390/scsi/zfcp_ccw.c b/drivers/s390/scsi/zfcp_ccw.c
index 202f39572880..8e71d35a64cc 100644
--- a/drivers/s390/scsi/zfcp_ccw.c
+++ b/drivers/s390/scsi/zfcp_ccw.c
@@ -129,7 +129,7 @@ static void zfcp_ccw_remove(struct ccw_device *cdev)
129 zfcp_ccw_adapter_put(adapter); /* put from zfcp_ccw_adapter_by_cdev */ 129 zfcp_ccw_adapter_put(adapter); /* put from zfcp_ccw_adapter_by_cdev */
130 130
131 list_for_each_entry_safe(unit, u, &unit_remove_lh, list) 131 list_for_each_entry_safe(unit, u, &unit_remove_lh, list)
132 zfcp_device_unregister(&unit->dev, &zfcp_sysfs_unit_attrs); 132 device_unregister(&unit->dev);
133 133
134 list_for_each_entry_safe(port, p, &port_remove_lh, list) 134 list_for_each_entry_safe(port, p, &port_remove_lh, list)
135 device_unregister(&port->dev); 135 device_unregister(&port->dev);
diff --git a/drivers/s390/scsi/zfcp_ext.h b/drivers/s390/scsi/zfcp_ext.h
index 695b133364a8..b993d1170063 100644
--- a/drivers/s390/scsi/zfcp_ext.h
+++ b/drivers/s390/scsi/zfcp_ext.h
@@ -158,7 +158,7 @@ extern void zfcp_scsi_set_prot(struct zfcp_adapter *);
158extern void zfcp_scsi_dif_sense_error(struct scsi_cmnd *, int); 158extern void zfcp_scsi_dif_sense_error(struct scsi_cmnd *, int);
159 159
160/* zfcp_sysfs.c */ 160/* zfcp_sysfs.c */
161extern struct attribute_group zfcp_sysfs_unit_attrs; 161extern const struct attribute_group *zfcp_unit_attr_groups[];
162extern struct attribute_group zfcp_sysfs_adapter_attrs; 162extern struct attribute_group zfcp_sysfs_adapter_attrs;
163extern const struct attribute_group *zfcp_port_attr_groups[]; 163extern const struct attribute_group *zfcp_port_attr_groups[];
164extern struct mutex zfcp_sysfs_port_units_mutex; 164extern struct mutex zfcp_sysfs_port_units_mutex;
diff --git a/drivers/s390/scsi/zfcp_sysfs.c b/drivers/s390/scsi/zfcp_sysfs.c
index d9261264a2b6..05423ace6bf3 100644
--- a/drivers/s390/scsi/zfcp_sysfs.c
+++ b/drivers/s390/scsi/zfcp_sysfs.c
@@ -357,10 +357,13 @@ static struct attribute *zfcp_unit_attrs[] = {
357 &dev_attr_unit_access_readonly.attr, 357 &dev_attr_unit_access_readonly.attr,
358 NULL 358 NULL
359}; 359};
360 360static struct attribute_group zfcp_unit_attr_group = {
361struct attribute_group zfcp_sysfs_unit_attrs = {
362 .attrs = zfcp_unit_attrs, 361 .attrs = zfcp_unit_attrs,
363}; 362};
363const struct attribute_group *zfcp_unit_attr_groups[] = {
364 &zfcp_unit_attr_group,
365 NULL,
366};
364 367
365#define ZFCP_DEFINE_LATENCY_ATTR(_name) \ 368#define ZFCP_DEFINE_LATENCY_ATTR(_name) \
366static ssize_t \ 369static ssize_t \
diff --git a/drivers/s390/scsi/zfcp_unit.c b/drivers/s390/scsi/zfcp_unit.c
index 1cd2b99ab256..39f5446f7216 100644
--- a/drivers/s390/scsi/zfcp_unit.c
+++ b/drivers/s390/scsi/zfcp_unit.c
@@ -145,6 +145,7 @@ int zfcp_unit_add(struct zfcp_port *port, u64 fcp_lun)
145 unit->fcp_lun = fcp_lun; 145 unit->fcp_lun = fcp_lun;
146 unit->dev.parent = &port->dev; 146 unit->dev.parent = &port->dev;
147 unit->dev.release = zfcp_unit_release; 147 unit->dev.release = zfcp_unit_release;
148 unit->dev.groups = zfcp_unit_attr_groups;
148 INIT_WORK(&unit->scsi_work, zfcp_unit_scsi_scan_work); 149 INIT_WORK(&unit->scsi_work, zfcp_unit_scsi_scan_work);
149 150
150 if (dev_set_name(&unit->dev, "0x%016llx", 151 if (dev_set_name(&unit->dev, "0x%016llx",
@@ -160,12 +161,6 @@ int zfcp_unit_add(struct zfcp_port *port, u64 fcp_lun)
160 goto out; 161 goto out;
161 } 162 }
162 163
163 if (sysfs_create_group(&unit->dev.kobj, &zfcp_sysfs_unit_attrs)) {
164 device_unregister(&unit->dev);
165 retval = -EINVAL;
166 goto out;
167 }
168
169 atomic_inc(&port->units); /* under zfcp_sysfs_port_units_mutex ! */ 164 atomic_inc(&port->units); /* under zfcp_sysfs_port_units_mutex ! */
170 165
171 write_lock_irq(&port->unit_list_lock); 166 write_lock_irq(&port->unit_list_lock);
@@ -254,7 +249,7 @@ int zfcp_unit_remove(struct zfcp_port *port, u64 fcp_lun)
254 249
255 put_device(&unit->dev); 250 put_device(&unit->dev);
256 251
257 zfcp_device_unregister(&unit->dev, &zfcp_sysfs_unit_attrs); 252 device_unregister(&unit->dev);
258 253
259 return 0; 254 return 0;
260} 255}