Use bus dev_attrs to create the default scsi_device attributes.

Note sdev_default_attrs is not a pointer to an array (like
scsi_sysfs_sdev_attrs), and so DEVICE_ATTR's can be removed, and __ATTR
used instaed.

Signed-off-by: Patrick Mansfield <[EMAIL PROTECTED]>

--- sattrs-linux-2.6.11/drivers/scsi/s1-scsi_sysfs.c    2005-03-02 
09:58:21.000000000 -0800
+++ sattrs-linux-2.6.11/drivers/scsi/scsi_sysfs.c       2005-03-02 
10:22:25.000000000 -0800
@@ -193,40 +193,6 @@
        .release        = scsi_device_cls_release,
 };
 
-/* all probing is done in the individual ->probe routines */
-static int scsi_bus_match(struct device *dev, struct device_driver *gendrv)
-{
-       struct scsi_device *sdp = to_scsi_device(dev);
-       if (sdp->no_uld_attach)
-               return 0;
-       return (sdp->inq_periph_qual == SCSI_INQ_PQ_CON)? 1: 0;
-}
-
-struct bus_type scsi_bus_type = {
-        .name          = "scsi",
-        .match         = scsi_bus_match,
-};
-
-int scsi_sysfs_register(void)
-{
-       int error;
-
-       error = bus_register(&scsi_bus_type);
-       if (!error) {
-               error = class_register(&sdev_class);
-               if (error)
-                       bus_unregister(&scsi_bus_type);
-       }
-
-       return error;
-}
-
-void scsi_sysfs_unregister(void)
-{
-       class_unregister(&sdev_class);
-       bus_unregister(&scsi_bus_type);
-}
-
 /*
  * sdev_show_function: macro to create an attr function that can be used to
  * show a non-bit field.
@@ -245,8 +211,7 @@
  * read only field.
  */
 #define sdev_rd_attr(field, format_string)                             \
-       sdev_show_function(field, format_string)                        \
-static DEVICE_ATTR(field, S_IRUGO, sdev_show_##field, NULL);
+       sdev_show_function(field, format_string)
 
 
 /*
@@ -263,8 +228,7 @@
        sdev = to_scsi_device(dev);                                     \
        snscanf (buf, 20, format_string, &sdev->field);                 \
        return count;                                                   \
-}                                                                      \
-static DEVICE_ATTR(field, S_IRUGO | S_IWUSR, sdev_show_##field, 
sdev_store_##field);
+}
 
 /* Currently we don't export bit fields, but we might in future,
  * so leave this code in */
@@ -288,8 +252,7 @@
                ret = count;                                            \
        }                                                               \
        return ret;                                                     \
