include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit...
[safe/jmp/linux-2.6] / drivers / s390 / scsi / zfcp_sysfs.c
index 181bea0..f5f6069 100644 (file)
@@ -3,12 +3,13 @@
  *
  * sysfs attributes.
  *
- * Copyright IBM Corporation 2008, 2009
+ * Copyright IBM Corporation 2008, 2010
  */
 
 #define KMSG_COMPONENT "zfcp"
 #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
 
+#include <linux/slab.h>
 #include "zfcp_ext.h"
 
 #define ZFCP_DEV_ATTR(_feat, _name, _mode, _show, _store) \
@@ -19,7 +20,7 @@ static ssize_t zfcp_sysfs_##_feat##_##_name##_show(struct device *dev,               \
                                                   struct device_attribute *at,\
                                                   char *buf)                  \
 {                                                                             \
-       struct _feat_def *_feat = dev_get_drvdata(dev);                        \
+       struct _feat_def *_feat = container_of(dev, struct _feat_def, dev);    \
                                                                               \
        return sprintf(buf, _format, _value);                                  \
 }                                                                             \
@@ -86,7 +87,7 @@ static ssize_t zfcp_sysfs_##_feat##_failed_show(struct device *dev,          \
                                                struct device_attribute *attr, \
                                                char *buf)                     \
 {                                                                             \
-       struct _feat_def *_feat = dev_get_drvdata(dev);                        \
+       struct _feat_def *_feat = container_of(dev, struct _feat_def, dev);    \
                                                                               \
        if (atomic_read(&_feat->status) & ZFCP_STATUS_COMMON_ERP_FAILED)       \
                return sprintf(buf, "1\n");                                    \
@@ -97,14 +98,12 @@ static ssize_t zfcp_sysfs_##_feat##_failed_store(struct device *dev,               \
                                                 struct device_attribute *attr,\
                                                 const char *buf, size_t count)\
 {                                                                             \
-       struct _feat_def *_feat = dev_get_drvdata(dev);                        \
+       struct _feat_def *_feat = container_of(dev, struct _feat_def, dev);    \
        unsigned long val;                                                     \
        int retval = 0;                                                        \
                                                                               \
-       if (atomic_read(&_feat->status) & ZFCP_STATUS_COMMON_REMOVE) {         \
-               retval = -EBUSY;                                               \
-               goto out;                                                      \
-       }                                                                      \
+       if (!(_feat && get_device(&_feat->dev)))                               \
+               return -EBUSY;                                                 \
                                                                               \
        if (strict_strtoul(buf, 0, &val) || val != 0) {                        \
                retval = -EINVAL;                                              \
@@ -117,6 +116,7 @@ static ssize_t zfcp_sysfs_##_feat##_failed_store(struct device *dev,               \
                                  _reopen_id, NULL);                           \
        zfcp_erp_wait(_adapter);                                               \
 out:                                                                          \
+       put_device(&_feat->dev);                                               \
        return retval ? retval : (ssize_t) count;                              \
 }                                                                             \
 static ZFCP_DEV_ATTR(_feat, failed, S_IWUSR | S_IRUGO,                        \
@@ -158,11 +158,6 @@ static ssize_t zfcp_sysfs_adapter_failed_store(struct device *dev,
        if (!adapter)
                return -ENODEV;
 
-       if (atomic_read(&adapter->status) & ZFCP_STATUS_COMMON_REMOVE) {
-               retval = -EBUSY;
-               goto out;
-       }
-
        if (strict_strtoul(buf, 0, &val) || val != 0) {
                retval = -EINVAL;
                goto out;
@@ -187,20 +182,16 @@ static ssize_t zfcp_sysfs_port_rescan_store(struct device *dev,
 {
        struct ccw_device *cdev = to_ccwdev(dev);
        struct zfcp_adapter *adapter = zfcp_ccw_adapter_by_cdev(cdev);
-       int ret;
 
        if (!adapter)
                return -ENODEV;
 
-       if (atomic_read(&adapter->status) & ZFCP_STATUS_COMMON_REMOVE) {
-               ret = -EBUSY;
-               goto out;
-       }
-
-       ret = zfcp_fc_scan_ports(adapter);
-out:
+       /* sync the user-space- with the kernel-invocation of scan_work */
+       queue_work(adapter->work_queue, &adapter->scan_work);
+       flush_work(&adapter->scan_work);
        zfcp_ccw_adapter_put(adapter);
-       return ret ? ret : (ssize_t) count;
+
+       return (ssize_t) count;
 }
 static ZFCP_DEV_ATTR(adapter, port_rescan, S_IWUSR, NULL,
                     zfcp_sysfs_port_rescan_store);
@@ -213,37 +204,28 @@ static ssize_t zfcp_sysfs_port_remove_store(struct device *dev,
        struct zfcp_adapter *adapter = zfcp_ccw_adapter_by_cdev(cdev);
        struct zfcp_port *port;
        u64 wwpn;
-       int retval = 0;
+       int retval = -EINVAL;
 
        if (!adapter)
                return -ENODEV;
 
-       if (atomic_read(&adapter->status) & ZFCP_STATUS_COMMON_REMOVE) {
-               retval = -EBUSY;
+       if (strict_strtoull(buf, 0, (unsigned long long *) &wwpn))
                goto out;
-       }
-
-       if (strict_strtoull(buf, 0, (unsigned long long *) &wwpn)) {
-               retval = -EINVAL;
-               goto out;
-       }
 
        port = zfcp_get_port_by_wwpn(adapter, wwpn);
-       if (!port) {
-               retval = -ENXIO;
+       if (!port)
                goto out;
-       }
-
-       atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &port->status);
+       else
+               retval = 0;
 
        write_lock_irq(&adapter->port_list_lock);
        list_del(&port->list);
        write_unlock_irq(&adapter->port_list_lock);
 
-       put_device(&port->sysfs_device);
+       put_device(&port->dev);
 
        zfcp_erp_port_shutdown(port, 0, "syprs_1", NULL);
-       zfcp_device_unregister(&port->sysfs_device, &zfcp_sysfs_port_attrs);
+       zfcp_device_unregister(&port->dev, &zfcp_sysfs_port_attrs);
  out:
        zfcp_ccw_adapter_put(adapter);
        return retval ? retval : (ssize_t) count;
@@ -274,15 +256,13 @@ static ssize_t zfcp_sysfs_unit_add_store(struct device *dev,
                                         struct device_attribute *attr,
                                         const char *buf, size_t count)
 {
-       struct zfcp_port *port = dev_get_drvdata(dev);
+       struct zfcp_port *port = container_of(dev, struct zfcp_port, dev);
        struct zfcp_unit *unit;
        u64 fcp_lun;
        int retval = -EINVAL;
 
-       if (atomic_read(&port->status) & ZFCP_STATUS_COMMON_REMOVE) {
-               retval = -EBUSY;
-               goto out;
-       }
+       if (!(port && get_device(&port->dev)))
+               return -EBUSY;
 
        if (strict_strtoull(buf, 0, (unsigned long long *) &fcp_lun))
                goto out;
@@ -290,13 +270,14 @@ static ssize_t zfcp_sysfs_unit_add_store(struct device *dev,
        unit = zfcp_unit_enqueue(port, fcp_lun);
        if (IS_ERR(unit))
                goto out;
-
-       retval = 0;
+       else
+               retval = 0;
 
        zfcp_erp_unit_reopen(unit, 0, "syuas_1", NULL);
        zfcp_erp_wait(unit->port->adapter);
        flush_work(&unit->scsi_work);
 out:
+       put_device(&port->dev);
        return retval ? retval : (ssize_t) count;
 }
 static DEVICE_ATTR(unit_add, S_IWUSR, NULL, zfcp_sysfs_unit_add_store);
@@ -305,41 +286,36 @@ static ssize_t zfcp_sysfs_unit_remove_store(struct device *dev,
                                            struct device_attribute *attr,
                                            const char *buf, size_t count)
 {
-       struct zfcp_port *port = dev_get_drvdata(dev);
+       struct zfcp_port *port = container_of(dev, struct zfcp_port, dev);
        struct zfcp_unit *unit;
        u64 fcp_lun;
-       int retval = 0;
+       int retval = -EINVAL;
 
-       if (atomic_read(&port->status) & ZFCP_STATUS_COMMON_REMOVE) {
-               retval = -EBUSY;
-               goto out;
-       }
+       if (!(port && get_device(&port->dev)))
+               return -EBUSY;
 
-       if (strict_strtoull(buf, 0, (unsigned long long *) &fcp_lun)) {
-               retval = -EINVAL;
+       if (strict_strtoull(buf, 0, (unsigned long long *) &fcp_lun))
                goto out;
-       }
 
        unit = zfcp_get_unit_by_lun(port, fcp_lun);
-       if (!unit) {
-               retval = -EINVAL;
+       if (!unit)
                goto out;
-       }
+       else
+               retval = 0;
 
        /* wait for possible timeout during SCSI probe */
        flush_work(&unit->scsi_work);
 
-       atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &unit->status);
-
        write_lock_irq(&port->unit_list_lock);
        list_del(&unit->list);
        write_unlock_irq(&port->unit_list_lock);
 
-       put_device(&unit->sysfs_device);
+       put_device(&unit->dev);
 
        zfcp_erp_unit_shutdown(unit, 0, "syurs_1", NULL);
-       zfcp_device_unregister(&unit->sysfs_device, &zfcp_sysfs_unit_attrs);
+       zfcp_device_unregister(&unit->dev, &zfcp_sysfs_unit_attrs);
 out:
+       put_device(&port->dev);
        return retval ? retval : (ssize_t) count;
 }
 static DEVICE_ATTR(unit_remove, S_IWUSR, NULL, zfcp_sysfs_unit_remove_store);