Commit f27fb2ef authored by Mike Christie's avatar Mike Christie Committed by James Bottomley

[SCSI] iscsi class: sysfs group is_visible callout for iscsi host attrs

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: default avatarMike Christie <michaelc@cs.wisc.edu>
Signed-off-by: default avatarJames Bottomley <JBottomley@Parallels.com>
parent b78dbba0
...@@ -635,6 +635,15 @@ iscsi_iser_ep_disconnect(struct iscsi_endpoint *ep) ...@@ -635,6 +635,15 @@ iscsi_iser_ep_disconnect(struct iscsi_endpoint *ep)
static mode_t iser_attr_is_visible(int param_type, int param) static mode_t iser_attr_is_visible(int param_type, int param)
{ {
switch (param_type) { 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: case ISCSI_PARAM:
switch (param) { switch (param) {
case ISCSI_PARAM_MAX_RECV_DLENGTH: case ISCSI_PARAM_MAX_RECV_DLENGTH:
...@@ -697,9 +706,6 @@ static struct iscsi_transport iscsi_iser_transport = { ...@@ -697,9 +706,6 @@ static struct iscsi_transport iscsi_iser_transport = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.name = "iser", .name = "iser",
.caps = CAP_RECOVERY_L0 | CAP_MULTI_R2T, .caps = CAP_RECOVERY_L0 | CAP_MULTI_R2T,
.host_param_mask = ISCSI_HOST_HWADDRESS |
ISCSI_HOST_NETDEV_NAME |
ISCSI_HOST_INITIATOR_NAME,
/* session management */ /* session management */
.create_session = iscsi_iser_session_create, .create_session = iscsi_iser_session_create,
.destroy_session = iscsi_iser_session_destroy, .destroy_session = iscsi_iser_session_destroy,
......
...@@ -737,6 +737,15 @@ void beiscsi_ep_disconnect(struct iscsi_endpoint *ep) ...@@ -737,6 +737,15 @@ void beiscsi_ep_disconnect(struct iscsi_endpoint *ep)
mode_t be2iscsi_attr_is_visible(int param_type, int param) mode_t be2iscsi_attr_is_visible(int param_type, int param)
{ {
switch (param_type) { 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: case ISCSI_PARAM:
switch (param) { switch (param) {
case ISCSI_PARAM_MAX_RECV_DLENGTH: case ISCSI_PARAM_MAX_RECV_DLENGTH:
......
...@@ -4364,8 +4364,6 @@ struct iscsi_transport beiscsi_iscsi_transport = { ...@@ -4364,8 +4364,6 @@ struct iscsi_transport beiscsi_iscsi_transport = {
.name = DRV_NAME, .name = DRV_NAME,
.caps = CAP_RECOVERY_L0 | CAP_HDRDGST | CAP_TEXT_NEGO | .caps = CAP_RECOVERY_L0 | CAP_HDRDGST | CAP_TEXT_NEGO |
CAP_MULTI_R2T | CAP_DATADGST | CAP_DATA_PATH_OFFLOAD, 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, .create_session = beiscsi_session_create,
.destroy_session = beiscsi_session_destroy, .destroy_session = beiscsi_session_destroy,
.create_conn = beiscsi_conn_create, .create_conn = beiscsi_conn_create,
......
...@@ -2180,6 +2180,15 @@ static int bnx2i_nl_set_path(struct Scsi_Host *shost, struct iscsi_path *params) ...@@ -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) static mode_t bnx2i_attr_is_visible(int param_type, int param)
{ {
switch (param_type) { 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: case ISCSI_PARAM:
switch (param) { switch (param) {
case ISCSI_PARAM_MAX_RECV_DLENGTH: case ISCSI_PARAM_MAX_RECV_DLENGTH:
...@@ -2251,8 +2260,6 @@ struct iscsi_transport bnx2i_iscsi_transport = { ...@@ -2251,8 +2260,6 @@ struct iscsi_transport bnx2i_iscsi_transport = {
CAP_MULTI_R2T | CAP_DATADGST | CAP_MULTI_R2T | CAP_DATADGST |
CAP_DATA_PATH_OFFLOAD | CAP_DATA_PATH_OFFLOAD |
CAP_TEXT_NEGO, CAP_TEXT_NEGO,
.host_param_mask = ISCSI_HOST_HWADDRESS | ISCSI_HOST_IPADDRESS |
ISCSI_HOST_NETDEV_NAME,
.create_session = bnx2i_session_create, .create_session = bnx2i_session_create,
.destroy_session = bnx2i_session_destroy, .destroy_session = bnx2i_session_destroy,
.create_conn = bnx2i_conn_create, .create_conn = bnx2i_conn_create,
......
...@@ -106,9 +106,6 @@ static struct iscsi_transport cxgb3i_iscsi_transport = { ...@@ -106,9 +106,6 @@ static struct iscsi_transport cxgb3i_iscsi_transport = {
.caps = CAP_RECOVERY_L0 | CAP_MULTI_R2T | CAP_HDRDGST .caps = CAP_RECOVERY_L0 | CAP_MULTI_R2T | CAP_HDRDGST
| CAP_DATADGST | CAP_DIGEST_OFFLOAD | | CAP_DATADGST | CAP_DIGEST_OFFLOAD |
CAP_PADDING_OFFLOAD | CAP_TEXT_NEGO, 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, .attr_is_visible = cxgbi_attr_is_visible,
.get_host_param = cxgbi_get_host_param, .get_host_param = cxgbi_get_host_param,
.set_host_param = cxgbi_set_host_param, .set_host_param = cxgbi_set_host_param,
......
...@@ -107,9 +107,6 @@ static struct iscsi_transport cxgb4i_iscsi_transport = { ...@@ -107,9 +107,6 @@ static struct iscsi_transport cxgb4i_iscsi_transport = {
.caps = CAP_RECOVERY_L0 | CAP_MULTI_R2T | CAP_HDRDGST | .caps = CAP_RECOVERY_L0 | CAP_MULTI_R2T | CAP_HDRDGST |
CAP_DATADGST | CAP_DIGEST_OFFLOAD | CAP_DATADGST | CAP_DIGEST_OFFLOAD |
CAP_PADDING_OFFLOAD | CAP_TEXT_NEGO, 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, .attr_is_visible = cxgbi_attr_is_visible,
.get_host_param = cxgbi_get_host_param, .get_host_param = cxgbi_get_host_param,
.set_host_param = cxgbi_set_host_param, .set_host_param = cxgbi_set_host_param,
......
...@@ -2569,6 +2569,16 @@ EXPORT_SYMBOL_GPL(cxgbi_iscsi_cleanup); ...@@ -2569,6 +2569,16 @@ EXPORT_SYMBOL_GPL(cxgbi_iscsi_cleanup);
mode_t cxgbi_attr_is_visible(int param_type, int param) mode_t cxgbi_attr_is_visible(int param_type, int param)
{ {
switch (param_type) { 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: case ISCSI_PARAM:
switch (param) { switch (param) {
case ISCSI_PARAM_MAX_RECV_DLENGTH: case ISCSI_PARAM_MAX_RECV_DLENGTH:
......
...@@ -875,6 +875,16 @@ static void iscsi_sw_tcp_session_destroy(struct iscsi_cls_session *cls_session) ...@@ -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) static mode_t iscsi_sw_tcp_attr_is_visible(int param_type, int param)
{ {
switch (param_type) { 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: case ISCSI_PARAM:
switch (param) { switch (param) {
case ISCSI_PARAM_MAX_RECV_DLENGTH: case ISCSI_PARAM_MAX_RECV_DLENGTH:
...@@ -955,9 +965,6 @@ static struct iscsi_transport iscsi_sw_tcp_transport = { ...@@ -955,9 +965,6 @@ static struct iscsi_transport iscsi_sw_tcp_transport = {
.name = "tcp", .name = "tcp",
.caps = CAP_RECOVERY_L0 | CAP_MULTI_R2T | CAP_HDRDGST .caps = CAP_RECOVERY_L0 | CAP_MULTI_R2T | CAP_HDRDGST
| CAP_DATADGST, | CAP_DATADGST,
.host_param_mask = ISCSI_HOST_HWADDRESS | ISCSI_HOST_IPADDRESS |
ISCSI_HOST_INITIATOR_NAME |
ISCSI_HOST_NETDEV_NAME,
/* session management */ /* session management */
.create_session = iscsi_sw_tcp_session_create, .create_session = iscsi_sw_tcp_session_create,
.destroy_session = iscsi_sw_tcp_session_destroy, .destroy_session = iscsi_sw_tcp_session_destroy,
......
...@@ -138,9 +138,6 @@ static struct iscsi_transport qla4xxx_iscsi_transport = { ...@@ -138,9 +138,6 @@ static struct iscsi_transport qla4xxx_iscsi_transport = {
.name = DRIVER_NAME, .name = DRIVER_NAME,
.caps = CAP_FW_DB | CAP_SENDTARGETS_OFFLOAD | .caps = CAP_FW_DB | CAP_SENDTARGETS_OFFLOAD |
CAP_DATA_PATH_OFFLOAD, CAP_DATA_PATH_OFFLOAD,
.host_param_mask = ISCSI_HOST_HWADDRESS |
ISCSI_HOST_IPADDRESS |
ISCSI_HOST_INITIATOR_NAME,
.tgt_dscvr = qla4xxx_tgt_dscvr, .tgt_dscvr = qla4xxx_tgt_dscvr,
.attr_is_visible = ql4_attr_is_visible, .attr_is_visible = ql4_attr_is_visible,
.get_conn_param = qla4xxx_conn_get_param, .get_conn_param = qla4xxx_conn_get_param,
...@@ -156,6 +153,15 @@ static struct scsi_transport_template *qla4xxx_scsi_transport; ...@@ -156,6 +153,15 @@ static struct scsi_transport_template *qla4xxx_scsi_transport;
static mode_t ql4_attr_is_visible(int param_type, int param) static mode_t ql4_attr_is_visible(int param_type, int param)
{ {
switch (param_type) { 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: case ISCSI_PARAM:
switch (param) { switch (param) {
case ISCSI_PARAM_CONN_ADDRESS: case ISCSI_PARAM_CONN_ADDRESS:
......
...@@ -32,8 +32,6 @@ ...@@ -32,8 +32,6 @@
#include <scsi/iscsi_if.h> #include <scsi/iscsi_if.h>
#include <scsi/scsi_cmnd.h> #include <scsi/scsi_cmnd.h>
#define ISCSI_HOST_ATTRS 4
#define ISCSI_TRANSPORT_VERSION "2.0-870" #define ISCSI_TRANSPORT_VERSION "2.0-870"
static int dbg_session; static int dbg_session;
...@@ -74,7 +72,6 @@ struct iscsi_internal { ...@@ -74,7 +72,6 @@ struct iscsi_internal {
struct list_head list; struct list_head list;
struct device dev; struct device dev;
struct device_attribute *host_attrs[ISCSI_HOST_ATTRS + 1];
struct transport_container conn_cont; struct transport_container conn_cont;
struct transport_container session_cont; struct transport_container session_cont;
}; };
...@@ -2301,13 +2298,42 @@ iscsi_host_attr(hwaddress, ISCSI_HOST_PARAM_HWADDRESS); ...@@ -2301,13 +2298,42 @@ iscsi_host_attr(hwaddress, ISCSI_HOST_PARAM_HWADDRESS);
iscsi_host_attr(ipaddress, ISCSI_HOST_PARAM_IPADDRESS); iscsi_host_attr(ipaddress, ISCSI_HOST_PARAM_IPADDRESS);
iscsi_host_attr(initiatorname, ISCSI_HOST_PARAM_INITIATOR_NAME); iscsi_host_attr(initiatorname, ISCSI_HOST_PARAM_INITIATOR_NAME);
#define SETUP_HOST_RD_ATTR(field, param_flag) \ static struct attribute *iscsi_host_attrs[] = {
do { \ &dev_attr_host_netdev.attr,
if (tt->host_param_mask & param_flag) { \ &dev_attr_host_hwaddress.attr,
priv->host_attrs[count] = &dev_attr_host_##field; \ &dev_attr_host_ipaddress.attr,
count++; \ &dev_attr_host_initiatorname.attr,
} \ NULL,
} while (0) };
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, static int iscsi_session_match(struct attribute_container *cont,
struct device *dev) struct device *dev)
...@@ -2379,7 +2405,7 @@ iscsi_register_transport(struct iscsi_transport *tt) ...@@ -2379,7 +2405,7 @@ iscsi_register_transport(struct iscsi_transport *tt)
{ {
struct iscsi_internal *priv; struct iscsi_internal *priv;
unsigned long flags; unsigned long flags;
int count = 0, err; int err;
BUG_ON(!tt); BUG_ON(!tt);
...@@ -2406,20 +2432,12 @@ iscsi_register_transport(struct iscsi_transport *tt) ...@@ -2406,20 +2432,12 @@ iscsi_register_transport(struct iscsi_transport *tt)
goto unregister_dev; goto unregister_dev;
/* host parameters */ /* 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.class = &iscsi_host_class.class;
priv->t.host_attrs.ac.match = iscsi_host_match; 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); priv->t.host_size = sizeof(struct iscsi_cls_host);
transport_container_register(&priv->t.host_attrs); 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 */ /* connection parameters */
priv->conn_cont.ac.class = &iscsi_connection_class.class; priv->conn_cont.ac.class = &iscsi_connection_class.class;
priv->conn_cont.ac.match = iscsi_conn_match; priv->conn_cont.ac.match = iscsi_conn_match;
......
...@@ -391,11 +391,6 @@ enum iscsi_host_param { ...@@ -391,11 +391,6 @@ enum iscsi_host_param {
ISCSI_HOST_PARAM_MAX, 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_ptr(_handle) ((void*)(unsigned long)_handle)
#define iscsi_handle(_ptr) ((uint64_t)(unsigned long)_ptr) #define iscsi_handle(_ptr) ((uint64_t)(unsigned long)_ptr)
......
...@@ -85,8 +85,6 @@ struct iscsi_transport { ...@@ -85,8 +85,6 @@ struct iscsi_transport {
struct module *owner; struct module *owner;
char *name; char *name;
unsigned int caps; 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, struct iscsi_cls_session *(*create_session) (struct iscsi_endpoint *ep,
uint16_t cmds_max, uint16_t qdepth, uint16_t cmds_max, uint16_t qdepth,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment