[SCSI] iscsi class: sysfs group is_visible callout for iscsi host attrs
authorMike Christie <michaelc@cs.wisc.edu>
Mon, 25 Jul 2011 18:48:45 +0000 (13:48 -0500)
committerJames Bottomley <JBottomley@Parallels.com>
Sat, 27 Aug 2011 14:36:14 +0000 (08:36 -0600)
The iscsi class currently does not support writable sysfs
attrs for LLD sysfs settings. This patch converts the
iscsi class and driver's host attrs to use the attribute
container sysfs group and the sysfs group's is_visible callout
to be able to support readable or writable sysfs attrs.

Signed-off-by: Mike Christie <michaelc@cs.wisc.edu>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
12 files changed:
drivers/infiniband/ulp/iser/iscsi_iser.c
drivers/scsi/be2iscsi/be_iscsi.c
drivers/scsi/be2iscsi/be_main.c
drivers/scsi/bnx2i/bnx2i_iscsi.c
drivers/scsi/cxgbi/cxgb3i/cxgb3i.c
drivers/scsi/cxgbi/cxgb4i/cxgb4i.c
drivers/scsi/cxgbi/libcxgbi.c
drivers/scsi/iscsi_tcp.c
drivers/scsi/qla4xxx/ql4_os.c
drivers/scsi/scsi_transport_iscsi.c
include/scsi/iscsi_if.h
include/scsi/scsi_transport_iscsi.h

