OSDN Git Service

ses: add enclosure logical id
authorDan Williams <dan.j.williams@intel.com>
Tue, 30 Dec 2014 22:46:16 +0000 (14:46 -0800)
committerChristoph Hellwig <hch@lst.de>
Fri, 9 Jan 2015 14:44:18 +0000 (15:44 +0100)
Export the NAA logical id for the enclosure.  This is optionally
available from the sas_transport_class, but it is really a property of
the enclosure.

Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Song Liu <songliubraving@fb.com>
Reviewed-by: Jens Axboe <axboe@fb.com>
Cc: Hannes Reinecke <hare@suse.de>
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/misc/enclosure.c
drivers/scsi/ses.c
include/linux/enclosure.h

index e18278a..958ee98 100644 (file)
@@ -432,8 +432,21 @@ static ssize_t components_show(struct device *cdev,
 }
 static DEVICE_ATTR_RO(components);
 
+static ssize_t id_show(struct device *cdev,
+                                struct device_attribute *attr,
+                                char *buf)
+{
+       struct enclosure_device *edev = to_enclosure_device(cdev);
+
+       if (edev->cb->show_id)
+               return edev->cb->show_id(edev, buf);
+       return -EINVAL;
+}
+static DEVICE_ATTR_RO(id);
+
 static struct attribute *enclosure_class_attrs[] = {
        &dev_attr_components.attr,
+       &dev_attr_id.attr,
        NULL,
 };
 ATTRIBUTE_GROUPS(enclosure_class);
index 6662b0c..1041556 100644 (file)
@@ -258,6 +258,14 @@ static int ses_set_active(struct enclosure_device *edev,
        return ses_set_page2_descriptor(edev, ecomp, desc);
 }
 
+static int ses_show_id(struct enclosure_device *edev, char *buf)
+{
+       struct ses_device *ses_dev = edev->scratch;
+       unsigned long long id = get_unaligned_be64(ses_dev->page1+8+4);
+
+       return sprintf(buf, "%#llx\n", id);
+}
+
 static struct enclosure_component_callbacks ses_enclosure_callbacks = {
        .get_fault              = ses_get_fault,
        .set_fault              = ses_set_fault,
@@ -265,6 +273,7 @@ static struct enclosure_component_callbacks ses_enclosure_callbacks = {
        .get_locate             = ses_get_locate,
        .set_locate             = ses_set_locate,
        .set_active             = ses_set_active,
+       .show_id                = ses_show_id,
 };
 
 struct ses_host_edev {
index a835d33..807622b 100644 (file)
@@ -79,6 +79,7 @@ struct enclosure_component_callbacks {
        int (*set_locate)(struct enclosure_device *,
                          struct enclosure_component *,
                          enum enclosure_component_setting);
+       int (*show_id)(struct enclosure_device *, char *buf);
 };