-}                                                                      \
-static DEVICE_ATTR(field, S_IRUGO | S_IWUSR, sdev_show_##field, 
sdev_store_##field);
+}
 
 /*
  * scsi_sdev_check_buf_bit: return 0 if buf is "0", return 1 if buf is "1",
@@ -336,15 +299,13 @@
        sdev->timeout = timeout * HZ;
        return count;
 }
-static DEVICE_ATTR(timeout, S_IRUGO | S_IWUSR, sdev_show_timeout, 
sdev_store_timeout);
 
 static ssize_t
-store_rescan_field (struct device *dev, const char *buf, size_t count) 
+sdev_store_rescan (struct device *dev, const char *buf, size_t count) 
 {
        scsi_rescan_device(dev);
        return count;
 }
-static DEVICE_ATTR(rescan, S_IWUSR, NULL, store_rescan_field);
 
 static ssize_t sdev_store_delete(struct device *dev, const char *buf,
                                 size_t count)
@@ -352,10 +313,9 @@
        scsi_remove_device(to_scsi_device(dev));
        return count;
 };
-static DEVICE_ATTR(delete, S_IWUSR, NULL, sdev_store_delete);
 
 static ssize_t
-store_state_field(struct device *dev, const char *buf, size_t count)
+sdev_store_state(struct device *dev, const char *buf, size_t count)
 {
        int i;
        struct scsi_device *sdev = to_scsi_device(dev);
@@ -378,7 +338,7 @@
 }
 
 static ssize_t
-show_state_field(struct device *dev, char *buf)
+sdev_show_state(struct device *dev, char *buf)
 {
        struct scsi_device *sdev = to_scsi_device(dev);
        const char *name = scsi_device_state_name(sdev->sdev_state);
@@ -389,8 +349,6 @@
        return snprintf(buf, 20, "%s\n", name);
 }
 
-static DEVICE_ATTR(state, S_IRUGO | S_IWUSR, show_state_field, 
store_state_field);
-
 sdev_show_function (queue_depth, "%d\n");
 
 static ssize_t sdev_store_queue_depth(struct device *dev, const char *buf,
@@ -420,7 +378,7 @@
               sdev_store_queue_depth);
 
 static ssize_t
-show_queue_type_field(struct device *dev, char *buf)
+sdev_show_queue_type(struct device *dev, char *buf)
 {
        struct scsi_device *sdev = to_scsi_device(dev);
        const char *name = "none";
@@ -461,25 +419,29 @@
        return count;
 }
 
-static struct device_attribute dev_attr_queue_type =
-       __ATTR(queue_type, S_IRUGO | S_IWUSR, show_queue_type_field,
-              sdev_store_queue_type);
+#define SDEV_ATTR_RO(_name) __ATTR(_name, S_IRUGO, sdev_show_##_name, NULL)
+#define SDEV_ATTR_WO(_name) __ATTR(_name, S_IWUSR, NULL, sdev_store_##_name)
+#define SDEV_ATTR_RW(_name) __ATTR(_name, S_IRUGO | S_IWUSR, \
+                                  sdev_show_##_name, sdev_store_##_name)
+
+/* Default scsi_device attributes, cannot be overidden */
+static struct device_attribute sdev_default_attrs[] = {
+       SDEV_ATTR_RO(device_blocked),
+       SDEV_ATTR_RW(queue_type),
+       SDEV_ATTR_RO(type),
+       SDEV_ATTR_RO(scsi_level),
+       SDEV_ATTR_RO(vendor),
+       SDEV_ATTR_RO(model),
+       SDEV_ATTR_RO(rev),
+       SDEV_ATTR_WO(rescan),
+       SDEV_ATTR_WO(delete),
+       SDEV_ATTR_RW(state),
+       SDEV_ATTR_RW(timeout),
+       __ATTR_NULL
+};
 
-/* Default template for device attributes.  May NOT be modified */
 static struct device_attribute *scsi_sysfs_sdev_attrs[] = {
-       &dev_attr_device_blocked,
-       &dev_attr_queue_depth,
-       &dev_attr_queue_type,
-       &dev_attr_type,
-       &dev_attr_scsi_level,
-       &dev_attr_vendor,
-       &dev_attr_model,
-       &dev_attr_rev,
-       &dev_attr_rescan,
-       &dev_attr_delete,
-       &dev_attr_state,
-       &dev_attr_timeout,
-       NULL
+       &dev_attr_queue_depth
 };
 
 static struct device_attribute *attr_overridden(
@@ -518,6 +480,41 @@
        return device_create_file(dev, attr);
 }
 
+/* all probing is done in the individual ->probe routines */
+static int scsi_bus_match(struct device *dev, struct device_driver *gendrv)
+{
+       struct scsi_device *sdp = to_scsi_device(dev);
+       if (sdp->no_uld_attach)
+               return 0;
+       return (sdp->inq_periph_qual == SCSI_INQ_PQ_CON)? 1: 0;
+}
+
+struct bus_type scsi_bus_type = {
+        .name          = "scsi",
+        .match         = scsi_bus_match,
+       .dev_attrs      = sdev_default_attrs,
+};
+
+int scsi_sysfs_register(void)
+{
+       int error;
+
+       error = bus_register(&scsi_bus_type);
+       if (!error) {
+               error = class_register(&sdev_class);
+               if (error)
+                       bus_unregister(&scsi_bus_type);
+       }
+
+       return error;
+}
+
+void scsi_sysfs_unregister(void)
+{
+       class_unregister(&sdev_class);
+       bus_unregister(&scsi_bus_type);
+}
+
 static void scsi_target_dev_release(struct device *dev)
 {
        struct scsi_target *starget = to_scsi_target(dev);
-
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to