index 4f2411298b20575f0673e92116df93b509c29ba5..84e8c293a71550990e044bce646c55e462dde836 100644 (file)
@@ -635,6 +635,15 @@ iscsi_iser_ep_disconnect(struct iscsi_endpoint *ep)
 static mode_t iser_attr_is_visible(int param_type, int param)
 {
        switch (param_type) {
+       case ISCSI_HOST_PARAM:
+               switch (param) {
+               case ISCSI_HOST_PARAM_NETDEV_NAME:
+               case ISCSI_HOST_PARAM_HWADDRESS:
+               case ISCSI_HOST_PARAM_INITIATOR_NAME:
+                       return S_IRUGO;
+               default:
+                       return 0;
+               }
        case ISCSI_PARAM:
                switch (param) {
                case ISCSI_PARAM_MAX_RECV_DLENGTH:
@@ -697,9 +706,6 @@ static struct iscsi_transport iscsi_iser_transport = {
        .owner                  = THIS_MODULE,
        .name                   = "iser",
        .caps                   = CAP_RECOVERY_L0 | CAP_MULTI_R2T,
-       .host_param_mask        = ISCSI_HOST_HWADDRESS |
-                                 ISCSI_HOST_NETDEV_NAME |
-                                 ISCSI_HOST_INITIATOR_NAME,
        /* session management */
        .create_session         = iscsi_iser_session_create,
        .destroy_session        = iscsi_iser_session_destroy,
index ecd19bb3b207a35a6a8431f8dd9f2be0285e1d83..feadaa288080fe348e5afbce029517ebd13a281b 100644 (file)
@@ -737,6 +737,15 @@ void beiscsi_ep_disconnect(struct iscsi_endpoint *ep)
 mode_t be2iscsi_attr_is_visible(int param_type, int param)
 {
        switch (param_type) {
+       case ISCSI_HOST_PARAM:
+               switch (param) {
+               case ISCSI_HOST_PARAM_HWADDRESS:
+               case ISCSI_HOST_PARAM_IPADDRESS:
+               case ISCSI_HOST_PARAM_INITIATOR_NAME:
+                       return S_IRUGO;
+               default:
+                       return 0;
+               }
        case ISCSI_PARAM:
                switch (param) {
                case ISCSI_PARAM_MAX_RECV_DLENGTH:
index 93a3c708411a813a7afa1614af752659cad8f6c3..72ac64bbceaf3fc2fb80a32a202d2d7471597202 100644 (file)
@@ -4364,8 +4364,6 @@ struct iscsi_transport beiscsi_iscsi_transport = {
        .name = DRV_NAME,
        .caps = CAP_RECOVERY_L0 | CAP_HDRDGST | CAP_TEXT_NEGO |
                CAP_MULTI_R2T | CAP_DATADGST | CAP_DATA_PATH_OFFLOAD,
-       .host_param_mask = ISCSI_HOST_HWADDRESS | ISCSI_HOST_IPADDRESS |
-                               ISCSI_HOST_INITIATOR_NAME,
        .create_session = beiscsi_session_create,
        .destroy_session = beiscsi_session_destroy,
        .create_conn = beiscsi_conn_create,
index 2db3399d2734bc2bcd72cb8caeaa6d8ed2a0b65e..d1e69719097024b58f699cb1f676d784c2c93e13 100644 (file)
@@ -2180,6 +2180,15 @@ static int bnx2i_nl_set_path(struct Scsi_Host *shost, struct iscsi_path *params)
 static mode_t bnx2i_attr_is_visible(int param_type, int param)
 {
        switch (param_type) {
+       case ISCSI_HOST_PARAM:
+               switch (param) {
+               case ISCSI_HOST_PARAM_NETDEV_NAME:
+               case ISCSI_HOST_PARAM_HWADDRESS:
+               case ISCSI_HOST_PARAM_IPADDRESS:
+                       return S_IRUGO;
+               default:
+                       return 0;
+               }
        case ISCSI_PARAM:
                switch (param) {
                case ISCSI_PARAM_MAX_RECV_DLENGTH:
@@ -2251,8 +2260,6 @@ struct iscsi_transport bnx2i_iscsi_transport = {
                                  CAP_MULTI_R2T | CAP_DATADGST |
                                  CAP_DATA_PATH_OFFLOAD |
                                  CAP_TEXT_NEGO,
-       .host_param_mask        = ISCSI_HOST_HWADDRESS | ISCSI_HOST_IPADDRESS |
-                                 ISCSI_HOST_NETDEV_NAME,
        .create_session         = bnx2i_session_create,
        .destroy_session        = bnx2i_session_destroy,
        .create_conn            = bnx2i_conn_create,
index 50d4e3f0503870912ca51cfc81a30ae6030ef763..f76185b010dadd91d8e35861c135758c51ef3366 100644 (file)
@@ -106,9 +106,6 @@ static struct iscsi_transport cxgb3i_iscsi_transport = {
        .caps           = CAP_RECOVERY_L0 | CAP_MULTI_R2T | CAP_HDRDGST
                                | CAP_DATADGST | CAP_DIGEST_OFFLOAD |
                                CAP_PADDING_OFFLOAD | CAP_TEXT_NEGO,
-       .host_param_mask        = ISCSI_HOST_HWADDRESS | ISCSI_HOST_IPADDRESS |
-                               ISCSI_HOST_INITIATOR_NAME |
-                               ISCSI_HOST_NETDEV_NAME,
        .attr_is_visible        = cxgbi_attr_is_visible,
        .get_host_param = cxgbi_get_host_param,
        .set_host_param = cxgbi_set_host_param,
index 72f19ef7e0161f320eb98227537d0fce76640db4..628a6983a20b1a0ab8be9aca5ebff6777a1fbaca 100644 (file)
@@ -107,9 +107,6 @@ static struct iscsi_transport cxgb4i_iscsi_transport = {
        .caps           = CAP_RECOVERY_L0 | CAP_MULTI_R2T | CAP_HDRDGST |
                                CAP_DATADGST | CAP_DIGEST_OFFLOAD |
                                CAP_PADDING_OFFLOAD | CAP_TEXT_NEGO,
-       .host_param_mask        = ISCSI_HOST_HWADDRESS | ISCSI_HOST_IPADDRESS |
-                               ISCSI_HOST_INITIATOR_NAME |
-                               ISCSI_HOST_NETDEV_NAME,
        .attr_is_visible        = cxgbi_attr_is_visible,
        .get_host_param = cxgbi_get_host_param,
        .set_host_param = cxgbi_set_host_param,
index f9c2ca0d8083a29a8c7070d969a046873d367475..67ded44557e18840b2a0f2ee26afc663d38eea38 100644 (file)
@@ -2569,6 +2569,16 @@ EXPORT_SYMBOL_GPL(cxgbi_iscsi_cleanup);
 mode_t cxgbi_attr_is_visible(int param_type, int param)
 {
        switch (param_type) {
+       case ISCSI_HOST_PARAM:
+               switch (param) {
+               case ISCSI_HOST_PARAM_NETDEV_NAME:
+               case ISCSI_HOST_PARAM_HWADDRESS:
+               case ISCSI_HOST_PARAM_IPADDRESS:
+               case ISCSI_HOST_PARAM_INITIATOR_NAME:
+                       return S_IRUGO;
+               default:
+                       return 0;
+               }
        case ISCSI_PARAM:
                switch (param) {
                case ISCSI_PARAM_MAX_RECV_DLENGTH:
index 6ab21221176005f1045ae182143864fd686d0db6..23e706673d066117cbcf673d8f495987a69754b5 100644 (file)
@@ -875,6 +875,16 @@ static void iscsi_sw_tcp_session_destroy(struct iscsi_cls_session *cls_session)
 static mode_t iscsi_sw_tcp_attr_is_visible(int param_type, int param)
 {
        switch (param_type) {
+       case ISCSI_HOST_PARAM:
+               switch (param) {
+               case ISCSI_HOST_PARAM_NETDEV_NAME:
+               case ISCSI_HOST_PARAM_HWADDRESS:
+               case ISCSI_HOST_PARAM_IPADDRESS:
+               case ISCSI_HOST_PARAM_INITIATOR_NAME:
+                       return S_IRUGO;
+               default:
+                       return 0;
+               }
        case ISCSI_PARAM:
                switch (param) {
                case ISCSI_PARAM_MAX_RECV_DLENGTH:
@@ -955,9 +965,6 @@ static struct iscsi_transport iscsi_sw_tcp_transport = {
        .name                   = "tcp",
        .caps                   = CAP_RECOVERY_L0 | CAP_MULTI_R2T | CAP_HDRDGST
                                  | CAP_DATADGST,
-       .host_param_mask        = ISCSI_HOST_HWADDRESS | ISCSI_HOST_IPADDRESS |
-                                 ISCSI_HOST_INITIATOR_NAME |
-                                 ISCSI_HOST_NETDEV_NAME,
        /* session management */
        .create_session         = iscsi_sw_tcp_session_create,
        .destroy_session        = iscsi_sw_tcp_session_destroy,
index df6da3cb124d720d318f3a75568176d46489f324..a9da3152ee5146162ac7c684f021828cd575b81d 100644 (file)
@@ -138,9 +138,6 @@ static struct iscsi_transport qla4xxx_iscsi_transport = {
        .name                   = DRIVER_NAME,
        .caps                   = CAP_FW_DB | CAP_SENDTARGETS_OFFLOAD |
                                  CAP_DATA_PATH_OFFLOAD,
-       .host_param_mask        = ISCSI_HOST_HWADDRESS |
-                                 ISCSI_HOST_IPADDRESS |
-                                 ISCSI_HOST_INITIATOR_NAME,
        .tgt_dscvr              = qla4xxx_tgt_dscvr,
        .attr_is_visible        = ql4_attr_is_visible,
        .get_conn_param         = qla4xxx_conn_get_param,
@@ -156,6 +153,15 @@ static struct scsi_transport_template *qla4xxx_scsi_transport;
 static mode_t ql4_attr_is_visible(int param_type, int param)
 {
        switch (param_type) {
+       case ISCSI_HOST_PARAM:
+               switch (param) {
+               case ISCSI_HOST_PARAM_HWADDRESS:
+               case ISCSI_HOST_PARAM_IPADDRESS:
+               case ISCSI_HOST_PARAM_INITIATOR_NAME:
+                       return S_IRUGO;
+               default:
+                       return 0;
+               }
        case ISCSI_PARAM:
                switch (param) {
                case ISCSI_PARAM_CONN_ADDRESS:
index a8dd85dc77b11ed47c54b3dbcb238b4aa05081cc..2e9b68215593b397de1342e930854cd895bbb54a 100644 (file)
@@ -32,8 +32,6 @@
 #include <scsi/iscsi_if.h>
 #include <scsi/scsi_cmnd.h>
 
-#define ISCSI_HOST_ATTRS 4
-
 #define ISCSI_TRANSPORT_VERSION "2.0-870"
 
 static int dbg_session;
@@ -74,7 +72,6 @@ struct iscsi_internal {
        struct list_head list;
        struct device dev;
 
-       struct device_attribute *host_attrs[ISCSI_HOST_ATTRS + 1];
        struct transport_container conn_cont;
        struct transport_container session_cont;
 };
@@ -2301,13 +2298,42 @@ iscsi_host_attr(hwaddress, ISCSI_HOST_PARAM_HWADDRESS);
 iscsi_host_attr(ipaddress, ISCSI_HOST_PARAM_IPADDRESS);
 iscsi_host_attr(initiatorname, ISCSI_HOST_PARAM_INITIATOR_NAME);
 
-#define SETUP_HOST_RD_ATTR(field, param_flag)                          \
-do {                                                                   \
-       if (tt->host_param_mask & param_flag) {                         \
-               priv->host_attrs[count] = &dev_attr_host_##field; \
-               count++;                                                \
-       }                                                               \
-} while (0)
+static struct attribute *iscsi_host_attrs[] = {
+       &dev_attr_host_netdev.attr,
+       &dev_attr_host_hwaddress.attr,
+       &dev_attr_host_ipaddress.attr,
+       &dev_attr_host_initiatorname.attr,
+       NULL,
+};
+
+static mode_t iscsi_host_attr_is_visible(struct kobject *kobj,
+                                        struct attribute *attr, int i)
+{
+       struct device *cdev = container_of(kobj, struct device, kobj);
+       struct Scsi_Host *shost = transport_class_to_shost(cdev);
+       struct iscsi_internal *priv = to_iscsi_internal(shost->transportt);
+       int param;
+
+       if (attr == &dev_attr_host_netdev.attr)
+               param = ISCSI_HOST_PARAM_NETDEV_NAME;
+       else if (attr == &dev_attr_host_hwaddress.attr)
+               param = ISCSI_HOST_PARAM_HWADDRESS;
+       else if (attr == &dev_attr_host_ipaddress.attr)
+               param = ISCSI_HOST_PARAM_IPADDRESS;
+       else if (attr == &dev_attr_host_initiatorname.attr)
+               param = ISCSI_HOST_PARAM_INITIATOR_NAME;
+       else {
+               WARN_ONCE(1, "Invalid host attr");
+               return 0;
+       }
+
+       return priv->iscsi_transport->attr_is_visible(ISCSI_HOST_PARAM, param);
+}
+
+static struct attribute_group iscsi_host_group = {
+       .attrs = iscsi_host_attrs,
+       .is_visible = iscsi_host_attr_is_visible,
+};
 
 static int iscsi_session_match(struct attribute_container *cont,
                           struct device *dev)
@@ -2379,7 +2405,7 @@ iscsi_register_transport(struct iscsi_transport *tt)
 {
        struct iscsi_internal *priv;
        unsigned long flags;
-       int count = 0, err;
+       int err;
 
        BUG_ON(!tt);
 
@@ -2406,20 +2432,12 @@ iscsi_register_transport(struct iscsi_transport *tt)
                goto unregister_dev;
 
        /* host parameters */
-       priv->t.host_attrs.ac.attrs = &priv->host_attrs[0];
        priv->t.host_attrs.ac.class = &iscsi_host_class.class;
        priv->t.host_attrs.ac.match = iscsi_host_match;
+       priv->t.host_attrs.ac.grp = &iscsi_host_group;
        priv->t.host_size = sizeof(struct iscsi_cls_host);
        transport_container_register(&priv->t.host_attrs);
 
-       SETUP_HOST_RD_ATTR(netdev, ISCSI_HOST_NETDEV_NAME);
-       SETUP_HOST_RD_ATTR(ipaddress, ISCSI_HOST_IPADDRESS);
-       SETUP_HOST_RD_ATTR(hwaddress, ISCSI_HOST_HWADDRESS);
-       SETUP_HOST_RD_ATTR(initiatorname, ISCSI_HOST_INITIATOR_NAME);
-       BUG_ON(count > ISCSI_HOST_ATTRS);
-       priv->host_attrs[count] = NULL;
-       count = 0;
-
        /* connection parameters */
        priv->conn_cont.ac.class = &iscsi_connection_class.class;
        priv->conn_cont.ac.match = iscsi_conn_match;
index 164a753fdd3a6c4a28b37f88881e9ae6ab9732f3..3753f7e36386ec1b6186a3b9a81c8c878516f26c 100644 (file)
@@ -391,11 +391,6 @@ enum iscsi_host_param {
        ISCSI_HOST_PARAM_MAX,
 };
 
-#define ISCSI_HOST_HWADDRESS           (1ULL << ISCSI_HOST_PARAM_HWADDRESS)
-#define ISCSI_HOST_INITIATOR_NAME      (1ULL << ISCSI_HOST_PARAM_INITIATOR_NAME)
-#define ISCSI_HOST_NETDEV_NAME         (1ULL << ISCSI_HOST_PARAM_NETDEV_NAME)
-#define ISCSI_HOST_IPADDRESS           (1ULL << ISCSI_HOST_PARAM_IPADDRESS)
-
 #define iscsi_ptr(_handle) ((void*)(unsigned long)_handle)
 #define iscsi_handle(_ptr) ((uint64_t)(unsigned long)_ptr)
 
index b9e9ef5a881f12a429894e6c40df609497cbfd22..77e6dd60fb4bf070b5b72c69121a9a391f3b6a28 100644 (file)
@@ -85,8 +85,6 @@ struct iscsi_transport {
        struct module *owner;
        char *name;
        unsigned int caps;
-       /* LLD sets this to indicate what values it can export to sysfs */
-       uint64_t host_param_mask;
 
        struct iscsi_cls_session *(*create_session) (struct iscsi_endpoint *ep,
                                        uint16_t cmds_max, uint16_t qdepth,