scsi_transport_sas: add is_sas_attached() function
authorJames Bottomley <James.Bottomley@HansenPartnership.com>
Wed, 9 Dec 2015 19:12:03 +0000 (11:12 -0800)
committerJames Bottomley <James.Bottomley@HansenPartnership.com>
Sat, 19 Dec 2015 03:06:21 +0000 (19:06 -0800)
Adds a function designed to be callable any time (regardless of
whether the transport attributes are configured or not) which returns
true if the device is attached over a SAS transport.  The design of
this function is that transport specific functions can be embedded
within a

if (is_sas_attached(sdev)) {
...
}

which would be compiled out (and thus eliminate the symbols) if SAS is
not configured.

Reviewed-by: Hannes Reinecke <hare@suse.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
drivers/scsi/scsi_transport_sas.c
include/scsi/scsi_transport_sas.h

index 30d26e3..b17f763 100644 (file)
@@ -340,6 +340,22 @@ static int do_sas_phy_delete(struct device *dev, void *data)
        return 0;
 }
 
+/**
+ * is_sas_attached - check if device is SAS attached
+ * @sdev: scsi device to check
+ *
+ * returns true if the device is SAS attached
+ */
+int is_sas_attached(struct scsi_device *sdev)
+{
+       struct Scsi_Host *shost = sdev->host;
+
+       return shost->transportt->host_attrs.ac.class ==
+               &sas_host_class.class;
+}
+EXPORT_SYMBOL(is_sas_attached);
+
+
 /**
  * sas_remove_children  -  tear down a devices SAS data structures
  * @dev:       device belonging to the sas object
index 0bd71e2..a8fdd10 100644 (file)
@@ -10,6 +10,15 @@ struct scsi_transport_template;
 struct sas_rphy;
 struct request;
 
+#if !IS_ENABLED(CONFIG_SCSI_SAS_ATTRS)
+static inline int is_sas_attached(struct scsi_device *sdev)
+{
+       return 0;
+}
+#else
+extern int is_sas_attached(struct scsi_device *sdev);
+#endif
+
 static inline int sas_protocol_ata(enum sas_protocol proto)
 {
        return ((proto & SAS_PROTOCOL_SATA) ||