aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/scsi_transport_iscsi.c
diff options
context:
space:
mode:
authorMike Christie <michaelc@cs.wisc.edu>2011-07-25 14:48:42 -0400
committerJames Bottomley <JBottomley@Parallels.com>2011-08-27 10:36:03 -0400
commit3128c6c73cdf3df92c3165bfb785ae50114d18bf (patch)
tree49af7993064b0140bda96c795a47fa336525d02c /drivers/scsi/scsi_transport_iscsi.c
parented1086e041b4870313dd0c0755f4bbc3b62d0d08 (diff)
[SCSI] iscsi cls: sysfs group is_visible callout for conn attrs
The iscsi class currently does not support writable sysfs attrs for LLD sysfs settings. This patch converts the iscsi class and drivers 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>
Diffstat (limited to 'drivers/scsi/scsi_transport_iscsi.c')
-rw-r--r--drivers/scsi/scsi_transport_iscsi.c93
1 files changed, 65 insertions, 28 deletions
diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c
index 4d5e64f429e7..e9eca98e1102 100644
--- a/drivers/scsi/scsi_transport_iscsi.c
+++ b/drivers/scsi/scsi_transport_iscsi.c
@@ -78,7 +78,6 @@ struct iscsi_internal {
78 78
79 struct device_attribute *host_attrs[ISCSI_HOST_ATTRS + 1]; 79 struct device_attribute *host_attrs[ISCSI_HOST_ATTRS + 1];
80 struct transport_container conn_cont; 80 struct transport_container conn_cont;
81 struct device_attribute *conn_attrs[ISCSI_CONN_ATTRS + 1];
82 struct transport_container session_cont; 81 struct transport_container session_cont;
83 struct device_attribute *session_attrs[ISCSI_SESSION_ATTRS + 1]; 82 struct device_attribute *session_attrs[ISCSI_SESSION_ATTRS + 1];
84}; 83};
@@ -2030,6 +2029,70 @@ static ISCSI_CLASS_ATTR(conn, field, S_IRUGO, \
2030iscsi_conn_ep_attr(address, ISCSI_PARAM_CONN_ADDRESS); 2029iscsi_conn_ep_attr(address, ISCSI_PARAM_CONN_ADDRESS);
2031iscsi_conn_ep_attr(port, ISCSI_PARAM_CONN_PORT); 2030iscsi_conn_ep_attr(port, ISCSI_PARAM_CONN_PORT);
2032 2031
2032static struct attribute *iscsi_conn_attrs[] = {
2033 &dev_attr_conn_max_recv_dlength.attr,
2034 &dev_attr_conn_max_xmit_dlength.attr,
2035 &dev_attr_conn_header_digest.attr,
2036 &dev_attr_conn_data_digest.attr,
2037 &dev_attr_conn_ifmarker.attr,
2038 &dev_attr_conn_ofmarker.attr,
2039 &dev_attr_conn_address.attr,
2040 &dev_attr_conn_port.attr,
2041 &dev_attr_conn_exp_statsn.attr,
2042 &dev_attr_conn_persistent_address.attr,
2043 &dev_attr_conn_persistent_port.attr,
2044 &dev_attr_conn_ping_tmo.attr,
2045 &dev_attr_conn_recv_tmo.attr,
2046 NULL,
2047};
2048
2049static mode_t iscsi_conn_attr_is_visible(struct kobject *kobj,
2050 struct attribute *attr, int i)
2051{
2052 struct device *cdev = container_of(kobj, struct device, kobj);
2053 struct iscsi_cls_conn *conn = transport_class_to_conn(cdev);
2054 struct iscsi_transport *t = conn->transport;
2055 int param;
2056
2057 if (attr == &dev_attr_conn_max_recv_dlength.attr)
2058 param = ISCSI_PARAM_MAX_RECV_DLENGTH;
2059 else if (attr == &dev_attr_conn_max_xmit_dlength.attr)
2060 param = ISCSI_PARAM_MAX_XMIT_DLENGTH;
2061 else if (attr == &dev_attr_conn_header_digest.attr)
2062 param = ISCSI_PARAM_HDRDGST_EN;
2063 else if (attr == &dev_attr_conn_data_digest.attr)
2064 param = ISCSI_PARAM_DATADGST_EN;
2065 else if (attr == &dev_attr_conn_ifmarker.attr)
2066 param = ISCSI_PARAM_IFMARKER_EN;
2067 else if (attr == &dev_attr_conn_ofmarker.attr)
2068 param = ISCSI_PARAM_OFMARKER_EN;
2069 else if (attr == &dev_attr_conn_address.attr)
2070 param = ISCSI_PARAM_CONN_ADDRESS;
2071 else if (attr == &dev_attr_conn_port.attr)
2072 param = ISCSI_PARAM_CONN_PORT;
2073 else if (attr == &dev_attr_conn_exp_statsn.attr)
2074 param = ISCSI_PARAM_EXP_STATSN;
2075 else if (attr == &dev_attr_conn_persistent_address.attr)
2076 param = ISCSI_PARAM_PERSISTENT_ADDRESS;
2077 else if (attr == &dev_attr_conn_persistent_port.attr)
2078 param = ISCSI_PARAM_PERSISTENT_PORT;
2079 else if (attr == &dev_attr_conn_ping_tmo.attr)
2080 param = ISCSI_PARAM_PING_TMO;
2081 else if (attr == &dev_attr_conn_recv_tmo.attr)
2082 param = ISCSI_PARAM_RECV_TMO;
2083 else {
2084 WARN_ONCE(1, "Invalid conn attr");
2085 return 0;
2086 }
2087
2088 return t->attr_is_visible(ISCSI_PARAM, param);
2089}
2090
2091static struct attribute_group iscsi_conn_group = {
2092 .attrs = iscsi_conn_attrs,
2093 .is_visible = iscsi_conn_attr_is_visible,
2094};
2095
2033/* 2096/*
2034 * iSCSI session attrs 2097 * iSCSI session attrs
2035 */ 2098 */
@@ -2171,14 +2234,6 @@ do { \
2171 } \ 2234 } \
2172} while (0) 2235} while (0)
2173 2236
2174#define SETUP_CONN_RD_ATTR(field, param_flag) \
2175do { \
2176 if (tt->param_mask & param_flag) { \
2177 priv->conn_attrs[count] = &dev_attr_conn_##field; \
2178 count++; \
2179 } \
2180} while (0)
2181
2182#define SETUP_HOST_RD_ATTR(field, param_flag) \ 2237#define SETUP_HOST_RD_ATTR(field, param_flag) \
2183do { \ 2238do { \
2184 if (tt->host_param_mask & param_flag) { \ 2239 if (tt->host_param_mask & param_flag) { \
@@ -2299,29 +2354,11 @@ iscsi_register_transport(struct iscsi_transport *tt)
2299 count = 0; 2354 count = 0;
2300 2355
2301 /* connection parameters */ 2356 /* connection parameters */
2302 priv->conn_cont.ac.attrs = &priv->conn_attrs[0];
2303 priv->conn_cont.ac.class = &iscsi_connection_class.class; 2357 priv->conn_cont.ac.class = &iscsi_connection_class.class;
2304 priv->conn_cont.ac.match = iscsi_conn_match; 2358 priv->conn_cont.ac.match = iscsi_conn_match;
2359 priv->conn_cont.ac.grp = &iscsi_conn_group;
2305 transport_container_register(&priv->conn_cont); 2360 transport_container_register(&priv->conn_cont);
2306 2361
2307 SETUP_CONN_RD_ATTR(max_recv_dlength, ISCSI_MAX_RECV_DLENGTH);
2308 SETUP_CONN_RD_ATTR(max_xmit_dlength, ISCSI_MAX_XMIT_DLENGTH);
2309 SETUP_CONN_RD_ATTR(header_digest, ISCSI_HDRDGST_EN);
2310 SETUP_CONN_RD_ATTR(data_digest, ISCSI_DATADGST_EN);
2311 SETUP_CONN_RD_ATTR(ifmarker, ISCSI_IFMARKER_EN);
2312 SETUP_CONN_RD_ATTR(ofmarker, ISCSI_OFMARKER_EN);
2313 SETUP_CONN_RD_ATTR(address, ISCSI_CONN_ADDRESS);
2314 SETUP_CONN_RD_ATTR(port, ISCSI_CONN_PORT);
2315 SETUP_CONN_RD_ATTR(exp_statsn, ISCSI_EXP_STATSN);
2316 SETUP_CONN_RD_ATTR(persistent_address, ISCSI_PERSISTENT_ADDRESS);
2317 SETUP_CONN_RD_ATTR(persistent_port, ISCSI_PERSISTENT_PORT);
2318 SETUP_CONN_RD_ATTR(ping_tmo, ISCSI_PING_TMO);
2319 SETUP_CONN_RD_ATTR(recv_tmo, ISCSI_RECV_TMO);
2320
2321 BUG_ON(count > ISCSI_CONN_ATTRS);
2322 priv->conn_attrs[count] = NULL;
2323 count = 0;
2324
2325 /* session parameters */ 2362 /* session parameters */
2326 priv->session_cont.ac.attrs = &priv->session_attrs[0]; 2363 priv->session_cont.ac.attrs = &priv->session_attrs[0];
2327 priv->session_cont.ac.class = &iscsi_session_class.class; 2364 priv->session_cont.ac.class = &iscsi_session_class.class;