use network namespace for iSCSI control interfaces
Subsystems (10)
cover use network namespace for iSCSI control interfaces
This series of changes makes the iSCSI netlink and sysfs control interfaces filtered by network namespace. This is required to run iscsid in any network namespace other than the initial default one.
Currently the netlink communication will fail if iscsid is started in a non-default network namespace, as there is no kernel side socket. After fixing that, the rest of these changes are to filter visibility of the iSCSI transport objects by netns. This allows for multiple iscsid instances to be run, one per netns, each controlling it's own set of iSCSI sessions.
The iSCSI transport objects are filtered, but not the SCSI or block layer devices. So while iSCSI hosts and sessions become limited to a network namespace, any attached devices remain visible system wide.
This currently only supports iscsi_tcp running in a new namespace, as it creates a virtual host per session. Support could be added later to allow assignment of iSCSI HBAs to network namespace, much as is done for network interfaces.
Chris Leech (9):
iscsi: create per-net iscsi netlink kernel sockets
iscsi: associate endpoints with a host
iscsi: sysfs filtering by network namespace
iscsi: make all iSCSI netlink multicast namespace aware
iscsi: set netns for iscsi_tcp hosts
iscsi: check net namespace for all iscsi lookups
iscsi: convert flashnode devices from bus to class
iscsi: rename iscsi_bus_flash_* to iscsi_flash_*
iscsi: filter flashnode sysfs by net namespace
drivers/infiniband/ulp/iser/iscsi_iser.c | 7 +- drivers/scsi/be2iscsi/be_iscsi.c | 6 +- drivers/scsi/bnx2i/bnx2i_iscsi.c | 6 +- drivers/scsi/cxgbi/libcxgbi.c | 6 +- drivers/scsi/iscsi_tcp.c | 7 + drivers/scsi/qedi/qedi_iscsi.c | 6 +- drivers/scsi/qla4xxx/ql4_os.c | 62 +-- drivers/scsi/scsi_transport_iscsi.c | 625 ++++++++++++++++++++++--------- include/scsi/scsi_transport_iscsi.h | 63 ++-- 9 files changed, 538 insertions(+), 250 deletions(-)
Signature · 8 lines
2.9.5 -- You received this message because you are subscribed to the Google Groups "open-iscsi" group. To unsubscribe from this group and stop receiving emails from it, send an email to open-iscsi+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/[email protected] To post to this group, send email to open-iscsi-/JYPxA39Uh5TLH3MbocFF+G/[email protected] Visit this group at https://groups.google.com/group/open-iscsi. For more options, visit https://groups.google.com/d/optout.
Chris Leech
maintainerPATCH 1/9 iscsi: create per-net iscsi netlink kernel sockets
Prepare iSCSI netlink to operate in multiple namespaces.
--- drivers/scsi/scsi_transport_iscsi.c | 67 +++++++++++++++++++++++++++++++------ 1 file changed, 57 insertions(+), 10 deletions(-)
drivers/scsi/scsi_transport_iscsi.c +57 -10
@@ -26,6 +26,8 @@#include <linux/bsg-lib.h> #include <linux/idr.h> #include <net/tcp.h> +#include <net/net_namespace.h> +#include <net/netns/generic.h> #include <scsi/scsi.h> #include <scsi/scsi_host.h> #include <scsi/scsi_device.h>
@@ -1601,7 +1603,11 @@ static DECLARE_TRANSPORT_CLASS(iscsi_connection_class,NULL , NULL); -static struct sock *nls; +struct iscsi_net { +struct sock *nls; +}; + +static int iscsi_net_id__read_mostly ;static DEFINE_MUTEX (rx_queue_mutex);static LIST_HEAD (sesslist);
@@ -2317,11 +2323,23 @@ iscsi_if_transport_lookup(struct iscsi_transport *tt) }static int -iscsi_multicast_skb (struct sk_buff *skb,uint32_t group,gfp_t gfp) +iscsi_multicast_netns (struct net *net,struct sk_buff *skb, +uint32_t group,gfp_t gfp) { +struct sock *nls; +struct iscsi_net *isn; + + isn =net_generic (net, iscsi_net_id); + nls = isn->nls;return nlmsg_multicast (nls, skb,0 , group, gfp); } +static int +iscsi_multicast_skb (struct sk_buff *skb,uint32_t group,gfp_t gfp) +{ +return iscsi_multicast_netns (&init_net, skb, group, gfp); +} +int iscsi_recv_pdu (struct iscsi_cls_conn *conn,struct iscsi_hdr *hdr,char *data,uint32_t data_size) {
@@ -4490,13 +4508,42 @@ int iscsi_unregister_transport(struct iscsi_transport *tt) }EXPORT_SYMBOL_GPL (iscsi_unregister_transport); -static __init int iscsi_transport_init (void ) +static int __net_init iscsi_net_init (struct net *net) { -int err; +struct sock *nls; +struct iscsi_net *isn;struct netlink_kernel_cfg cfg = { .groups =1 , .input = iscsi_if_rx, }; + + nls =netlink_kernel_create (net,NETLINK_ISCSI , &cfg); +if (!nls) +return -ENOMEM ; + isn =net_generic (net, iscsi_net_id); + isn->nls = nls; +return 0 ; +} + +static void __net_exit iscsi_net_exit(struct net *net) +{ +struct iscsi_net *isn; + + isn =net_generic (net, iscsi_net_id); +netlink_kernel_release (isn->nls); + isn->nls =NULL ; +} + +static struct pernet_operations iscsi_net_ops = { + .init = iscsi_net_init, + .exit = iscsi_net_exit, + .id = &iscsi_net_id, + .size =sizeof (struct iscsi_net ), +}; + +static __init int iscsi_transport_init (void ) +{ +int err;printk (KERN_INFO "Loading iSCSI transport class v%s.\n" ,ISCSI_TRANSPORT_VERSION );
@@ -4530,8 +4577,8 @@ static __init int iscsi_transport_init(void)if (err) goto unregister_session_class; - nls =netlink_kernel_create (&init_net,NETLINK_ISCSI , &cfg); -if (!nls) { + err =register_pernet_subsys (&iscsi_net_ops); +if (err) { err = -ENOBUFS ; goto unregister_flashnode_bus; }
@@ -4539,13 +4586,13 @@ static __init int iscsi_transport_init(void) iscsi_eh_timer_workq =create_singlethread_workqueue ("iscsi_eh" );if (!iscsi_eh_timer_workq) { err = -ENOMEM ; - goto release_nls; + goto unregister_pernet_subsys; }return 0 ; -release_nls: -netlink_kernel_release (nls); +unregister_pernet_subsys: +unregister_pernet_subsys (&iscsi_net_ops); unregister_flashnode_bus:bus_unregister (&iscsi_flashnode_bus); unregister_session_class:
@@ -4566,7 +4613,7 @@ static __init int iscsi_transport_init(void) static void __exit iscsi_transport_exit(void) {destroy_workqueue (iscsi_eh_timer_workq); -netlink_kernel_release (nls); +unregister_pernet_subsys (&iscsi_net_ops);bus_unregister (&iscsi_flashnode_bus);transport_class_unregister (&iscsi_connection_class);transport_class_unregister (&iscsi_session_class);
Signature · 1 line
2.9.5
Chris Leech
maintainerPATCH 2/9 iscsi: associate endpoints with a host
In reply to Chris LeechRight now the iscsi_endpoint is only linked to a connection once that connection has been established. For net namespace filtering of the sysfs objects, associate an endpoint with the host that it was allocated for when it is created.
--- drivers/infiniband/ulp/iser/iscsi_iser.c | 2 +- drivers/scsi/be2iscsi/be_iscsi.c | 2 +- drivers/scsi/bnx2i/bnx2i_iscsi.c | 2 +- drivers/scsi/cxgbi/libcxgbi.c | 2 +- drivers/scsi/qedi/qedi_iscsi.c | 2 +- drivers/scsi/qla4xxx/ql4_os.c | 2 +- drivers/scsi/scsi_transport_iscsi.c | 3 ++- include/scsi/scsi_transport_iscsi.h | 6 +++++- 8 files changed, 13 insertions(+), 8 deletions(-)
drivers/infiniband/ulp/iser/iscsi_iser.c +1 -1
@@ -817,7 +817,7 @@ iscsi_iser_ep_connect(struct Scsi_Host *shost, struct sockaddr *dst_addr,struct iser_conn *iser_conn;struct iscsi_endpoint *ep; - ep =iscsi_create_endpoint (0 ); + ep =iscsi_create_endpoint (shost,0 );if (!ep)return ERR_PTR (-ENOMEM );
drivers/scsi/be2iscsi/be_iscsi.c +1 -1
@@ -1157,7 +1157,7 @@ beiscsi_ep_connect(struct Scsi_Host *shost, struct sockaddr *dst_addr,return ERR_PTR (ret); } - ep =iscsi_create_endpoint (sizeof (struct beiscsi_endpoint )); + ep =iscsi_create_endpoint (shost,sizeof (struct beiscsi_endpoint ));if (!ep) { ret = -ENOMEM ;return ERR_PTR (ret);
drivers/scsi/bnx2i/bnx2i_iscsi.c +1 -1
@@ -384,7 +384,7 @@ static struct iscsi_endpoint *bnx2i_alloc_ep(struct bnx2i_hba *hba)struct bnx2i_endpoint *bnx2i_ep;u32 ec_div; - ep =iscsi_create_endpoint (sizeof (*bnx2i_ep)); + ep =iscsi_create_endpoint (hba->shost,sizeof (*bnx2i_ep));if (!ep) {printk (KERN_ERR "bnx2i: Could not allocate ep\n" );return NULL ;
drivers/scsi/cxgbi/libcxgbi.c +1 -1
@@ -2616,7 +2616,7 @@ struct iscsi_endpoint *cxgbi_ep_connect(struct Scsi_Host *shost, goto release_conn; } - ep =iscsi_create_endpoint (sizeof (*cep)); + ep =iscsi_create_endpoint (shost,sizeof (*cep));if (!ep) { err = -ENOMEM ;pr_info ("iscsi alloc ep, OOM.\n" );
drivers/scsi/qedi/qedi_iscsi.c +1 -1
@@ -847,7 +847,7 @@ qedi_ep_connect(struct Scsi_Host *shost, struct sockaddr *dst_addr,return ERR_PTR (ret); } - ep =iscsi_create_endpoint (sizeof (struct qedi_endpoint )); + ep =iscsi_create_endpoint (shost,sizeof (struct qedi_endpoint ));if (!ep) {QEDI_ERR (&qedi->dbg_ctx,"endpoint create fail\n" ); ret = -ENOMEM ;
drivers/scsi/qla4xxx/ql4_os.c +1 -1
@@ -1673,7 +1673,7 @@ qla4xxx_ep_connect(struct Scsi_Host *shost, struct sockaddr *dst_addr, } ha =iscsi_host_priv (shost); - ep =iscsi_create_endpoint (sizeof (struct qla_endpoint )); + ep =iscsi_create_endpoint (shost,sizeof (struct qla_endpoint ));if (!ep) { ret = -ENOMEM ;return ERR_PTR (ret);
drivers/scsi/scsi_transport_iscsi.c +2 -1
@@ -194,7 +194,7 @@ static int iscsi_match_epid(struct device *dev, const void *data) }struct iscsi_endpoint * -iscsi_create_endpoint (int dd_size) +iscsi_create_endpoint (struct Scsi_Host *shost,int dd_size) {struct device *dev;struct iscsi_endpoint *ep;
@@ -221,6 +221,7 @@ iscsi_create_endpoint(int dd_size) ep->id = id; ep->dev.class = &iscsi_endpoint_class; + ep->dev.parent = &shost->shost_gendev;dev_set_name (&ep->dev,"ep-%llu" , (unsigned long long ) id); err =device_register (&ep->dev);if (err)
include/scsi/scsi_transport_iscsi.h +5 -1
@@ -267,6 +267,9 @@ struct iscsi_cls_session {#define iscsi_session_to_shost (_session) \ dev_to_shost(_session->dev.parent) +#define iscsi_endpoint_to_shost (_ep) \ + dev_to_shost(_ep->dev.parent) +#define starget_to_session (_stgt) \ iscsi_dev_to_session(_stgt->dev.parent)
@@ -440,7 +443,8 @@ extern int iscsi_destroy_conn(struct iscsi_cls_conn *conn);extern void iscsi_unblock_session (struct iscsi_cls_session *session);extern void iscsi_block_session (struct iscsi_cls_session *session);extern int iscsi_scan_finished (struct Scsi_Host *shost,unsigned long time); -extern struct iscsi_endpoint *iscsi_create_endpoint (int dd_size); +extern struct iscsi_endpoint *iscsi_create_endpoint (struct Scsi_Host *shost, +int dd_size);extern void iscsi_destroy_endpoint (struct iscsi_endpoint *ep);extern struct iscsi_endpoint *iscsi_lookup_endpoint (u64 handle);extern int iscsi_block_scsi_eh (struct scsi_cmnd *cmd);
Signature · 8 lines
2.9.5 -- You received this message because you are subscribed to the Google Groups "open-iscsi" group. To unsubscribe from this group and stop receiving emails from it, send an email to open-iscsi+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/[email protected] To post to this group, send email to open-iscsi-/JYPxA39Uh5TLH3MbocFF+G/[email protected] Visit this group at https://groups.google.com/group/open-iscsi. For more options, visit https://groups.google.com/d/optout.
Chris Leech
maintainerPATCH 3/9 iscsi: sysfs filtering by network namespace
In reply to Chris LeechThis makes the iscsi_host, iscsi_session, iscsi_connection, iscsi_iface, and iscsi_endpoint transport class devices only visible in sysfs under a matching network namespace. The network namespace for all of these objects is tracked in the iscsi_cls_host structure.
--- drivers/scsi/scsi_transport_iscsi.c | 128 +++++++++++++++++++++++++++++++----- include/scsi/scsi_transport_iscsi.h | 1 + 2 files changed, 112 insertions(+), 17 deletions(-)
drivers/scsi/scsi_transport_iscsi.c +111 -17
@@ -161,9 +161,31 @@ static void iscsi_endpoint_release(struct device *dev)kfree (ep); } +static struct net *iscsi_host_net (struct iscsi_cls_host *ihost) +{ +return ihost->netns; +} + +static struct net *iscsi_endpoint_net (struct iscsi_endpoint *ep) +{ +struct Scsi_Host *shost =iscsi_endpoint_to_shost (ep); +struct iscsi_cls_host *ihost = shost->shost_data; + +return iscsi_host_net (ihost); +} + +static const void *iscsi_endpoint_namespace (struct device *dev) +{ +struct iscsi_endpoint *ep =iscsi_dev_to_endpoint (dev); + +return iscsi_endpoint_net (ep); +} +static struct class iscsi_endpoint_class = { .name ="iscsi_endpoint" , .dev_release = iscsi_endpoint_release, + .ns_type = &net_ns_type_operations, + .namespace = iscsi_endpoint_namespace, }; static ssize_t
@@ -285,10 +307,26 @@ static void iscsi_iface_release(struct device *dev)put_device (parent); } +static struct net *iscsi_iface_net (struct iscsi_iface *iface) +{ +struct Scsi_Host *shost =iscsi_iface_to_shost (iface); +struct iscsi_cls_host *ihost = shost->shost_data; + +return iscsi_host_net (ihost); +} + +static const void *iscsi_iface_namespace (struct device *dev) +{ +struct iscsi_iface *iface =iscsi_dev_to_iface (dev); + +return iscsi_iface_net (iface); +}static struct class iscsi_iface_class = { .name ="iscsi_iface" , .dev_release = iscsi_iface_release, + .ns_type = &net_ns_type_operations, + .namespace = iscsi_iface_namespace, };#define ISCSI_IFACE_ATTR (_prefix, _name, _mode, _show, _store) \
@@ -1566,6 +1604,7 @@ static int iscsi_setup_host(struct transport_container *tc, struct device *dev,memset (ihost,0 ,sizeof (*ihost));atomic_set (&ihost->nr_scans,0 );mutex_init (&ihost->mutex); + ihost->netns = &init_net;iscsi_bsg_host_add (shost, ihost);/* ignore any bsg add error - we just can't do sgio */
@@ -1586,23 +1625,78 @@ static int iscsi_remove_host(struct transport_container *tc,return 0 ; } -static DECLARE_TRANSPORT_CLASS(iscsi_host_class, -"iscsi_host" , - iscsi_setup_host, - iscsi_remove_host, - NULL); - -static DECLARE_TRANSPORT_CLASS(iscsi_session_class, -"iscsi_session" , -NULL , -NULL , - NULL); - -static DECLARE_TRANSPORT_CLASS(iscsi_connection_class, -"iscsi_connection" , -NULL , -NULL , - NULL); +#define DECLARE_TRANSPORT_CLASS_NS (cls, nm, su, rm, cfg, ns, nslookup) \ +struct transport_class cls = { \ + .class = { \ + .name = nm, \ + .ns_type = ns, \ + .namespace = nslookup, \ + }, \ + .setup = su, \ + .remove = rm, \ + .configure = cfg, \ +} + +static const void *iscsi_host_namespace (struct device *dev) +{ +struct Scsi_Host *shost =transport_class_to_shost (dev); +struct iscsi_cls_host *ihost = shost->shost_data; + +return iscsi_host_net (ihost); +} + +static DECLARE_TRANSPORT_CLASS_NS(iscsi_host_class, +"iscsi_host" , + iscsi_setup_host, + iscsi_remove_host, +NULL , + &net_ns_type_operations, + iscsi_host_namespace); + +static struct net *iscsi_sess_net (struct iscsi_cls_session *cls_session) +{ +struct Scsi_Host *shost =iscsi_session_to_shost (cls_session); +struct iscsi_cls_host *ihost = shost->shost_data; + +return iscsi_host_net (ihost); +} + +static const void *iscsi_sess_namespace (struct device *dev) +{ +struct iscsi_cls_session *cls_session =transport_class_to_session (dev); + +return iscsi_sess_net (cls_session); +} + +static DECLARE_TRANSPORT_CLASS_NS(iscsi_session_class, +"iscsi_session" , +NULL , +NULL , +NULL , + &net_ns_type_operations, + iscsi_sess_namespace); + +static struct net *iscsi_conn_net (struct iscsi_cls_conn *cls_conn) +{ +struct iscsi_cls_session *cls_session =iscsi_conn_to_session (cls_conn); + +return iscsi_sess_net (cls_session); +} + +static const void *iscsi_conn_namespace (struct device *dev) +{ +struct iscsi_cls_conn *cls_conn =transport_class_to_conn (dev); + +return iscsi_conn_net (cls_conn); +} + +static DECLARE_TRANSPORT_CLASS_NS(iscsi_connection_class, +"iscsi_connection" , +NULL , +NULL , +NULL , + &net_ns_type_operations, + iscsi_conn_namespace);struct iscsi_net {struct sock *nls;
include/scsi/scsi_transport_iscsi.h +1 -0
@@ -279,6 +279,7 @@ struct iscsi_cls_host {struct request_queue *bsg_q;uint32_t port_speed;uint32_t port_state; +struct net *netns; };#define iscsi_job_to_shost (_job) \
Signature · 8 lines
2.9.5 -- You received this message because you are subscribed to the Google Groups "open-iscsi" group. To unsubscribe from this group and stop receiving emails from it, send an email to open-iscsi+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/[email protected] To post to this group, send email to open-iscsi-/JYPxA39Uh5TLH3MbocFF+G/[email protected] Visit this group at https://groups.google.com/group/open-iscsi. For more options, visit https://groups.google.com/d/optout.
Chris Leech
maintainerPATCH 4/9 iscsi: make all iSCSI netlink multicast namespace aware
In reply to Chris LeechMake use of the per-net netlink sockets. Responses are sent back on the same socket/namespace the request was received on. Async events are reported on the socket/namespace stored in the iscsi_cls_host associated with the event.
--- drivers/scsi/scsi_transport_iscsi.c | 92 ++++++++++++++++++++++++------------- 1 file changed, 61 insertions(+), 31 deletions(-)
drivers/scsi/scsi_transport_iscsi.c +61 -31
@@ -2418,8 +2418,8 @@ iscsi_if_transport_lookup(struct iscsi_transport *tt) }static int -iscsi_multicast_netns (struct net *net,struct sk_buff *skb, -uint32_t group,gfp_t gfp) +iscsi_multicast_skb (struct net *net,struct sk_buff *skb, +uint32_t group,gfp_t gfp) {struct sock *nls;struct iscsi_net *isn;
@@ -2429,12 +2429,6 @@ iscsi_multicast_netns(struct net *net, struct sk_buff *skb,return nlmsg_multicast (nls, skb,0 , group, gfp); } -static int -iscsi_multicast_skb (struct sk_buff *skb,uint32_t group,gfp_t gfp) -{ -return iscsi_multicast_netns (&init_net, skb, group, gfp); -} -int iscsi_recv_pdu (struct iscsi_cls_conn *conn,struct iscsi_hdr *hdr,char *data,uint32_t data_size) {
@@ -2443,6 +2437,7 @@ int iscsi_recv_pdu(struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr,struct iscsi_uevent *ev;char *pdu;struct iscsi_internal *priv; +struct net *net;int len =nlmsg_total_size (sizeof (*ev) +sizeof (struct iscsi_hdr ) + data_size);
@@ -2469,7 +2464,8 @@ int iscsi_recv_pdu(struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr,memcpy (pdu, hdr,sizeof (struct iscsi_hdr ));memcpy (pdu +sizeof (struct iscsi_hdr ), data, data_size); -return iscsi_multicast_skb (skb,ISCSI_NL_GRP_ISCSID ,GFP_ATOMIC ); + net =iscsi_conn_net (conn); +return iscsi_multicast_skb (net, skb,ISCSI_NL_GRP_ISCSID ,GFP_ATOMIC ); }EXPORT_SYMBOL_GPL (iscsi_recv_pdu);
@@ -2480,6 +2476,7 @@ int iscsi_offload_mesg(struct Scsi_Host *shost,struct nlmsghdr *nlh;struct sk_buff *skb;struct iscsi_uevent *ev; +struct net *net;int len =nlmsg_total_size (sizeof (*ev) + data_size); skb =alloc_skb (len,GFP_ATOMIC );
@@ -2504,7 +2501,8 @@ int iscsi_offload_mesg(struct Scsi_Host *shost,memcpy ((char *)ev +sizeof (*ev), data, data_size); -return iscsi_multicast_skb (skb,ISCSI_NL_GRP_UIP ,GFP_ATOMIC ); + net =iscsi_host_net (shost->shost_data); +return iscsi_multicast_skb (net, skb,ISCSI_NL_GRP_UIP ,GFP_ATOMIC ); }EXPORT_SYMBOL_GPL (iscsi_offload_mesg);
@@ -2514,6 +2512,7 @@ void iscsi_conn_error_event(struct iscsi_cls_conn *conn, enum iscsi_err error)struct sk_buff *skb;struct iscsi_uevent *ev;struct iscsi_internal *priv; +struct net *net;int len =nlmsg_total_size (sizeof (*ev)); priv =iscsi_if_transport_lookup (conn->transport);
@@ -2535,7 +2534,8 @@ void iscsi_conn_error_event(struct iscsi_cls_conn *conn, enum iscsi_err error) ev->r.connerror.cid = conn->cid; ev->r.connerror.sid =iscsi_conn_get_sid (conn); -iscsi_multicast_skb (skb,ISCSI_NL_GRP_ISCSID ,GFP_ATOMIC ); + net =iscsi_conn_net (conn); +iscsi_multicast_skb (net, skb,ISCSI_NL_GRP_ISCSID ,GFP_ATOMIC );iscsi_cls_conn_printk (KERN_INFO , conn,"detected conn error (%d)\n" , error);
@@ -2549,6 +2549,7 @@ void iscsi_conn_login_event(struct iscsi_cls_conn *conn,struct sk_buff *skb;struct iscsi_uevent *ev;struct iscsi_internal *priv; +struct net *net;int len =nlmsg_total_size (sizeof (*ev)); priv =iscsi_if_transport_lookup (conn->transport);
@@ -2569,7 +2570,9 @@ void iscsi_conn_login_event(struct iscsi_cls_conn *conn, ev->r.conn_login.state = state; ev->r.conn_login.cid = conn->cid; ev->r.conn_login.sid =iscsi_conn_get_sid (conn); -iscsi_multicast_skb (skb,ISCSI_NL_GRP_ISCSID ,GFP_ATOMIC ); + + net =iscsi_conn_net (conn); +iscsi_multicast_skb (net, skb,ISCSI_NL_GRP_ISCSID ,GFP_ATOMIC );iscsi_cls_conn_printk (KERN_INFO , conn,"detected conn login (%d)\n" , state);
@@ -2580,11 +2583,17 @@ void iscsi_post_host_event(uint32_t host_no, struct iscsi_transport *transport, enum iscsi_host_event_code code, uint32_t data_size, uint8_t *data) { + struct Scsi_Host *shost; +struct net *net;struct nlmsghdr *nlh;struct sk_buff *skb;struct iscsi_uevent *ev;int len =nlmsg_total_size (sizeof (*ev) + data_size); + shost =scsi_host_lookup (host_no); +if (!shost) +return ; + skb =alloc_skb (len,GFP_NOIO );if (!skb) { printk(KERN_ERR "gracefully ignored host event (%d):%d OOM\n",
@@ -2603,7 +2612,9 @@ void iscsi_post_host_event(uint32_t host_no, struct iscsi_transport *transport,if (data_size)memcpy ((char *)ev +sizeof (*ev), data, data_size); -iscsi_multicast_skb (skb,ISCSI_NL_GRP_ISCSID ,GFP_NOIO ); + net =iscsi_host_net (shost->shost_data); +scsi_host_put (shost); +iscsi_multicast_skb (net, skb,ISCSI_NL_GRP_ISCSID ,GFP_NOIO ); }EXPORT_SYMBOL_GPL (iscsi_post_host_event);
@@ -2611,11 +2622,17 @@ void iscsi_ping_comp_event(uint32_t host_no, struct iscsi_transport *transport, uint32_t status, uint32_t pid, uint32_t data_size, uint8_t *data) { + struct Scsi_Host *shost; +struct net *net;struct nlmsghdr *nlh;struct sk_buff *skb;struct iscsi_uevent *ev;int len =nlmsg_total_size (sizeof (*ev) + data_size); + shost =scsi_host_lookup (host_no); +if (!shost) +return ; + skb =alloc_skb (len,GFP_NOIO );if (!skb) {printk (KERN_ERR "gracefully ignored ping comp: OOM\n" );
@@ -2632,13 +2649,15 @@ void iscsi_ping_comp_event(uint32_t host_no, struct iscsi_transport *transport, ev->r.ping_comp.data_size = data_size;memcpy ((char *)ev +sizeof (*ev), data, data_size); -iscsi_multicast_skb (skb,ISCSI_NL_GRP_ISCSID ,GFP_NOIO ); + net =iscsi_host_net (shost->shost_data); +scsi_host_put (shost); +iscsi_multicast_skb (net, skb,ISCSI_NL_GRP_ISCSID ,GFP_NOIO ); }EXPORT_SYMBOL_GPL (iscsi_ping_comp_event);static int -iscsi_if_send_reply (uint32_t group,int seq,int type,int done,int multi, -void *payload,int size) +iscsi_if_send_reply (struct net *net,uint32_t group,int seq,int type, +int done,int multi,void *payload,int size) {struct sk_buff *skb;struct nlmsghdr *nlh;
@@ -2655,11 +2674,12 @@ iscsi_if_send_reply(uint32_t group, int seq, int type, int done, int multi, nlh =__nlmsg_put (skb,0 ,0 , t, (len -sizeof (*nlh)),0 ); nlh->nlmsg_flags = flags;memcpy (nlmsg_data (nlh), payload, size); -return iscsi_multicast_skb (skb, group,GFP_ATOMIC ); +return iscsi_multicast_skb (net, skb, group,GFP_ATOMIC ); }static int -iscsi_if_get_stats (struct iscsi_transport *transport,struct nlmsghdr *nlh) +iscsi_if_get_stats (struct net *net,struct iscsi_transport *transport, +struct nlmsghdr *nlh) {struct iscsi_uevent *ev =nlmsg_data (nlh);struct iscsi_stats *stats;
@@ -2716,7 +2736,7 @@ iscsi_if_get_stats(struct iscsi_transport *transport, struct nlmsghdr *nlh)skb_trim (skbstat,NLMSG_ALIGN (actual_size)); nlhstat->nlmsg_len = actual_size; - err =iscsi_multicast_skb (skbstat,ISCSI_NL_GRP_ISCSID , + err =iscsi_multicast_skb (net, skbstat,ISCSI_NL_GRP_ISCSID ,GFP_ATOMIC ); }while (err <0 && err != -ECONNREFUSED );
@@ -2736,6 +2756,7 @@ int iscsi_session_event(struct iscsi_cls_session *session,struct iscsi_uevent *ev;struct sk_buff *skb;struct nlmsghdr *nlh; +struct net *net;int rc, len =nlmsg_total_size (sizeof (*ev)); priv =iscsi_if_transport_lookup (session->transport);
@@ -2780,7 +2801,8 @@ int iscsi_session_event(struct iscsi_cls_session *session,* this will occur if the daemon is not up, so we just warn * the user and when the daemon is restarted it will handle it */ - rc =iscsi_multicast_skb (skb,ISCSI_NL_GRP_ISCSID ,GFP_KERNEL ); + net =iscsi_sess_net (session); + rc =iscsi_multicast_skb (net, skb,ISCSI_NL_GRP_ISCSID ,GFP_KERNEL );if (rc == -ESRCH )iscsi_cls_session_printk (KERN_ERR , session, "Cannot notify userspace of session "
@@ -3103,7 +3125,8 @@ iscsi_send_ping(struct iscsi_transport *transport, struct iscsi_uevent *ev) }static int -iscsi_get_chap (struct iscsi_transport *transport,struct nlmsghdr *nlh) +iscsi_get_chap (struct net *net,struct iscsi_transport *transport, +struct nlmsghdr *nlh) {struct iscsi_uevent *ev =nlmsg_data (nlh);struct Scsi_Host *shost =NULL ;
@@ -3162,7 +3185,7 @@ iscsi_get_chap(struct iscsi_transport *transport, struct nlmsghdr *nlh)skb_trim (skbchap,NLMSG_ALIGN (actual_size)); nlhchap->nlmsg_len = actual_size; - err =iscsi_multicast_skb (skbchap,ISCSI_NL_GRP_ISCSID , + err =iscsi_multicast_skb (net, skbchap,ISCSI_NL_GRP_ISCSID ,GFP_KERNEL ); }while (err <0 && err != -ECONNREFUSED );
@@ -3509,7 +3532,8 @@ static int iscsi_logout_flashnode_sid(struct iscsi_transport *transport, }static int -iscsi_get_host_stats (struct iscsi_transport *transport,struct nlmsghdr *nlh) +iscsi_get_host_stats (struct net *net,struct iscsi_transport *transport, +struct nlmsghdr *nlh) {struct iscsi_uevent *ev =nlmsg_data (nlh);struct Scsi_Host *shost =NULL ;
@@ -3569,8 +3593,8 @@ iscsi_get_host_stats(struct iscsi_transport *transport, struct nlmsghdr *nlh)skb_trim (skbhost_stats,NLMSG_ALIGN (actual_size)); nlhhost_stats->nlmsg_len = actual_size; - err =iscsi_multicast_skb (skbhost_stats,ISCSI_NL_GRP_ISCSID , -GFP_KERNEL ); + err =iscsi_multicast_skb (net, skbhost_stats, +ISCSI_NL_GRP_ISCSID ,GFP_KERNEL ); }while (err <0 && err != -ECONNREFUSED ); exit_host_stats:
@@ -3580,7 +3604,8 @@ iscsi_get_host_stats(struct iscsi_transport *transport, struct nlmsghdr *nlh)static int -iscsi_if_recv_msg (struct sk_buff *skb,struct nlmsghdr *nlh,uint32_t *group) +iscsi_if_recv_msg (struct net *net,struct sk_buff *skb, +struct nlmsghdr *nlh,uint32_t *group) {int err =0 ;struct iscsi_uevent *ev =nlmsg_data (nlh);
@@ -3703,7 +3728,7 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, uint32_t *group) err = -EINVAL ;break ;case ISCSI_UEVENT_GET_STATS : - err =iscsi_if_get_stats (transport, nlh); + err =iscsi_if_get_stats (net, transport, nlh);break ;case ISCSI_UEVENT_TRANSPORT_EP_CONNECT :case ISCSI_UEVENT_TRANSPORT_EP_POLL :
@@ -3728,7 +3753,7 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, uint32_t *group) err =iscsi_send_ping (transport, ev);break ;case ISCSI_UEVENT_GET_CHAP : - err =iscsi_get_chap (transport, nlh); + err =iscsi_get_chap (net, transport, nlh);break ;case ISCSI_UEVENT_DELETE_CHAP : err =iscsi_delete_chap (transport, ev);
@@ -3759,7 +3784,7 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, uint32_t *group) nlmsg_attrlen(nlh, sizeof(*ev)));break ;case ISCSI_UEVENT_GET_HOST_STATS : - err =iscsi_get_host_stats (transport, nlh); + err =iscsi_get_host_stats (net, transport, nlh);break ;default : err = -ENOSYS ;
@@ -3777,6 +3802,9 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, uint32_t *group)static void iscsi_if_rx (struct sk_buff *skb) { +struct sock *sk = skb->sk; +struct net *net =sock_net (sk); +mutex_lock (&rx_queue_mutex);while (skb->len >=NLMSG_HDRLEN ) {int err;
@@ -3796,7 +3824,7 @@ iscsi_if_rx(struct sk_buff *skb)if (rlen > skb->len) rlen = skb->len; - err =iscsi_if_recv_msg (skb, nlh, &group); + err =iscsi_if_recv_msg (net, skb, nlh, &group);if (err) { ev->type =ISCSI_KEVENT_IF_ERROR ; ev->iferror = err;
@@ -3812,7 +3840,9 @@ iscsi_if_rx(struct sk_buff *skb)break ;if (ev->type ==ISCSI_UEVENT_GET_CHAP && !err)break ; - err =iscsi_if_send_reply (group, nlh->nlmsg_seq, +if (ev->type ==ISCSI_UEVENT_GET_HOST_STATS && !err) +break ; + err =iscsi_if_send_reply (net, group, nlh->nlmsg_seq, nlh->nlmsg_type,0 ,0 , ev,sizeof (*ev)); }while (err <0 && err != -ECONNREFUSED && err != -ESRCH );skb_pull (skb, rlen);
Signature · 8 lines
2.9.5 -- You received this message because you are subscribed to the Google Groups "open-iscsi" group. To unsubscribe from this group and stop receiving emails from it, send an email to open-iscsi+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/[email protected] To post to this group, send email to open-iscsi-/JYPxA39Uh5TLH3MbocFF+G/[email protected] Visit this group at https://groups.google.com/group/open-iscsi. For more options, visit https://groups.google.com/d/optout.
Chris Leech
maintainerPATCH 5/9 iscsi: set netns for iscsi_tcp hosts
In reply to Chris LeechThis lets iscsi_tcp operate in multiple namespaces. It uses current during session creation to find the net namespace, but it might be better to manage to pass it along from the iscsi netlink socket.
--- drivers/scsi/iscsi_tcp.c | 7 +++++++ drivers/scsi/scsi_transport_iscsi.c | 7 ++++++- include/scsi/scsi_transport_iscsi.h | 1 + 3 files changed, 14 insertions(+), 1 deletion(-)
drivers/scsi/iscsi_tcp.c +7 -0
@@ -957,6 +957,11 @@ static int iscsi_sw_tcp_slave_configure(struct scsi_device *sdev)return 0 ; } +static struct net *iscsi_sw_tcp_netns (struct Scsi_Host *shost) +{ +return current->nsproxy->net_ns; +} +static struct scsi_host_template iscsi_sw_tcp_sht = { .module =THIS_MODULE , .name ="iSCSI Initiator over TCP/IP" ,
@@ -1013,6 +1018,8 @@ static struct iscsi_transport iscsi_sw_tcp_transport = { .alloc_pdu = iscsi_sw_tcp_pdu_alloc,/* recovery */ .session_recovery_timedout = iscsi_session_recovery_timedout, +/* net namespace */ + .get_netns = iscsi_sw_tcp_netns, };static int __init iscsi_sw_tcp_init (void )
drivers/scsi/scsi_transport_iscsi.c +6 -1
@@ -1600,11 +1600,16 @@ static int iscsi_setup_host(struct transport_container *tc, struct device *dev, {struct Scsi_Host *shost =dev_to_shost (dev);struct iscsi_cls_host *ihost = shost->shost_data; +struct iscsi_internal *priv =to_iscsi_internal (shost->transportt); +struct iscsi_transport *transport = priv->iscsi_transport;memset (ihost,0 ,sizeof (*ihost));atomic_set (&ihost->nr_scans,0 );mutex_init (&ihost->mutex); - ihost->netns = &init_net; +if (transport->get_netns) + ihost->netns = transport->get_netns (shost); +else + ihost->netns = &init_net;iscsi_bsg_host_add (shost, ihost);/* ignore any bsg add error - we just can't do sgio */
include/scsi/scsi_transport_iscsi.h +1 -0
@@ -168,6 +168,7 @@ struct iscsi_transport {int (*logout_flashnode_sid) (struct iscsi_cls_session *cls_sess);int (*get_host_stats) (struct Scsi_Host *shost,char *buf,int len);u8 (*check_protection)(struct iscsi_task *task,sector_t *sector); +struct net *(*get_netns)(struct Scsi_Host *shost); };/*
Signature · 8 lines
2.9.5 -- You received this message because you are subscribed to the Google Groups "open-iscsi" group. To unsubscribe from this group and stop receiving emails from it, send an email to open-iscsi+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/[email protected] To post to this group, send email to open-iscsi-/JYPxA39Uh5TLH3MbocFF+G/[email protected] Visit this group at https://groups.google.com/group/open-iscsi. For more options, visit https://groups.google.com/d/optout.
Chris Leech
maintainerPATCH 6/9 iscsi: check net namespace for all iscsi lookups
In reply to Chris LeechAll internal lookups of iSCSI transport objects need to be filtered by net namespace.
--- drivers/infiniband/ulp/iser/iscsi_iser.c | 5 +- drivers/scsi/be2iscsi/be_iscsi.c | 4 +- drivers/scsi/bnx2i/bnx2i_iscsi.c | 4 +- drivers/scsi/cxgbi/libcxgbi.c | 4 +- drivers/scsi/qedi/qedi_iscsi.c | 4 +- drivers/scsi/qla4xxx/ql4_os.c | 6 +- drivers/scsi/scsi_transport_iscsi.c | 201 +++++++++++++++++++------------ include/scsi/scsi_transport_iscsi.h | 5 +- 8 files changed, 150 insertions(+), 83 deletions(-)
drivers/infiniband/ulp/iser/iscsi_iser.c +4 -1
@@ -464,15 +464,18 @@ iscsi_iser_conn_bind(struct iscsi_cls_session *cls_session,struct iscsi_conn *conn = cls_conn->dd_data;struct iser_conn *iser_conn;struct iscsi_endpoint *ep; +struct net *net;int error; error =iscsi_conn_bind (cls_session, cls_conn, is_leading);if (error)return error; +/* the transport ep handle comes from user space so it must be * verified against the global ib connections list */ - ep =iscsi_lookup_endpoint (transport_eph); + net =iscsi_sess_net (cls_session); + ep =iscsi_lookup_endpoint (net, transport_eph);if (!ep) {iser_err ("can't bind eph %llx\n" , (unsigned long long )transport_eph);
drivers/scsi/be2iscsi/be_iscsi.c +3 -1
@@ -181,8 +181,10 @@ int beiscsi_conn_bind(struct iscsi_cls_session *cls_session,struct beiscsi_endpoint *beiscsi_ep;struct iscsi_endpoint *ep;uint16_t cri_index; +struct net *net; - ep =iscsi_lookup_endpoint (transport_fd); + net =iscsi_sess_net (cls_session); + ep =iscsi_lookup_endpoint (net, transport_fd);if (!ep)return -EINVAL ;
drivers/scsi/bnx2i/bnx2i_iscsi.c +3 -1
@@ -1414,9 +1414,11 @@ static int bnx2i_conn_bind(struct iscsi_cls_session *cls_session,struct bnx2i_hba *hba =iscsi_host_priv (shost);struct bnx2i_endpoint *bnx2i_ep;struct iscsi_endpoint *ep; +struct net *net;int ret_code; - ep =iscsi_lookup_endpoint (transport_fd); + net =iscsi_sess_net (cls_session); + ep =iscsi_lookup_endpoint (net, transport_fd);if (!ep)return -EINVAL ;/*
drivers/scsi/cxgbi/libcxgbi.c +3 -1
@@ -2373,9 +2373,11 @@ int cxgbi_bind_conn(struct iscsi_cls_session *cls_session,struct iscsi_endpoint *ep;struct cxgbi_endpoint *cep;struct cxgbi_sock *csk; +struct net *net;int err; - ep =iscsi_lookup_endpoint (transport_eph); + net =iscsi_sess_net (cls_session); + ep =iscsi_lookup_endpoint (net, transport_eph);if (!ep)return -EINVAL ;
drivers/scsi/qedi/qedi_iscsi.c +3 -1
@@ -381,8 +381,10 @@ static int qedi_conn_bind(struct iscsi_cls_session *cls_session,struct qedi_ctx *qedi =iscsi_host_priv (shost);struct qedi_endpoint *qedi_ep;struct iscsi_endpoint *ep; +struct net *net; - ep =iscsi_lookup_endpoint (transport_fd); + net =iscsi_sess_net (cls_session); + ep =iscsi_lookup_endpoint (net, transport_fd);if (!ep)return -EINVAL ;
drivers/scsi/qla4xxx/ql4_os.c +5 -1
@@ -3178,6 +3178,7 @@ static int qla4xxx_conn_bind(struct iscsi_cls_session *cls_session,struct ddb_entry *ddb_entry;struct scsi_qla_host *ha;struct iscsi_session *sess; +struct net *net; sess = cls_session->dd_data; ddb_entry = sess->dd_data;
@@ -3186,9 +3187,12 @@ static int qla4xxx_conn_bind(struct iscsi_cls_session *cls_session,DEBUG2 (ql4_printk (KERN_INFO , ha,"%s: sid = %d, cid = %d\n" , __func__, cls_session->sid, cls_conn->cid)); + net =iscsi_sess_net (cls_session); + ep =iscsi_lookup_endpoint (net, transport_fd); +if (!ep) +return -EINVAL ;if (iscsi_conn_bind (cls_session, cls_conn, is_leading))return -EINVAL ; - ep =iscsi_lookup_endpoint (transport_fd); conn = cls_conn->dd_data; qla_conn = conn->dd_data; qla_conn->qla_ep = ep->dd_data;
drivers/scsi/scsi_transport_iscsi.c +125 -76
608 lines not on this page · raw message
include/scsi/scsi_transport_iscsi.h +4 -1
@@ -271,6 +271,8 @@ struct iscsi_cls_session {#define iscsi_endpoint_to_shost (_ep) \ dev_to_shost(_ep->dev.parent) +extern struct net *iscsi_sess_net (struct iscsi_cls_session *session); +#define starget_to_session (_stgt) \ iscsi_dev_to_session(_stgt->dev.parent)
@@ -448,7 +450,8 @@ extern int iscsi_scan_finished(struct Scsi_Host *shost, unsigned long time);extern struct iscsi_endpoint *iscsi_create_endpoint (struct Scsi_Host *shost,int dd_size);extern void iscsi_destroy_endpoint (struct iscsi_endpoint *ep); -extern struct iscsi_endpoint *iscsi_lookup_endpoint (u64 handle); +extern struct iscsi_endpoint *iscsi_lookup_endpoint (struct net *net, +u64 handle);extern int iscsi_block_scsi_eh (struct scsi_cmnd *cmd); extern struct iscsi_iface *iscsi_create_iface(struct Scsi_Host *shost, struct iscsi_transport *t,
Signature · 8 lines
2.9.5 -- You received this message because you are subscribed to the Google Groups "open-iscsi" group. To unsubscribe from this group and stop receiving emails from it, send an email to open-iscsi+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/[email protected] To post to this group, send email to open-iscsi-/JYPxA39Uh5TLH3MbocFF+G/[email protected] Visit this group at https://groups.google.com/group/open-iscsi. For more options, visit https://groups.google.com/d/optout.
Chris Leech
maintainerPATCH 7/9 iscsi: convert flashnode devices from bus to class
In reply to Chris LeechThe flashnode session and connection devices should be filtered by net namespace along with the iscsi_host, but we can't do that with a bus device. As these don't use any of the bus matching functionality, they make more sense as a class device anyway.
--- drivers/scsi/qla4xxx/ql4_os.c | 2 +- drivers/scsi/scsi_transport_iscsi.c | 36 +++++++++++++++--------------------- include/scsi/scsi_transport_iscsi.h | 2 ++ 3 files changed, 18 insertions(+), 22 deletions(-)
drivers/scsi/qla4xxx/ql4_os.c +1 -1
@@ -7164,7 +7164,7 @@ static int qla4xxx_sysfs_ddb_is_non_persistent(struct device *dev, void *data) {struct iscsi_bus_flash_session *fnode_sess; -if (!iscsi_flashnode_bus_match (dev,NULL )) +if (!iscsi_is_flashnode_session_dev (dev))return 0 ; fnode_sess =iscsi_dev_to_flash_session (dev);
drivers/scsi/scsi_transport_iscsi.c +15 -21
@@ -1060,6 +1060,12 @@ static const struct device_type iscsi_flashnode_sess_dev_type = { .release = iscsi_flashnode_sess_release, }; +bool iscsi_is_flashnode_session_dev (struct device *dev) +{ +return dev->type == &iscsi_flashnode_sess_dev_type; +} +EXPORT_SYMBOL_GPL (iscsi_is_flashnode_session_dev); +/* flash node connection attrs show */ #define iscsi_flashnode_conn_attr_show (type, name, param) \ static ssize_t \
@@ -1246,20 +1252,8 @@ static const struct device_type iscsi_flashnode_conn_dev_type = { .release = iscsi_flashnode_conn_release, }; -static struct bus_type iscsi_flashnode_bus; - -int iscsi_flashnode_bus_match (struct device *dev, -struct device_driver *drv) -{ -if (dev->bus == &iscsi_flashnode_bus) -return 1 ; -return 0 ; -} -EXPORT_SYMBOL_GPL (iscsi_flashnode_bus_match); - -static struct bus_type iscsi_flashnode_bus = { +static struct class iscsi_flashnode_bus = { .name ="iscsi_flashnode" , - .match = &iscsi_flashnode_bus_match, };/**
@@ -1290,7 +1284,7 @@ iscsi_create_flashnode_sess(struct Scsi_Host *shost, int index, fnode_sess->transport = transport; fnode_sess->target_id = index; fnode_sess->dev.type = &iscsi_flashnode_sess_dev_type; - fnode_sess->dev.bus = &iscsi_flashnode_bus; + fnode_sess->dev.class = &iscsi_flashnode_bus; fnode_sess->dev.parent = &shost->shost_gendev;dev_set_name (&fnode_sess->dev,"flashnode_sess-%u:%u" , shost->host_no, index);
@@ -1338,7 +1332,7 @@ iscsi_create_flashnode_conn(struct Scsi_Host *shost, fnode_conn->transport = transport; fnode_conn->dev.type = &iscsi_flashnode_conn_dev_type; - fnode_conn->dev.bus = &iscsi_flashnode_bus; + fnode_conn->dev.class = &iscsi_flashnode_bus; fnode_conn->dev.parent = &fnode_sess->dev;dev_set_name (&fnode_conn->dev,"flashnode_conn-%u:%u:0" , shost->host_no, fnode_sess->target_id);
@@ -1371,7 +1365,7 @@ EXPORT_SYMBOL_GPL(iscsi_create_flashnode_conn);*/ static int iscsi_is_flashnode_conn_dev (struct device *dev,void *data) { -return dev->bus == &iscsi_flashnode_bus; +return dev->type == &iscsi_flashnode_conn_dev_type; }static int iscsi_destroy_flashnode_conn (struct iscsi_bus_flash_conn *fnode_conn)
@@ -1385,7 +1379,7 @@ static int flashnode_match_index(struct device *dev, void *data)struct iscsi_bus_flash_session *fnode_sess =NULL ;int ret =0 ; -if (!iscsi_flashnode_bus_match (dev,NULL )) +if (dev->type != &iscsi_flashnode_sess_dev_type) goto exit_match_index; fnode_sess =iscsi_dev_to_flash_session (dev);
@@ -1491,7 +1485,7 @@ EXPORT_SYMBOL_GPL(iscsi_destroy_flashnode_sess);static int iscsi_iter_destroy_flashnode_fn (struct device *dev,void *data) { -if (!iscsi_flashnode_bus_match (dev,NULL )) +if (dev->type != &iscsi_flashnode_sess_dev_type)return 0 ;iscsi_destroy_flashnode_sess (iscsi_dev_to_flash_session (dev));
@@ -4752,7 +4746,7 @@ static __init int iscsi_transport_init(void)if (err) goto unregister_conn_class; - err =bus_register (&iscsi_flashnode_bus); + err =class_register (&iscsi_flashnode_bus);if (err) goto unregister_session_class;
@@ -4773,7 +4767,7 @@ static __init int iscsi_transport_init(void) unregister_pernet_subsys:unregister_pernet_subsys (&iscsi_net_ops); unregister_flashnode_bus: -bus_unregister (&iscsi_flashnode_bus); +class_unregister (&iscsi_flashnode_bus); unregister_session_class:transport_class_unregister (&iscsi_session_class); unregister_conn_class:
@@ -4793,7 +4787,7 @@ static void __exit iscsi_transport_exit(void) {destroy_workqueue (iscsi_eh_timer_workq);unregister_pernet_subsys (&iscsi_net_ops); -bus_unregister (&iscsi_flashnode_bus); +class_unregister (&iscsi_flashnode_bus);transport_class_unregister (&iscsi_connection_class);transport_class_unregister (&iscsi_session_class);transport_class_unregister (&iscsi_host_class);
include/scsi/scsi_transport_iscsi.h +2 -0
@@ -489,6 +489,8 @@ iscsi_find_flashnode_sess(struct Scsi_Host *shost, void *data,extern struct device *iscsi_find_flashnode_conn (struct iscsi_bus_flash_session *fnode_sess); +extern bool iscsi_is_flashnode_session_dev (struct device *dev); +extern char *iscsi_get_ipaddress_state_name (enum iscsi_ipaddress_state port_state);extern char *iscsi_get_router_state_name (enum iscsi_router_state router_state);
Signature · 8 lines
2.9.5 -- You received this message because you are subscribed to the Google Groups "open-iscsi" group. To unsubscribe from this group and stop receiving emails from it, send an email to open-iscsi+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/[email protected] To post to this group, send email to open-iscsi-/JYPxA39Uh5TLH3MbocFF+G/[email protected] Visit this group at https://groups.google.com/group/open-iscsi. For more options, visit https://groups.google.com/d/optout.
Chris Leech
maintainerPATCH 8/9 iscsi: rename iscsi_bus_flash_* to iscsi_flash_*
In reply to Chris Leechcleanups after the bus to class conversion
--- drivers/scsi/qla4xxx/ql4_os.c | 52 +++++++++--------- drivers/scsi/scsi_transport_iscsi.c | 102 ++++++++++++++++++------------------ include/scsi/scsi_transport_iscsi.h | 48 +++++++++-------- 3 files changed, 102 insertions(+), 100 deletions(-)
drivers/scsi/qla4xxx/ql4_os.c +26 -26
@@ -169,20 +169,20 @@ static int qla4xxx_host_reset(struct Scsi_Host *shost, int reset_type);* iSCSI Flash DDB sysfs entry points */ static int -qla4xxx_sysfs_ddb_set_param (struct iscsi_bus_flash_session *fnode_sess, -struct iscsi_bus_flash_conn *fnode_conn, +qla4xxx_sysfs_ddb_set_param (struct iscsi_flash_session *fnode_sess, +struct iscsi_flash_conn *fnode_conn,void *data,int len);static int -qla4xxx_sysfs_ddb_get_param (struct iscsi_bus_flash_session *fnode_sess, +qla4xxx_sysfs_ddb_get_param (struct iscsi_flash_session *fnode_sess,int param,char *buf);static int qla4xxx_sysfs_ddb_add (struct Scsi_Host *shost,const char *buf,int len);static int -qla4xxx_sysfs_ddb_delete (struct iscsi_bus_flash_session *fnode_sess); -static int qla4xxx_sysfs_ddb_login (struct iscsi_bus_flash_session *fnode_sess, -struct iscsi_bus_flash_conn *fnode_conn); -static int qla4xxx_sysfs_ddb_logout (struct iscsi_bus_flash_session *fnode_sess, -struct iscsi_bus_flash_conn *fnode_conn); +qla4xxx_sysfs_ddb_delete (struct iscsi_flash_session *fnode_sess); +static int qla4xxx_sysfs_ddb_login (struct iscsi_flash_session *fnode_sess, +struct iscsi_flash_conn *fnode_conn); +static int qla4xxx_sysfs_ddb_logout (struct iscsi_flash_session *fnode_sess, +struct iscsi_flash_conn *fnode_conn);static int qla4xxx_sysfs_ddb_logout_sid (struct iscsi_cls_session *cls_sess); static struct qla4_8xxx_legacy_intr_set legacy_intr[] =
@@ -3454,8 +3454,8 @@ static int qla4xxx_task_xmit(struct iscsi_task *task)return -ENOSYS ; } -static int qla4xxx_copy_from_fwddb_param (struct iscsi_bus_flash_session *sess, -struct iscsi_bus_flash_conn *conn, +static int qla4xxx_copy_from_fwddb_param (struct iscsi_flash_session *sess, +struct iscsi_flash_conn *conn,struct dev_db_entry *fw_ddb_entry) {unsigned long options =0 ;
@@ -3596,8 +3596,8 @@ static int qla4xxx_copy_from_fwddb_param(struct iscsi_bus_flash_session *sess,return rc; } -static int qla4xxx_copy_to_fwddb_param (struct iscsi_bus_flash_session *sess, -struct iscsi_bus_flash_conn *conn, +static int qla4xxx_copy_to_fwddb_param (struct iscsi_flash_session *sess, +struct iscsi_flash_conn *conn,struct dev_db_entry *fw_ddb_entry) {uint16_t options;
@@ -7162,7 +7162,7 @@ static void qla4xxx_build_new_nt_list(struct scsi_qla_host *ha,**/ static int qla4xxx_sysfs_ddb_is_non_persistent (struct device *dev,void *data) { -struct iscsi_bus_flash_session *fnode_sess; +struct iscsi_flash_session *fnode_sess;if (!iscsi_is_flashnode_session_dev (dev))return 0 ;
@@ -7192,8 +7192,8 @@ static int qla4xxx_sysfs_ddb_tgt_create(struct scsi_qla_host *ha,struct dev_db_entry *fw_ddb_entry, uint16_t *idx, int user) { - struct iscsi_bus_flash_session *fnode_sess = NULL; -struct iscsi_bus_flash_conn *fnode_conn =NULL ; + struct iscsi_flash_session *fnode_sess = NULL; +struct iscsi_flash_conn *fnode_conn =NULL ;int rc =QLA_ERROR ; fnode_sess = iscsi_create_flashnode_sess(ha->host, *idx,
@@ -7330,8 +7330,8 @@ static int qla4xxx_sysfs_ddb_add(struct Scsi_Host *shost, const char *buf,* This writes the contents of target ddb buffer to Flash with a valid cookie * value in order to make the ddb entry persistent. **/ -static int qla4xxx_sysfs_ddb_apply (struct iscsi_bus_flash_session *fnode_sess, -struct iscsi_bus_flash_conn *fnode_conn) +static int qla4xxx_sysfs_ddb_apply (struct iscsi_flash_session *fnode_sess, +struct iscsi_flash_conn *fnode_conn) {struct Scsi_Host *shost =iscsi_flash_session_to_shost (fnode_sess);struct scsi_qla_host *ha =to_qla_host (shost);
@@ -7520,8 +7520,8 @@ static int qla4xxx_ddb_login_nt(struct scsi_qla_host *ha,* * This logs in to the specified target **/ -static int qla4xxx_sysfs_ddb_login (struct iscsi_bus_flash_session *fnode_sess, -struct iscsi_bus_flash_conn *fnode_conn) +static int qla4xxx_sysfs_ddb_login (struct iscsi_flash_session *fnode_sess, +struct iscsi_flash_conn *fnode_conn) {struct Scsi_Host *shost =iscsi_flash_session_to_shost (fnode_sess);struct scsi_qla_host *ha =to_qla_host (shost);
@@ -7704,8 +7704,8 @@ static int qla4xxx_sysfs_ddb_logout_sid(struct iscsi_cls_session *cls_sess)* * This performs log out from the specified target **/ -static int qla4xxx_sysfs_ddb_logout (struct iscsi_bus_flash_session *fnode_sess, -struct iscsi_bus_flash_conn *fnode_conn) +static int qla4xxx_sysfs_ddb_logout (struct iscsi_flash_session *fnode_sess, +struct iscsi_flash_conn *fnode_conn) {struct Scsi_Host *shost =iscsi_flash_session_to_shost (fnode_sess);struct scsi_qla_host *ha =to_qla_host (shost);
@@ -7816,12 +7816,12 @@ static int qla4xxx_sysfs_ddb_logout(struct iscsi_bus_flash_session *fnode_sess, }static int -qla4xxx_sysfs_ddb_get_param (struct iscsi_bus_flash_session *fnode_sess, +qla4xxx_sysfs_ddb_get_param (struct iscsi_flash_session *fnode_sess,int param,char *buf) {struct Scsi_Host *shost =iscsi_flash_session_to_shost (fnode_sess);struct scsi_qla_host *ha =to_qla_host (shost); -struct iscsi_bus_flash_conn *fnode_conn; +struct iscsi_flash_conn *fnode_conn;struct ql4_chap_table chap_tbl;struct device *dev;int parent_type;
@@ -8070,8 +8070,8 @@ qla4xxx_sysfs_ddb_get_param(struct iscsi_bus_flash_session *fnode_sess,* This sets the parameter of flash ddb entry and writes them to flash **/ static int -qla4xxx_sysfs_ddb_set_param (struct iscsi_bus_flash_session *fnode_sess, -struct iscsi_bus_flash_conn *fnode_conn, +qla4xxx_sysfs_ddb_set_param (struct iscsi_flash_session *fnode_sess, +struct iscsi_flash_conn *fnode_conn,void *data,int len) {struct Scsi_Host *shost =iscsi_flash_session_to_shost (fnode_sess);
@@ -8298,7 +8298,7 @@ qla4xxx_sysfs_ddb_set_param(struct iscsi_bus_flash_session *fnode_sess,* * This invalidates the flash ddb entry at the given index **/ -static int qla4xxx_sysfs_ddb_delete (struct iscsi_bus_flash_session *fnode_sess) +static int qla4xxx_sysfs_ddb_delete (struct iscsi_flash_session *fnode_sess) {struct Scsi_Host *shost =iscsi_flash_session_to_shost (fnode_sess);struct scsi_qla_host *ha =to_qla_host (shost);
drivers/scsi/scsi_transport_iscsi.c +51 -51
268 lines not on this page · raw message
include/scsi/scsi_transport_iscsi.h +25 -23
103 lines not on this page · raw message
Signature · 1 line
2.9.5
Chris Leech
maintainerPATCH 9/9 iscsi: filter flashnode sysfs by net namespace
In reply to Chris LeechFinished the net namespace support for flashnode sysfs devices
--- drivers/scsi/scsi_transport_iscsi.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+)
drivers/scsi/scsi_transport_iscsi.c +33 -0
@@ -1268,8 +1268,41 @@ static int iscsi_is_flashnode_conn_dev(struct device *dev, void *data)return dev->type == &iscsi_flashnode_conn_dev_type; } +static struct net *iscsi_flashnode_sess_net (struct iscsi_flash_session *f_sess) +{ +struct Scsi_Host *shost =iscsi_flash_session_to_shost (f_sess); +struct iscsi_cls_host *ihost = shost->shost_data; + +return iscsi_host_net (ihost); +} + +static struct net *iscsi_flashnode_conn_net (struct iscsi_flash_conn *f_conn) +{ +struct iscsi_flash_session *f_sess = +iscsi_flash_conn_to_flash_session (f_conn); + +return iscsi_flashnode_sess_net (f_sess); +} + +static const void *iscsi_flashnode_namespace (struct device *dev) +{ +struct iscsi_flash_conn *f_conn; +struct iscsi_flash_session *f_sess; + +if (iscsi_is_flashnode_conn_dev (dev,NULL )) { + f_conn =iscsi_dev_to_flash_conn (dev); +return iscsi_flashnode_conn_net (f_conn); + }else if (iscsi_is_flashnode_session_dev (dev)) { + f_sess =iscsi_dev_to_flash_session (dev); +return iscsi_flashnode_sess_net (f_sess); + } +return NULL ; +} +static struct class iscsi_flashnode = { .name ="iscsi_flashnode" , + .ns_type = &net_ns_type_operations, + .namespace = iscsi_flashnode_namespace, };/**
Signature · 8 lines
2.9.5 -- You received this message because you are subscribed to the Google Groups "open-iscsi" group. To unsubscribe from this group and stop receiving emails from it, send an email to open-iscsi+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/[email protected] To post to this group, send email to open-iscsi-/JYPxA39Uh5TLH3MbocFF+G/[email protected] Visit this group at https://groups.google.com/group/open-iscsi. For more options, visit https://groups.google.com/d/optout.
Chris Leech
maintainerAnyone have comments or criticisms? Lee?
Suggestions on anyone else I should be pinging for feedback? These changes are in the iSCSI code, but are all netlink and sysfs related namespace issues so I get that it's not a typical SCSI review.
- Chris
Quoted 45 lines · Chris Leech
This series of changes makes the iSCSI netlink and sysfs control interfaces filtered by network namespace. This is required to run iscsid in any network namespace other than the initial default one.
Currently the netlink communication will fail if iscsid is started in a non-default network namespace, as there is no kernel side socket. After fixing that, the rest of these changes are to filter visibility of the iSCSI transport objects by netns. This allows for multiple iscsid instances to be run, one per netns, each controlling it's own set of iSCSI sessions.
The iSCSI transport objects are filtered, but not the SCSI or block layer devices. So while iSCSI hosts and sessions become limited to a network namespace, any attached devices remain visible system wide.
This currently only supports
iscsi_tcprunning in a new namespace, as it creates a virtual host per session. Support could be added later to allow assignment of iSCSI HBAs to network namespace, much as is done for network interfaces.Chris Leech (9):
iscsi: create per-net iscsi netlink kernel sockets
iscsi: associate endpoints with a host
iscsi: sysfs filtering by network namespace
iscsi: make all iSCSI netlink multicast namespace aware
iscsi: set netns foriscsi_tcphosts
iscsi: check net namespace for all iscsi lookups
iscsi: convert flashnode devices from bus to class
iscsi: rename iscsi_bus_flash_* to iscsi_flash_*
iscsi: filter flashnode sysfs by net namespacedrivers/infiniband/ulp/iser/iscsi_iser.c | 7 +- drivers/scsi/be2iscsi/be_iscsi.c | 6 +- drivers/scsi/bnx2i/bnx2i_iscsi.c | 6 +- drivers/scsi/cxgbi/libcxgbi.c | 6 +- drivers/scsi/iscsi_tcp.c | 7 + drivers/scsi/qedi/qedi_iscsi.c | 6 +- drivers/scsi/qla4xxx/ql4_os.c | 62 +-- drivers/scsi/scsi_transport_iscsi.c | 625 ++++++++++++++++++++++--------- include/scsi/scsi_transport_iscsi.h | 63 ++-- 9 files changed, 538 insertions(+), 250 deletions(-)Signature · 1 line
2.9.5
Chris Leech
maintainernetwork namespace, netlink and sysfs changes for iSCSI (Re: [PATCH 0/9] use network namespace for iSCSI control interfaces)
In reply to Chris LeechHello,
I have this set of changes to the iSCSI control interfaces pending review, but seeing as it's sysfs and netlink changes there's not a lot of feedback from linux-scsi.
I was hoping I could get a brief review on the adding of network namespace support here.
Thank you,
Chris
Quoted 45 lines · Chris Leech
This series of changes makes the iSCSI netlink and sysfs control interfaces filtered by network namespace. This is required to run iscsid in any network namespace other than the initial default one.
Currently the netlink communication will fail if iscsid is started in a non-default network namespace, as there is no kernel side socket. After fixing that, the rest of these changes are to filter visibility of the iSCSI transport objects by netns. This allows for multiple iscsid instances to be run, one per netns, each controlling it's own set of iSCSI sessions.
The iSCSI transport objects are filtered, but not the SCSI or block layer devices. So while iSCSI hosts and sessions become limited to a network namespace, any attached devices remain visible system wide.
This currently only supports
iscsi_tcprunning in a new namespace, as it creates a virtual host per session. Support could be added later to allow assignment of iSCSI HBAs to network namespace, much as is done for network interfaces.Chris Leech (9):
iscsi: create per-net iscsi netlink kernel sockets
iscsi: associate endpoints with a host
iscsi: sysfs filtering by network namespace
iscsi: make all iSCSI netlink multicast namespace aware
iscsi: set netns foriscsi_tcphosts
iscsi: check net namespace for all iscsi lookups
iscsi: convert flashnode devices from bus to class
iscsi: rename iscsi_bus_flash_* to iscsi_flash_*
iscsi: filter flashnode sysfs by net namespacedrivers/infiniband/ulp/iser/iscsi_iser.c | 7 +- drivers/scsi/be2iscsi/be_iscsi.c | 6 +- drivers/scsi/bnx2i/bnx2i_iscsi.c | 6 +- drivers/scsi/cxgbi/libcxgbi.c | 6 +- drivers/scsi/iscsi_tcp.c | 7 + drivers/scsi/qedi/qedi_iscsi.c | 6 +- drivers/scsi/qla4xxx/ql4_os.c | 62 +-- drivers/scsi/scsi_transport_iscsi.c | 625 ++++++++++++++++++++++--------- include/scsi/scsi_transport_iscsi.h | 63 ++-- 9 files changed, 538 insertions(+), 250 deletions(-)Signature · 1 line
2.9.5
A message that is not in the archive (sent off-list or not yet received): 20171107180156.GD29597-r8IHplWLGbA5tHQWs+pTeqPFFGjUI2lm2LY78lusg7I@public.gmane.org
Re: network namespace, netlink and sysfs changes for iSCSI (Re: [PATCH 0/9] use network namespace for iSCSI control interfaces)
Quoted 8 lines · Chris Leech
Hello,
I have this set of changes to the iSCSI control interfaces pending review, but seeing as it's sysfs and netlink changes there's not a lot of feedback from linux-scsi.
I was hoping I could get a brief review on the adding of network namespace support here.
Where is "here"? I don't see any patches "here" to review :(
And no, I'm not on the scsi mailing lists :)
thanks,
greg k-h
Signature · 5 lines
You received this message because you are subscribed to the Google Groups "open-iscsi" group. To unsubscribe from this group and stop receiving emails from it, send an email to open-iscsi+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/[email protected] To post to this group, send email to open-iscsi-/JYPxA39Uh5TLH3MbocFF+G/[email protected] Visit this group at https://groups.google.com/group/open-iscsi. For more options, visit https://groups.google.com/d/optout.
cover use network namespace for iSCSI control interfaces
In reply to a message not in the archiveHello,
I've posted these changes to allow iSCSI management within a container using a network namespace to the SCSI and Open-iSCSI lists, but seeing as it's not really SCSI/block related I'm casting a wider net looking for reviews.
These patches apply network namespace to the iSCSI netlink family and sysfs objects from the iSCSI transport class.
Thank you,
Chris Leech
---
This series of changes makes the iSCSI netlink and sysfs control interfaces filtered by network namespace. This is required to run iscsid in any network namespace other than the initial default one.
Currently the netlink communication will fail if iscsid is started in a non-default network namespace, as there is no kernel side socket. After fixing that, the rest of these changes are to filter visibility of the iSCSI transport objects by netns. This allows for multiple iscsid instances to be run, one per netns, each controlling it's own set of iSCSI sessions.
The iSCSI transport objects are filtered, but not the SCSI or block layer devices. So while iSCSI hosts and sessions become limited to a network namespace, any attached devices remain visible system wide.
This currently only supports iscsi_tcp running in a new namespace, as it creates a virtual host per session. Support could be added later to allow assignment of iSCSI HBAs to network namespace, much as is done for network interfaces.
Chris Leech (9):
iscsi: create per-net iscsi netlink kernel sockets
iscsi: associate endpoints with a host
iscsi: sysfs filtering by network namespace
iscsi: make all iSCSI netlink multicast namespace aware
iscsi: set netns for iscsi_tcp hosts
iscsi: check net namespace for all iscsi lookups
iscsi: convert flashnode devices from bus to class
iscsi: rename iscsi_bus_flash_* to iscsi_flash_*
iscsi: filter flashnode sysfs by net namespace
drivers/infiniband/ulp/iser/iscsi_iser.c | 7 +- drivers/scsi/be2iscsi/be_iscsi.c | 6 +- drivers/scsi/bnx2i/bnx2i_iscsi.c | 6 +- drivers/scsi/cxgbi/libcxgbi.c | 6 +- drivers/scsi/iscsi_tcp.c | 7 + drivers/scsi/qedi/qedi_iscsi.c | 6 +- drivers/scsi/qla4xxx/ql4_os.c | 62 +-- drivers/scsi/scsi_transport_iscsi.c | 625 ++++++++++++++++++++++--------- include/scsi/scsi_transport_iscsi.h | 63 ++-- 9 files changed, 538 insertions(+), 250 deletions(-)
Signature · 1 line
2.9.5
A message that is not in the archive (sent off-list or not yet received): 20171107224513.4217-1-cleech-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org
PATCH 1/9 iscsi: create per-net iscsi netlink kernel sockets
Prepare iSCSI netlink to operate in multiple namespaces.
--- drivers/scsi/scsi_transport_iscsi.c | 67 +++++++++++++++++++++++++++++++------ 1 file changed, 57 insertions(+), 10 deletions(-)
drivers/scsi/scsi_transport_iscsi.c +57 -10
@@ -26,6 +26,8 @@#include <linux/bsg-lib.h> #include <linux/idr.h> #include <net/tcp.h> +#include <net/net_namespace.h> +#include <net/netns/generic.h> #include <scsi/scsi.h> #include <scsi/scsi_host.h> #include <scsi/scsi_device.h>
@@ -1601,7 +1603,11 @@ static DECLARE_TRANSPORT_CLASS(iscsi_connection_class,NULL , NULL); -static struct sock *nls; +struct iscsi_net { +struct sock *nls; +}; + +static int iscsi_net_id__read_mostly ;static DEFINE_MUTEX (rx_queue_mutex);static LIST_HEAD (sesslist);
@@ -2317,11 +2323,23 @@ iscsi_if_transport_lookup(struct iscsi_transport *tt) }static int -iscsi_multicast_skb (struct sk_buff *skb,uint32_t group,gfp_t gfp) +iscsi_multicast_netns (struct net *net,struct sk_buff *skb, +uint32_t group,gfp_t gfp) { +struct sock *nls; +struct iscsi_net *isn; + + isn =net_generic (net, iscsi_net_id); + nls = isn->nls;return nlmsg_multicast (nls, skb,0 , group, gfp); } +static int +iscsi_multicast_skb (struct sk_buff *skb,uint32_t group,gfp_t gfp) +{ +return iscsi_multicast_netns (&init_net, skb, group, gfp); +} +int iscsi_recv_pdu (struct iscsi_cls_conn *conn,struct iscsi_hdr *hdr,char *data,uint32_t data_size) {
@@ -4490,13 +4508,42 @@ int iscsi_unregister_transport(struct iscsi_transport *tt) }EXPORT_SYMBOL_GPL (iscsi_unregister_transport); -static __init int iscsi_transport_init (void ) +static int __net_init iscsi_net_init (struct net *net) { -int err; +struct sock *nls; +struct iscsi_net *isn;struct netlink_kernel_cfg cfg = { .groups =1 , .input = iscsi_if_rx, }; + + nls =netlink_kernel_create (net,NETLINK_ISCSI , &cfg); +if (!nls) +return -ENOMEM ; + isn =net_generic (net, iscsi_net_id); + isn->nls = nls; +return 0 ; +} + +static void __net_exit iscsi_net_exit(struct net *net) +{ +struct iscsi_net *isn; + + isn =net_generic (net, iscsi_net_id); +netlink_kernel_release (isn->nls); + isn->nls =NULL ; +} + +static struct pernet_operations iscsi_net_ops = { + .init = iscsi_net_init, + .exit = iscsi_net_exit, + .id = &iscsi_net_id, + .size =sizeof (struct iscsi_net ), +}; + +static __init int iscsi_transport_init (void ) +{ +int err;printk (KERN_INFO "Loading iSCSI transport class v%s.\n" ,ISCSI_TRANSPORT_VERSION );
@@ -4530,8 +4577,8 @@ static __init int iscsi_transport_init(void)if (err) goto unregister_session_class; - nls =netlink_kernel_create (&init_net,NETLINK_ISCSI , &cfg); -if (!nls) { + err =register_pernet_subsys (&iscsi_net_ops); +if (err) { err = -ENOBUFS ; goto unregister_flashnode_bus; }
@@ -4539,13 +4586,13 @@ static __init int iscsi_transport_init(void) iscsi_eh_timer_workq =create_singlethread_workqueue ("iscsi_eh" );if (!iscsi_eh_timer_workq) { err = -ENOMEM ; - goto release_nls; + goto unregister_pernet_subsys; }return 0 ; -release_nls: -netlink_kernel_release (nls); +unregister_pernet_subsys: +unregister_pernet_subsys (&iscsi_net_ops); unregister_flashnode_bus:bus_unregister (&iscsi_flashnode_bus); unregister_session_class:
@@ -4566,7 +4613,7 @@ static __init int iscsi_transport_init(void) static void __exit iscsi_transport_exit(void) {destroy_workqueue (iscsi_eh_timer_workq); -netlink_kernel_release (nls); +unregister_pernet_subsys (&iscsi_net_ops);bus_unregister (&iscsi_flashnode_bus);transport_class_unregister (&iscsi_connection_class);transport_class_unregister (&iscsi_session_class);
Signature · 1 line
2.9.5
PATCH 2/9 iscsi: associate endpoints with a host
In reply to a message not in the archiveRight now the iscsi_endpoint is only linked to a connection once that connection has been established. For net namespace filtering of the sysfs objects, associate an endpoint with the host that it was allocated for when it is created.
--- drivers/infiniband/ulp/iser/iscsi_iser.c | 2 +- drivers/scsi/be2iscsi/be_iscsi.c | 2 +- drivers/scsi/bnx2i/bnx2i_iscsi.c | 2 +- drivers/scsi/cxgbi/libcxgbi.c | 2 +- drivers/scsi/qedi/qedi_iscsi.c | 2 +- drivers/scsi/qla4xxx/ql4_os.c | 2 +- drivers/scsi/scsi_transport_iscsi.c | 3 ++- include/scsi/scsi_transport_iscsi.h | 6 +++++- 8 files changed, 13 insertions(+), 8 deletions(-)
drivers/infiniband/ulp/iser/iscsi_iser.c +1 -1
@@ -817,7 +817,7 @@ iscsi_iser_ep_connect(struct Scsi_Host *shost, struct sockaddr *dst_addr,struct iser_conn *iser_conn;struct iscsi_endpoint *ep; - ep =iscsi_create_endpoint (0 ); + ep =iscsi_create_endpoint (shost,0 );if (!ep)return ERR_PTR (-ENOMEM );
drivers/scsi/be2iscsi/be_iscsi.c +1 -1
@@ -1157,7 +1157,7 @@ beiscsi_ep_connect(struct Scsi_Host *shost, struct sockaddr *dst_addr,return ERR_PTR (ret); } - ep =iscsi_create_endpoint (sizeof (struct beiscsi_endpoint )); + ep =iscsi_create_endpoint (shost,sizeof (struct beiscsi_endpoint ));if (!ep) { ret = -ENOMEM ;return ERR_PTR (ret);
drivers/scsi/bnx2i/bnx2i_iscsi.c +1 -1
@@ -384,7 +384,7 @@ static struct iscsi_endpoint *bnx2i_alloc_ep(struct bnx2i_hba *hba)struct bnx2i_endpoint *bnx2i_ep;u32 ec_div; - ep =iscsi_create_endpoint (sizeof (*bnx2i_ep)); + ep =iscsi_create_endpoint (hba->shost,sizeof (*bnx2i_ep));if (!ep) {printk (KERN_ERR "bnx2i: Could not allocate ep\n" );return NULL ;
drivers/scsi/cxgbi/libcxgbi.c +1 -1
@@ -2616,7 +2616,7 @@ struct iscsi_endpoint *cxgbi_ep_connect(struct Scsi_Host *shost, goto release_conn; } - ep =iscsi_create_endpoint (sizeof (*cep)); + ep =iscsi_create_endpoint (shost,sizeof (*cep));if (!ep) { err = -ENOMEM ;pr_info ("iscsi alloc ep, OOM.\n" );
drivers/scsi/qedi/qedi_iscsi.c +1 -1
@@ -847,7 +847,7 @@ qedi_ep_connect(struct Scsi_Host *shost, struct sockaddr *dst_addr,return ERR_PTR (ret); } - ep =iscsi_create_endpoint (sizeof (struct qedi_endpoint )); + ep =iscsi_create_endpoint (shost,sizeof (struct qedi_endpoint ));if (!ep) {QEDI_ERR (&qedi->dbg_ctx,"endpoint create fail\n" ); ret = -ENOMEM ;
drivers/scsi/qla4xxx/ql4_os.c +1 -1
@@ -1673,7 +1673,7 @@ qla4xxx_ep_connect(struct Scsi_Host *shost, struct sockaddr *dst_addr, } ha =iscsi_host_priv (shost); - ep =iscsi_create_endpoint (sizeof (struct qla_endpoint )); + ep =iscsi_create_endpoint (shost,sizeof (struct qla_endpoint ));if (!ep) { ret = -ENOMEM ;return ERR_PTR (ret);
drivers/scsi/scsi_transport_iscsi.c +2 -1
@@ -194,7 +194,7 @@ static int iscsi_match_epid(struct device *dev, const void *data) }struct iscsi_endpoint * -iscsi_create_endpoint (int dd_size) +iscsi_create_endpoint (struct Scsi_Host *shost,int dd_size) {struct device *dev;struct iscsi_endpoint *ep;
@@ -221,6 +221,7 @@ iscsi_create_endpoint(int dd_size) ep->id = id; ep->dev.class = &iscsi_endpoint_class; + ep->dev.parent = &shost->shost_gendev;dev_set_name (&ep->dev,"ep-%llu" , (unsigned long long ) id); err =device_register (&ep->dev);if (err)
include/scsi/scsi_transport_iscsi.h +5 -1
@@ -267,6 +267,9 @@ struct iscsi_cls_session {#define iscsi_session_to_shost (_session) \ dev_to_shost(_session->dev.parent) +#define iscsi_endpoint_to_shost (_ep) \ + dev_to_shost(_ep->dev.parent) +#define starget_to_session (_stgt) \ iscsi_dev_to_session(_stgt->dev.parent)
@@ -440,7 +443,8 @@ extern int iscsi_destroy_conn(struct iscsi_cls_conn *conn);extern void iscsi_unblock_session (struct iscsi_cls_session *session);extern void iscsi_block_session (struct iscsi_cls_session *session);extern int iscsi_scan_finished (struct Scsi_Host *shost,unsigned long time); -extern struct iscsi_endpoint *iscsi_create_endpoint (int dd_size); +extern struct iscsi_endpoint *iscsi_create_endpoint (struct Scsi_Host *shost, +int dd_size);extern void iscsi_destroy_endpoint (struct iscsi_endpoint *ep);extern struct iscsi_endpoint *iscsi_lookup_endpoint (u64 handle);extern int iscsi_block_scsi_eh (struct scsi_cmnd *cmd);
Signature · 1 line
2.9.5
PATCH 3/9 iscsi: sysfs filtering by network namespace
In reply to a message not in the archiveThis makes the iscsi_host, iscsi_session, iscsi_connection, iscsi_iface, and iscsi_endpoint transport class devices only visible in sysfs under a matching network namespace. The network namespace for all of these objects is tracked in the iscsi_cls_host structure.
--- drivers/scsi/scsi_transport_iscsi.c | 128 +++++++++++++++++++++++++++++++----- include/scsi/scsi_transport_iscsi.h | 1 + 2 files changed, 112 insertions(+), 17 deletions(-)
drivers/scsi/scsi_transport_iscsi.c +111 -17
@@ -161,9 +161,31 @@ static void iscsi_endpoint_release(struct device *dev)kfree (ep); } +static struct net *iscsi_host_net (struct iscsi_cls_host *ihost) +{ +return ihost->netns; +} + +static struct net *iscsi_endpoint_net (struct iscsi_endpoint *ep) +{ +struct Scsi_Host *shost =iscsi_endpoint_to_shost (ep); +struct iscsi_cls_host *ihost = shost->shost_data; + +return iscsi_host_net (ihost); +} + +static const void *iscsi_endpoint_namespace (struct device *dev) +{ +struct iscsi_endpoint *ep =iscsi_dev_to_endpoint (dev); + +return iscsi_endpoint_net (ep); +} +static struct class iscsi_endpoint_class = { .name ="iscsi_endpoint" , .dev_release = iscsi_endpoint_release, + .ns_type = &net_ns_type_operations, + .namespace = iscsi_endpoint_namespace, }; static ssize_t
@@ -285,10 +307,26 @@ static void iscsi_iface_release(struct device *dev)put_device (parent); } +static struct net *iscsi_iface_net (struct iscsi_iface *iface) +{ +struct Scsi_Host *shost =iscsi_iface_to_shost (iface); +struct iscsi_cls_host *ihost = shost->shost_data; + +return iscsi_host_net (ihost); +} + +static const void *iscsi_iface_namespace (struct device *dev) +{ +struct iscsi_iface *iface =iscsi_dev_to_iface (dev); + +return iscsi_iface_net (iface); +}static struct class iscsi_iface_class = { .name ="iscsi_iface" , .dev_release = iscsi_iface_release, + .ns_type = &net_ns_type_operations, + .namespace = iscsi_iface_namespace, };#define ISCSI_IFACE_ATTR (_prefix, _name, _mode, _show, _store) \
@@ -1566,6 +1604,7 @@ static int iscsi_setup_host(struct transport_container *tc, struct device *dev,memset (ihost,0 ,sizeof (*ihost));atomic_set (&ihost->nr_scans,0 );mutex_init (&ihost->mutex); + ihost->netns = &init_net;iscsi_bsg_host_add (shost, ihost);/* ignore any bsg add error - we just can't do sgio */
@@ -1586,23 +1625,78 @@ static int iscsi_remove_host(struct transport_container *tc,return 0 ; } -static DECLARE_TRANSPORT_CLASS(iscsi_host_class, -"iscsi_host" , - iscsi_setup_host, - iscsi_remove_host, - NULL); - -static DECLARE_TRANSPORT_CLASS(iscsi_session_class, -"iscsi_session" , -NULL , -NULL , - NULL); - -static DECLARE_TRANSPORT_CLASS(iscsi_connection_class, -"iscsi_connection" , -NULL , -NULL , - NULL); +#define DECLARE_TRANSPORT_CLASS_NS (cls, nm, su, rm, cfg, ns, nslookup) \ +struct transport_class cls = { \ + .class = { \ + .name = nm, \ + .ns_type = ns, \ + .namespace = nslookup, \ + }, \ + .setup = su, \ + .remove = rm, \ + .configure = cfg, \ +} + +static const void *iscsi_host_namespace (struct device *dev) +{ +struct Scsi_Host *shost =transport_class_to_shost (dev); +struct iscsi_cls_host *ihost = shost->shost_data; + +return iscsi_host_net (ihost); +} + +static DECLARE_TRANSPORT_CLASS_NS(iscsi_host_class, +"iscsi_host" , + iscsi_setup_host, + iscsi_remove_host, +NULL , + &net_ns_type_operations, + iscsi_host_namespace); + +static struct net *iscsi_sess_net (struct iscsi_cls_session *cls_session) +{ +struct Scsi_Host *shost =iscsi_session_to_shost (cls_session); +struct iscsi_cls_host *ihost = shost->shost_data; + +return iscsi_host_net (ihost); +} + +static const void *iscsi_sess_namespace (struct device *dev) +{ +struct iscsi_cls_session *cls_session =transport_class_to_session (dev); + +return iscsi_sess_net (cls_session); +} + +static DECLARE_TRANSPORT_CLASS_NS(iscsi_session_class, +"iscsi_session" , +NULL , +NULL , +NULL , + &net_ns_type_operations, + iscsi_sess_namespace); + +static struct net *iscsi_conn_net (struct iscsi_cls_conn *cls_conn) +{ +struct iscsi_cls_session *cls_session =iscsi_conn_to_session (cls_conn); + +return iscsi_sess_net (cls_session); +} + +static const void *iscsi_conn_namespace (struct device *dev) +{ +struct iscsi_cls_conn *cls_conn =transport_class_to_conn (dev); + +return iscsi_conn_net (cls_conn); +} + +static DECLARE_TRANSPORT_CLASS_NS(iscsi_connection_class, +"iscsi_connection" , +NULL , +NULL , +NULL , + &net_ns_type_operations, + iscsi_conn_namespace);struct iscsi_net {struct sock *nls;
include/scsi/scsi_transport_iscsi.h +1 -0
@@ -279,6 +279,7 @@ struct iscsi_cls_host {struct request_queue *bsg_q;uint32_t port_speed;uint32_t port_state; +struct net *netns; };#define iscsi_job_to_shost (_job) \
Signature · 1 line
2.9.5
PATCH 4/9 iscsi: make all iSCSI netlink multicast namespace aware
In reply to a message not in the archiveMake use of the per-net netlink sockets. Responses are sent back on the same socket/namespace the request was received on. Async events are reported on the socket/namespace stored in the iscsi_cls_host associated with the event.
--- drivers/scsi/scsi_transport_iscsi.c | 92 ++++++++++++++++++++++++------------- 1 file changed, 61 insertions(+), 31 deletions(-)
drivers/scsi/scsi_transport_iscsi.c +61 -31
@@ -2418,8 +2418,8 @@ iscsi_if_transport_lookup(struct iscsi_transport *tt) }static int -iscsi_multicast_netns (struct net *net,struct sk_buff *skb, -uint32_t group,gfp_t gfp) +iscsi_multicast_skb (struct net *net,struct sk_buff *skb, +uint32_t group,gfp_t gfp) {struct sock *nls;struct iscsi_net *isn;
@@ -2429,12 +2429,6 @@ iscsi_multicast_netns(struct net *net, struct sk_buff *skb,return nlmsg_multicast (nls, skb,0 , group, gfp); } -static int -iscsi_multicast_skb (struct sk_buff *skb,uint32_t group,gfp_t gfp) -{ -return iscsi_multicast_netns (&init_net, skb, group, gfp); -} -int iscsi_recv_pdu (struct iscsi_cls_conn *conn,struct iscsi_hdr *hdr,char *data,uint32_t data_size) {
@@ -2443,6 +2437,7 @@ int iscsi_recv_pdu(struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr,struct iscsi_uevent *ev;char *pdu;struct iscsi_internal *priv; +struct net *net;int len =nlmsg_total_size (sizeof (*ev) +sizeof (struct iscsi_hdr ) + data_size);
@@ -2469,7 +2464,8 @@ int iscsi_recv_pdu(struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr,memcpy (pdu, hdr,sizeof (struct iscsi_hdr ));memcpy (pdu +sizeof (struct iscsi_hdr ), data, data_size); -return iscsi_multicast_skb (skb,ISCSI_NL_GRP_ISCSID ,GFP_ATOMIC ); + net =iscsi_conn_net (conn); +return iscsi_multicast_skb (net, skb,ISCSI_NL_GRP_ISCSID ,GFP_ATOMIC ); }EXPORT_SYMBOL_GPL (iscsi_recv_pdu);
@@ -2480,6 +2476,7 @@ int iscsi_offload_mesg(struct Scsi_Host *shost,struct nlmsghdr *nlh;struct sk_buff *skb;struct iscsi_uevent *ev; +struct net *net;int len =nlmsg_total_size (sizeof (*ev) + data_size); skb =alloc_skb (len,GFP_ATOMIC );
@@ -2504,7 +2501,8 @@ int iscsi_offload_mesg(struct Scsi_Host *shost,memcpy ((char *)ev +sizeof (*ev), data, data_size); -return iscsi_multicast_skb (skb,ISCSI_NL_GRP_UIP ,GFP_ATOMIC ); + net =iscsi_host_net (shost->shost_data); +return iscsi_multicast_skb (net, skb,ISCSI_NL_GRP_UIP ,GFP_ATOMIC ); }EXPORT_SYMBOL_GPL (iscsi_offload_mesg);
@@ -2514,6 +2512,7 @@ void iscsi_conn_error_event(struct iscsi_cls_conn *conn, enum iscsi_err error)struct sk_buff *skb;struct iscsi_uevent *ev;struct iscsi_internal *priv; +struct net *net;int len =nlmsg_total_size (sizeof (*ev)); priv =iscsi_if_transport_lookup (conn->transport);
@@ -2535,7 +2534,8 @@ void iscsi_conn_error_event(struct iscsi_cls_conn *conn, enum iscsi_err error) ev->r.connerror.cid = conn->cid; ev->r.connerror.sid =iscsi_conn_get_sid (conn); -iscsi_multicast_skb (skb,ISCSI_NL_GRP_ISCSID ,GFP_ATOMIC ); + net =iscsi_conn_net (conn); +iscsi_multicast_skb (net, skb,ISCSI_NL_GRP_ISCSID ,GFP_ATOMIC );iscsi_cls_conn_printk (KERN_INFO , conn,"detected conn error (%d)\n" , error);
@@ -2549,6 +2549,7 @@ void iscsi_conn_login_event(struct iscsi_cls_conn *conn,struct sk_buff *skb;struct iscsi_uevent *ev;struct iscsi_internal *priv; +struct net *net;int len =nlmsg_total_size (sizeof (*ev)); priv =iscsi_if_transport_lookup (conn->transport);
@@ -2569,7 +2570,9 @@ void iscsi_conn_login_event(struct iscsi_cls_conn *conn, ev->r.conn_login.state = state; ev->r.conn_login.cid = conn->cid; ev->r.conn_login.sid =iscsi_conn_get_sid (conn); -iscsi_multicast_skb (skb,ISCSI_NL_GRP_ISCSID ,GFP_ATOMIC ); + + net =iscsi_conn_net (conn); +iscsi_multicast_skb (net, skb,ISCSI_NL_GRP_ISCSID ,GFP_ATOMIC );iscsi_cls_conn_printk (KERN_INFO , conn,"detected conn login (%d)\n" , state);
@@ -2580,11 +2583,17 @@ void iscsi_post_host_event(uint32_t host_no, struct iscsi_transport *transport, enum iscsi_host_event_code code, uint32_t data_size, uint8_t *data) { + struct Scsi_Host *shost; +struct net *net;struct nlmsghdr *nlh;struct sk_buff *skb;struct iscsi_uevent *ev;int len =nlmsg_total_size (sizeof (*ev) + data_size); + shost =scsi_host_lookup (host_no); +if (!shost) +return ; + skb =alloc_skb (len,GFP_NOIO );if (!skb) { printk(KERN_ERR "gracefully ignored host event (%d):%d OOM\n",
@@ -2603,7 +2612,9 @@ void iscsi_post_host_event(uint32_t host_no, struct iscsi_transport *transport,if (data_size)memcpy ((char *)ev +sizeof (*ev), data, data_size); -iscsi_multicast_skb (skb,ISCSI_NL_GRP_ISCSID ,GFP_NOIO ); + net =iscsi_host_net (shost->shost_data); +scsi_host_put (shost); +iscsi_multicast_skb (net, skb,ISCSI_NL_GRP_ISCSID ,GFP_NOIO ); }EXPORT_SYMBOL_GPL (iscsi_post_host_event);
@@ -2611,11 +2622,17 @@ void iscsi_ping_comp_event(uint32_t host_no, struct iscsi_transport *transport, uint32_t status, uint32_t pid, uint32_t data_size, uint8_t *data) { + struct Scsi_Host *shost; +struct net *net;struct nlmsghdr *nlh;struct sk_buff *skb;struct iscsi_uevent *ev;int len =nlmsg_total_size (sizeof (*ev) + data_size); + shost =scsi_host_lookup (host_no); +if (!shost) +return ; + skb =alloc_skb (len,GFP_NOIO );if (!skb) {printk (KERN_ERR "gracefully ignored ping comp: OOM\n" );
@@ -2632,13 +2649,15 @@ void iscsi_ping_comp_event(uint32_t host_no, struct iscsi_transport *transport, ev->r.ping_comp.data_size = data_size;memcpy ((char *)ev +sizeof (*ev), data, data_size); -iscsi_multicast_skb (skb,ISCSI_NL_GRP_ISCSID ,GFP_NOIO ); + net =iscsi_host_net (shost->shost_data); +scsi_host_put (shost); +iscsi_multicast_skb (net, skb,ISCSI_NL_GRP_ISCSID ,GFP_NOIO ); }EXPORT_SYMBOL_GPL (iscsi_ping_comp_event);static int -iscsi_if_send_reply (uint32_t group,int seq,int type,int done,int multi, -void *payload,int size) +iscsi_if_send_reply (struct net *net,uint32_t group,int seq,int type, +int done,int multi,void *payload,int size) {struct sk_buff *skb;struct nlmsghdr *nlh;
@@ -2655,11 +2674,12 @@ iscsi_if_send_reply(uint32_t group, int seq, int type, int done, int multi, nlh =__nlmsg_put (skb,0 ,0 , t, (len -sizeof (*nlh)),0 ); nlh->nlmsg_flags = flags;memcpy (nlmsg_data (nlh), payload, size); -return iscsi_multicast_skb (skb, group,GFP_ATOMIC ); +return iscsi_multicast_skb (net, skb, group,GFP_ATOMIC ); }static int -iscsi_if_get_stats (struct iscsi_transport *transport,struct nlmsghdr *nlh) +iscsi_if_get_stats (struct net *net,struct iscsi_transport *transport, +struct nlmsghdr *nlh) {struct iscsi_uevent *ev =nlmsg_data (nlh);struct iscsi_stats *stats;
@@ -2716,7 +2736,7 @@ iscsi_if_get_stats(struct iscsi_transport *transport, struct nlmsghdr *nlh)skb_trim (skbstat,NLMSG_ALIGN (actual_size)); nlhstat->nlmsg_len = actual_size; - err =iscsi_multicast_skb (skbstat,ISCSI_NL_GRP_ISCSID , + err =iscsi_multicast_skb (net, skbstat,ISCSI_NL_GRP_ISCSID ,GFP_ATOMIC ); }while (err <0 && err != -ECONNREFUSED );
@@ -2736,6 +2756,7 @@ int iscsi_session_event(struct iscsi_cls_session *session,struct iscsi_uevent *ev;struct sk_buff *skb;struct nlmsghdr *nlh; +struct net *net;int rc, len =nlmsg_total_size (sizeof (*ev)); priv =iscsi_if_transport_lookup (session->transport);
@@ -2780,7 +2801,8 @@ int iscsi_session_event(struct iscsi_cls_session *session,* this will occur if the daemon is not up, so we just warn * the user and when the daemon is restarted it will handle it */ - rc =iscsi_multicast_skb (skb,ISCSI_NL_GRP_ISCSID ,GFP_KERNEL ); + net =iscsi_sess_net (session); + rc =iscsi_multicast_skb (net, skb,ISCSI_NL_GRP_ISCSID ,GFP_KERNEL );if (rc == -ESRCH )iscsi_cls_session_printk (KERN_ERR , session, "Cannot notify userspace of session "
@@ -3103,7 +3125,8 @@ iscsi_send_ping(struct iscsi_transport *transport, struct iscsi_uevent *ev) }static int -iscsi_get_chap (struct iscsi_transport *transport,struct nlmsghdr *nlh) +iscsi_get_chap (struct net *net,struct iscsi_transport *transport, +struct nlmsghdr *nlh) {struct iscsi_uevent *ev =nlmsg_data (nlh);struct Scsi_Host *shost =NULL ;
@@ -3162,7 +3185,7 @@ iscsi_get_chap(struct iscsi_transport *transport, struct nlmsghdr *nlh)skb_trim (skbchap,NLMSG_ALIGN (actual_size)); nlhchap->nlmsg_len = actual_size; - err =iscsi_multicast_skb (skbchap,ISCSI_NL_GRP_ISCSID , + err =iscsi_multicast_skb (net, skbchap,ISCSI_NL_GRP_ISCSID ,GFP_KERNEL ); }while (err <0 && err != -ECONNREFUSED );
@@ -3509,7 +3532,8 @@ static int iscsi_logout_flashnode_sid(struct iscsi_transport *transport, }static int -iscsi_get_host_stats (struct iscsi_transport *transport,struct nlmsghdr *nlh) +iscsi_get_host_stats (struct net *net,struct iscsi_transport *transport, +struct nlmsghdr *nlh) {struct iscsi_uevent *ev =nlmsg_data (nlh);struct Scsi_Host *shost =NULL ;
@@ -3569,8 +3593,8 @@ iscsi_get_host_stats(struct iscsi_transport *transport, struct nlmsghdr *nlh)skb_trim (skbhost_stats,NLMSG_ALIGN (actual_size)); nlhhost_stats->nlmsg_len = actual_size; - err =iscsi_multicast_skb (skbhost_stats,ISCSI_NL_GRP_ISCSID , -GFP_KERNEL ); + err =iscsi_multicast_skb (net, skbhost_stats, +ISCSI_NL_GRP_ISCSID ,GFP_KERNEL ); }while (err <0 && err != -ECONNREFUSED ); exit_host_stats:
@@ -3580,7 +3604,8 @@ iscsi_get_host_stats(struct iscsi_transport *transport, struct nlmsghdr *nlh)static int -iscsi_if_recv_msg (struct sk_buff *skb,struct nlmsghdr *nlh,uint32_t *group) +iscsi_if_recv_msg (struct net *net,struct sk_buff *skb, +struct nlmsghdr *nlh,uint32_t *group) {int err =0 ;struct iscsi_uevent *ev =nlmsg_data (nlh);
@@ -3703,7 +3728,7 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, uint32_t *group) err = -EINVAL ;break ;case ISCSI_UEVENT_GET_STATS : - err =iscsi_if_get_stats (transport, nlh); + err =iscsi_if_get_stats (net, transport, nlh);break ;case ISCSI_UEVENT_TRANSPORT_EP_CONNECT :case ISCSI_UEVENT_TRANSPORT_EP_POLL :
@@ -3728,7 +3753,7 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, uint32_t *group) err =iscsi_send_ping (transport, ev);break ;case ISCSI_UEVENT_GET_CHAP : - err =iscsi_get_chap (transport, nlh); + err =iscsi_get_chap (net, transport, nlh);break ;case ISCSI_UEVENT_DELETE_CHAP : err =iscsi_delete_chap (transport, ev);
@@ -3759,7 +3784,7 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, uint32_t *group) nlmsg_attrlen(nlh, sizeof(*ev)));break ;case ISCSI_UEVENT_GET_HOST_STATS : - err =iscsi_get_host_stats (transport, nlh); + err =iscsi_get_host_stats (net, transport, nlh);break ;default : err = -ENOSYS ;
@@ -3777,6 +3802,9 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, uint32_t *group)static void iscsi_if_rx (struct sk_buff *skb) { +struct sock *sk = skb->sk; +struct net *net =sock_net (sk); +mutex_lock (&rx_queue_mutex);while (skb->len >=NLMSG_HDRLEN ) {int err;
@@ -3796,7 +3824,7 @@ iscsi_if_rx(struct sk_buff *skb)if (rlen > skb->len) rlen = skb->len; - err =iscsi_if_recv_msg (skb, nlh, &group); + err =iscsi_if_recv_msg (net, skb, nlh, &group);if (err) { ev->type =ISCSI_KEVENT_IF_ERROR ; ev->iferror = err;
@@ -3812,7 +3840,9 @@ iscsi_if_rx(struct sk_buff *skb)break ;if (ev->type ==ISCSI_UEVENT_GET_CHAP && !err)break ; - err =iscsi_if_send_reply (group, nlh->nlmsg_seq, +if (ev->type ==ISCSI_UEVENT_GET_HOST_STATS && !err) +break ; + err =iscsi_if_send_reply (net, group, nlh->nlmsg_seq, nlh->nlmsg_type,0 ,0 , ev,sizeof (*ev)); }while (err <0 && err != -ECONNREFUSED && err != -ESRCH );skb_pull (skb, rlen);
Signature · 1 line
2.9.5
PATCH 5/9 iscsi: set netns for iscsi_tcp hosts
In reply to a message not in the archiveThis lets iscsi_tcp operate in multiple namespaces. It uses current during session creation to find the net namespace, but it might be better to manage to pass it along from the iscsi netlink socket.
--- drivers/scsi/iscsi_tcp.c | 7 +++++++ drivers/scsi/scsi_transport_iscsi.c | 7 ++++++- include/scsi/scsi_transport_iscsi.h | 1 + 3 files changed, 14 insertions(+), 1 deletion(-)
drivers/scsi/iscsi_tcp.c +7 -0
@@ -957,6 +957,11 @@ static int iscsi_sw_tcp_slave_configure(struct scsi_device *sdev)return 0 ; } +static struct net *iscsi_sw_tcp_netns (struct Scsi_Host *shost) +{ +return current->nsproxy->net_ns; +} +static struct scsi_host_template iscsi_sw_tcp_sht = { .module =THIS_MODULE , .name ="iSCSI Initiator over TCP/IP" ,
@@ -1013,6 +1018,8 @@ static struct iscsi_transport iscsi_sw_tcp_transport = { .alloc_pdu = iscsi_sw_tcp_pdu_alloc,/* recovery */ .session_recovery_timedout = iscsi_session_recovery_timedout, +/* net namespace */ + .get_netns = iscsi_sw_tcp_netns, };static int __init iscsi_sw_tcp_init (void )
drivers/scsi/scsi_transport_iscsi.c +6 -1
@@ -1600,11 +1600,16 @@ static int iscsi_setup_host(struct transport_container *tc, struct device *dev, {struct Scsi_Host *shost =dev_to_shost (dev);struct iscsi_cls_host *ihost = shost->shost_data; +struct iscsi_internal *priv =to_iscsi_internal (shost->transportt); +struct iscsi_transport *transport = priv->iscsi_transport;memset (ihost,0 ,sizeof (*ihost));atomic_set (&ihost->nr_scans,0 );mutex_init (&ihost->mutex); - ihost->netns = &init_net; +if (transport->get_netns) + ihost->netns = transport->get_netns (shost); +else + ihost->netns = &init_net;iscsi_bsg_host_add (shost, ihost);/* ignore any bsg add error - we just can't do sgio */
include/scsi/scsi_transport_iscsi.h +1 -0
@@ -168,6 +168,7 @@ struct iscsi_transport {int (*logout_flashnode_sid) (struct iscsi_cls_session *cls_sess);int (*get_host_stats) (struct Scsi_Host *shost,char *buf,int len);u8 (*check_protection)(struct iscsi_task *task,sector_t *sector); +struct net *(*get_netns)(struct Scsi_Host *shost); };/*
Signature · 1 line
2.9.5
PATCH 6/9 iscsi: check net namespace for all iscsi lookups
In reply to a message not in the archiveAll internal lookups of iSCSI transport objects need to be filtered by net namespace.
--- drivers/infiniband/ulp/iser/iscsi_iser.c | 5 +- drivers/scsi/be2iscsi/be_iscsi.c | 4 +- drivers/scsi/bnx2i/bnx2i_iscsi.c | 4 +- drivers/scsi/cxgbi/libcxgbi.c | 4 +- drivers/scsi/qedi/qedi_iscsi.c | 4 +- drivers/scsi/qla4xxx/ql4_os.c | 6 +- drivers/scsi/scsi_transport_iscsi.c | 201 +++++++++++++++++++------------ include/scsi/scsi_transport_iscsi.h | 5 +- 8 files changed, 150 insertions(+), 83 deletions(-)
drivers/infiniband/ulp/iser/iscsi_iser.c +4 -1
@@ -464,15 +464,18 @@ iscsi_iser_conn_bind(struct iscsi_cls_session *cls_session,struct iscsi_conn *conn = cls_conn->dd_data;struct iser_conn *iser_conn;struct iscsi_endpoint *ep; +struct net *net;int error; error =iscsi_conn_bind (cls_session, cls_conn, is_leading);if (error)return error; +/* the transport ep handle comes from user space so it must be * verified against the global ib connections list */ - ep =iscsi_lookup_endpoint (transport_eph); + net =iscsi_sess_net (cls_session); + ep =iscsi_lookup_endpoint (net, transport_eph);if (!ep) {iser_err ("can't bind eph %llx\n" , (unsigned long long )transport_eph);
drivers/scsi/be2iscsi/be_iscsi.c +3 -1
@@ -181,8 +181,10 @@ int beiscsi_conn_bind(struct iscsi_cls_session *cls_session,struct beiscsi_endpoint *beiscsi_ep;struct iscsi_endpoint *ep;uint16_t cri_index; +struct net *net; - ep =iscsi_lookup_endpoint (transport_fd); + net =iscsi_sess_net (cls_session); + ep =iscsi_lookup_endpoint (net, transport_fd);if (!ep)return -EINVAL ;
drivers/scsi/bnx2i/bnx2i_iscsi.c +3 -1
@@ -1414,9 +1414,11 @@ static int bnx2i_conn_bind(struct iscsi_cls_session *cls_session,struct bnx2i_hba *hba =iscsi_host_priv (shost);struct bnx2i_endpoint *bnx2i_ep;struct iscsi_endpoint *ep; +struct net *net;int ret_code; - ep =iscsi_lookup_endpoint (transport_fd); + net =iscsi_sess_net (cls_session); + ep =iscsi_lookup_endpoint (net, transport_fd);if (!ep)return -EINVAL ;/*
drivers/scsi/cxgbi/libcxgbi.c +3 -1
@@ -2373,9 +2373,11 @@ int cxgbi_bind_conn(struct iscsi_cls_session *cls_session,struct iscsi_endpoint *ep;struct cxgbi_endpoint *cep;struct cxgbi_sock *csk; +struct net *net;int err; - ep =iscsi_lookup_endpoint (transport_eph); + net =iscsi_sess_net (cls_session); + ep =iscsi_lookup_endpoint (net, transport_eph);if (!ep)return -EINVAL ;
drivers/scsi/qedi/qedi_iscsi.c +3 -1
@@ -381,8 +381,10 @@ static int qedi_conn_bind(struct iscsi_cls_session *cls_session,struct qedi_ctx *qedi =iscsi_host_priv (shost);struct qedi_endpoint *qedi_ep;struct iscsi_endpoint *ep; +struct net *net; - ep =iscsi_lookup_endpoint (transport_fd); + net =iscsi_sess_net (cls_session); + ep =iscsi_lookup_endpoint (net, transport_fd);if (!ep)return -EINVAL ;
drivers/scsi/qla4xxx/ql4_os.c +5 -1
@@ -3178,6 +3178,7 @@ static int qla4xxx_conn_bind(struct iscsi_cls_session *cls_session,struct ddb_entry *ddb_entry;struct scsi_qla_host *ha;struct iscsi_session *sess; +struct net *net; sess = cls_session->dd_data; ddb_entry = sess->dd_data;
@@ -3186,9 +3187,12 @@ static int qla4xxx_conn_bind(struct iscsi_cls_session *cls_session,DEBUG2 (ql4_printk (KERN_INFO , ha,"%s: sid = %d, cid = %d\n" , __func__, cls_session->sid, cls_conn->cid)); + net =iscsi_sess_net (cls_session); + ep =iscsi_lookup_endpoint (net, transport_fd); +if (!ep) +return -EINVAL ;if (iscsi_conn_bind (cls_session, cls_conn, is_leading))return -EINVAL ; - ep =iscsi_lookup_endpoint (transport_fd); conn = cls_conn->dd_data; qla_conn = conn->dd_data; qla_conn->qla_ep = ep->dd_data;
drivers/scsi/scsi_transport_iscsi.c +125 -76
608 lines not on this page · raw message
include/scsi/scsi_transport_iscsi.h +4 -1
@@ -271,6 +271,8 @@ struct iscsi_cls_session {#define iscsi_endpoint_to_shost (_ep) \ dev_to_shost(_ep->dev.parent) +extern struct net *iscsi_sess_net (struct iscsi_cls_session *session); +#define starget_to_session (_stgt) \ iscsi_dev_to_session(_stgt->dev.parent)
@@ -448,7 +450,8 @@ extern int iscsi_scan_finished(struct Scsi_Host *shost, unsigned long time);extern struct iscsi_endpoint *iscsi_create_endpoint (struct Scsi_Host *shost,int dd_size);extern void iscsi_destroy_endpoint (struct iscsi_endpoint *ep); -extern struct iscsi_endpoint *iscsi_lookup_endpoint (u64 handle); +extern struct iscsi_endpoint *iscsi_lookup_endpoint (struct net *net, +u64 handle);extern int iscsi_block_scsi_eh (struct scsi_cmnd *cmd); extern struct iscsi_iface *iscsi_create_iface(struct Scsi_Host *shost, struct iscsi_transport *t,
Signature · 1 line
2.9.5
PATCH 7/9 iscsi: convert flashnode devices from bus to class
In reply to a message not in the archiveThe flashnode session and connection devices should be filtered by net namespace along with the iscsi_host, but we can't do that with a bus device. As these don't use any of the bus matching functionality, they make more sense as a class device anyway.
--- drivers/scsi/qla4xxx/ql4_os.c | 2 +- drivers/scsi/scsi_transport_iscsi.c | 36 +++++++++++++++--------------------- include/scsi/scsi_transport_iscsi.h | 2 ++ 3 files changed, 18 insertions(+), 22 deletions(-)
drivers/scsi/qla4xxx/ql4_os.c +1 -1
@@ -7164,7 +7164,7 @@ static int qla4xxx_sysfs_ddb_is_non_persistent(struct device *dev, void *data) {struct iscsi_bus_flash_session *fnode_sess; -if (!iscsi_flashnode_bus_match (dev,NULL )) +if (!iscsi_is_flashnode_session_dev (dev))return 0 ; fnode_sess =iscsi_dev_to_flash_session (dev);
drivers/scsi/scsi_transport_iscsi.c +15 -21
@@ -1060,6 +1060,12 @@ static const struct device_type iscsi_flashnode_sess_dev_type = { .release = iscsi_flashnode_sess_release, }; +bool iscsi_is_flashnode_session_dev (struct device *dev) +{ +return dev->type == &iscsi_flashnode_sess_dev_type; +} +EXPORT_SYMBOL_GPL (iscsi_is_flashnode_session_dev); +/* flash node connection attrs show */ #define iscsi_flashnode_conn_attr_show (type, name, param) \ static ssize_t \
@@ -1246,20 +1252,8 @@ static const struct device_type iscsi_flashnode_conn_dev_type = { .release = iscsi_flashnode_conn_release, }; -static struct bus_type iscsi_flashnode_bus; - -int iscsi_flashnode_bus_match (struct device *dev, -struct device_driver *drv) -{ -if (dev->bus == &iscsi_flashnode_bus) -return 1 ; -return 0 ; -} -EXPORT_SYMBOL_GPL (iscsi_flashnode_bus_match); - -static struct bus_type iscsi_flashnode_bus = { +static struct class iscsi_flashnode_bus = { .name ="iscsi_flashnode" , - .match = &iscsi_flashnode_bus_match, };/**
@@ -1290,7 +1284,7 @@ iscsi_create_flashnode_sess(struct Scsi_Host *shost, int index, fnode_sess->transport = transport; fnode_sess->target_id = index; fnode_sess->dev.type = &iscsi_flashnode_sess_dev_type; - fnode_sess->dev.bus = &iscsi_flashnode_bus; + fnode_sess->dev.class = &iscsi_flashnode_bus; fnode_sess->dev.parent = &shost->shost_gendev;dev_set_name (&fnode_sess->dev,"flashnode_sess-%u:%u" , shost->host_no, index);
@@ -1338,7 +1332,7 @@ iscsi_create_flashnode_conn(struct Scsi_Host *shost, fnode_conn->transport = transport; fnode_conn->dev.type = &iscsi_flashnode_conn_dev_type; - fnode_conn->dev.bus = &iscsi_flashnode_bus; + fnode_conn->dev.class = &iscsi_flashnode_bus; fnode_conn->dev.parent = &fnode_sess->dev;dev_set_name (&fnode_conn->dev,"flashnode_conn-%u:%u:0" , shost->host_no, fnode_sess->target_id);
@@ -1371,7 +1365,7 @@ EXPORT_SYMBOL_GPL(iscsi_create_flashnode_conn);*/ static int iscsi_is_flashnode_conn_dev (struct device *dev,void *data) { -return dev->bus == &iscsi_flashnode_bus; +return dev->type == &iscsi_flashnode_conn_dev_type; }static int iscsi_destroy_flashnode_conn (struct iscsi_bus_flash_conn *fnode_conn)
@@ -1385,7 +1379,7 @@ static int flashnode_match_index(struct device *dev, void *data)struct iscsi_bus_flash_session *fnode_sess =NULL ;int ret =0 ; -if (!iscsi_flashnode_bus_match (dev,NULL )) +if (dev->type != &iscsi_flashnode_sess_dev_type) goto exit_match_index; fnode_sess =iscsi_dev_to_flash_session (dev);
@@ -1491,7 +1485,7 @@ EXPORT_SYMBOL_GPL(iscsi_destroy_flashnode_sess);static int iscsi_iter_destroy_flashnode_fn (struct device *dev,void *data) { -if (!iscsi_flashnode_bus_match (dev,NULL )) +if (dev->type != &iscsi_flashnode_sess_dev_type)return 0 ;iscsi_destroy_flashnode_sess (iscsi_dev_to_flash_session (dev));
@@ -4752,7 +4746,7 @@ static __init int iscsi_transport_init(void)if (err) goto unregister_conn_class; - err =bus_register (&iscsi_flashnode_bus); + err =class_register (&iscsi_flashnode_bus);if (err) goto unregister_session_class;
@@ -4773,7 +4767,7 @@ static __init int iscsi_transport_init(void) unregister_pernet_subsys:unregister_pernet_subsys (&iscsi_net_ops); unregister_flashnode_bus: -bus_unregister (&iscsi_flashnode_bus); +class_unregister (&iscsi_flashnode_bus); unregister_session_class:transport_class_unregister (&iscsi_session_class); unregister_conn_class:
@@ -4793,7 +4787,7 @@ static void __exit iscsi_transport_exit(void) {destroy_workqueue (iscsi_eh_timer_workq);unregister_pernet_subsys (&iscsi_net_ops); -bus_unregister (&iscsi_flashnode_bus); +class_unregister (&iscsi_flashnode_bus);transport_class_unregister (&iscsi_connection_class);transport_class_unregister (&iscsi_session_class);transport_class_unregister (&iscsi_host_class);
include/scsi/scsi_transport_iscsi.h +2 -0
@@ -489,6 +489,8 @@ iscsi_find_flashnode_sess(struct Scsi_Host *shost, void *data,extern struct device *iscsi_find_flashnode_conn (struct iscsi_bus_flash_session *fnode_sess); +extern bool iscsi_is_flashnode_session_dev (struct device *dev); +extern char *iscsi_get_ipaddress_state_name (enum iscsi_ipaddress_state port_state);extern char *iscsi_get_router_state_name (enum iscsi_router_state router_state);
Signature · 1 line
2.9.5
PATCH 8/9 iscsi: rename iscsi_bus_flash_* to iscsi_flash_*
In reply to a message not in the archivecleanups after the bus to class conversion
--- drivers/scsi/qla4xxx/ql4_os.c | 52 +++++++++--------- drivers/scsi/scsi_transport_iscsi.c | 102 ++++++++++++++++++------------------ include/scsi/scsi_transport_iscsi.h | 48 +++++++++-------- 3 files changed, 102 insertions(+), 100 deletions(-)
drivers/scsi/qla4xxx/ql4_os.c +26 -26
@@ -169,20 +169,20 @@ static int qla4xxx_host_reset(struct Scsi_Host *shost, int reset_type);* iSCSI Flash DDB sysfs entry points */ static int -qla4xxx_sysfs_ddb_set_param (struct iscsi_bus_flash_session *fnode_sess, -struct iscsi_bus_flash_conn *fnode_conn, +qla4xxx_sysfs_ddb_set_param (struct iscsi_flash_session *fnode_sess, +struct iscsi_flash_conn *fnode_conn,void *data,int len);static int -qla4xxx_sysfs_ddb_get_param (struct iscsi_bus_flash_session *fnode_sess, +qla4xxx_sysfs_ddb_get_param (struct iscsi_flash_session *fnode_sess,int param,char *buf);static int qla4xxx_sysfs_ddb_add (struct Scsi_Host *shost,const char *buf,int len);static int -qla4xxx_sysfs_ddb_delete (struct iscsi_bus_flash_session *fnode_sess); -static int qla4xxx_sysfs_ddb_login (struct iscsi_bus_flash_session *fnode_sess, -struct iscsi_bus_flash_conn *fnode_conn); -static int qla4xxx_sysfs_ddb_logout (struct iscsi_bus_flash_session *fnode_sess, -struct iscsi_bus_flash_conn *fnode_conn); +qla4xxx_sysfs_ddb_delete (struct iscsi_flash_session *fnode_sess); +static int qla4xxx_sysfs_ddb_login (struct iscsi_flash_session *fnode_sess, +struct iscsi_flash_conn *fnode_conn); +static int qla4xxx_sysfs_ddb_logout (struct iscsi_flash_session *fnode_sess, +struct iscsi_flash_conn *fnode_conn);static int qla4xxx_sysfs_ddb_logout_sid (struct iscsi_cls_session *cls_sess); static struct qla4_8xxx_legacy_intr_set legacy_intr[] =
@@ -3454,8 +3454,8 @@ static int qla4xxx_task_xmit(struct iscsi_task *task)return -ENOSYS ; } -static int qla4xxx_copy_from_fwddb_param (struct iscsi_bus_flash_session *sess, -struct iscsi_bus_flash_conn *conn, +static int qla4xxx_copy_from_fwddb_param (struct iscsi_flash_session *sess, +struct iscsi_flash_conn *conn,struct dev_db_entry *fw_ddb_entry) {unsigned long options =0 ;
@@ -3596,8 +3596,8 @@ static int qla4xxx_copy_from_fwddb_param(struct iscsi_bus_flash_session *sess,return rc; } -static int qla4xxx_copy_to_fwddb_param (struct iscsi_bus_flash_session *sess, -struct iscsi_bus_flash_conn *conn, +static int qla4xxx_copy_to_fwddb_param (struct iscsi_flash_session *sess, +struct iscsi_flash_conn *conn,struct dev_db_entry *fw_ddb_entry) {uint16_t options;
@@ -7162,7 +7162,7 @@ static void qla4xxx_build_new_nt_list(struct scsi_qla_host *ha,**/ static int qla4xxx_sysfs_ddb_is_non_persistent (struct device *dev,void *data) { -struct iscsi_bus_flash_session *fnode_sess; +struct iscsi_flash_session *fnode_sess;if (!iscsi_is_flashnode_session_dev (dev))return 0 ;
@@ -7192,8 +7192,8 @@ static int qla4xxx_sysfs_ddb_tgt_create(struct scsi_qla_host *ha,struct dev_db_entry *fw_ddb_entry, uint16_t *idx, int user) { - struct iscsi_bus_flash_session *fnode_sess = NULL; -struct iscsi_bus_flash_conn *fnode_conn =NULL ; + struct iscsi_flash_session *fnode_sess = NULL; +struct iscsi_flash_conn *fnode_conn =NULL ;int rc =QLA_ERROR ; fnode_sess = iscsi_create_flashnode_sess(ha->host, *idx,
@@ -7330,8 +7330,8 @@ static int qla4xxx_sysfs_ddb_add(struct Scsi_Host *shost, const char *buf,* This writes the contents of target ddb buffer to Flash with a valid cookie * value in order to make the ddb entry persistent. **/ -static int qla4xxx_sysfs_ddb_apply (struct iscsi_bus_flash_session *fnode_sess, -struct iscsi_bus_flash_conn *fnode_conn) +static int qla4xxx_sysfs_ddb_apply (struct iscsi_flash_session *fnode_sess, +struct iscsi_flash_conn *fnode_conn) {struct Scsi_Host *shost =iscsi_flash_session_to_shost (fnode_sess);struct scsi_qla_host *ha =to_qla_host (shost);
@@ -7520,8 +7520,8 @@ static int qla4xxx_ddb_login_nt(struct scsi_qla_host *ha,* * This logs in to the specified target **/ -static int qla4xxx_sysfs_ddb_login (struct iscsi_bus_flash_session *fnode_sess, -struct iscsi_bus_flash_conn *fnode_conn) +static int qla4xxx_sysfs_ddb_login (struct iscsi_flash_session *fnode_sess, +struct iscsi_flash_conn *fnode_conn) {struct Scsi_Host *shost =iscsi_flash_session_to_shost (fnode_sess);struct scsi_qla_host *ha =to_qla_host (shost);
@@ -7704,8 +7704,8 @@ static int qla4xxx_sysfs_ddb_logout_sid(struct iscsi_cls_session *cls_sess)* * This performs log out from the specified target **/ -static int qla4xxx_sysfs_ddb_logout (struct iscsi_bus_flash_session *fnode_sess, -struct iscsi_bus_flash_conn *fnode_conn) +static int qla4xxx_sysfs_ddb_logout (struct iscsi_flash_session *fnode_sess, +struct iscsi_flash_conn *fnode_conn) {struct Scsi_Host *shost =iscsi_flash_session_to_shost (fnode_sess);struct scsi_qla_host *ha =to_qla_host (shost);
@@ -7816,12 +7816,12 @@ static int qla4xxx_sysfs_ddb_logout(struct iscsi_bus_flash_session *fnode_sess, }static int -qla4xxx_sysfs_ddb_get_param (struct iscsi_bus_flash_session *fnode_sess, +qla4xxx_sysfs_ddb_get_param (struct iscsi_flash_session *fnode_sess,int param,char *buf) {struct Scsi_Host *shost =iscsi_flash_session_to_shost (fnode_sess);struct scsi_qla_host *ha =to_qla_host (shost); -struct iscsi_bus_flash_conn *fnode_conn; +struct iscsi_flash_conn *fnode_conn;struct ql4_chap_table chap_tbl;struct device *dev;int parent_type;
@@ -8070,8 +8070,8 @@ qla4xxx_sysfs_ddb_get_param(struct iscsi_bus_flash_session *fnode_sess,* This sets the parameter of flash ddb entry and writes them to flash **/ static int -qla4xxx_sysfs_ddb_set_param (struct iscsi_bus_flash_session *fnode_sess, -struct iscsi_bus_flash_conn *fnode_conn, +qla4xxx_sysfs_ddb_set_param (struct iscsi_flash_session *fnode_sess, +struct iscsi_flash_conn *fnode_conn,void *data,int len) {struct Scsi_Host *shost =iscsi_flash_session_to_shost (fnode_sess);
@@ -8298,7 +8298,7 @@ qla4xxx_sysfs_ddb_set_param(struct iscsi_bus_flash_session *fnode_sess,* * This invalidates the flash ddb entry at the given index **/ -static int qla4xxx_sysfs_ddb_delete (struct iscsi_bus_flash_session *fnode_sess) +static int qla4xxx_sysfs_ddb_delete (struct iscsi_flash_session *fnode_sess) {struct Scsi_Host *shost =iscsi_flash_session_to_shost (fnode_sess);struct scsi_qla_host *ha =to_qla_host (shost);
drivers/scsi/scsi_transport_iscsi.c +51 -51
268 lines not on this page · raw message
include/scsi/scsi_transport_iscsi.h +25 -23
103 lines not on this page · raw message
Signature · 1 line
2.9.5
PATCH 9/9 iscsi: filter flashnode sysfs by net namespace
In reply to a message not in the archiveFinished the net namespace support for flashnode sysfs devices
--- drivers/scsi/scsi_transport_iscsi.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+)
drivers/scsi/scsi_transport_iscsi.c +33 -0
@@ -1268,8 +1268,41 @@ static int iscsi_is_flashnode_conn_dev(struct device *dev, void *data)return dev->type == &iscsi_flashnode_conn_dev_type; } +static struct net *iscsi_flashnode_sess_net (struct iscsi_flash_session *f_sess) +{ +struct Scsi_Host *shost =iscsi_flash_session_to_shost (f_sess); +struct iscsi_cls_host *ihost = shost->shost_data; + +return iscsi_host_net (ihost); +} + +static struct net *iscsi_flashnode_conn_net (struct iscsi_flash_conn *f_conn) +{ +struct iscsi_flash_session *f_sess = +iscsi_flash_conn_to_flash_session (f_conn); + +return iscsi_flashnode_sess_net (f_sess); +} + +static const void *iscsi_flashnode_namespace (struct device *dev) +{ +struct iscsi_flash_conn *f_conn; +struct iscsi_flash_session *f_sess; + +if (iscsi_is_flashnode_conn_dev (dev,NULL )) { + f_conn =iscsi_dev_to_flash_conn (dev); +return iscsi_flashnode_conn_net (f_conn); + }else if (iscsi_is_flashnode_session_dev (dev)) { + f_sess =iscsi_dev_to_flash_session (dev); +return iscsi_flashnode_sess_net (f_sess); + } +return NULL ; +} +static struct class iscsi_flashnode = { .name ="iscsi_flashnode" , + .ns_type = &net_ns_type_operations, + .namespace = iscsi_flashnode_namespace, };/**
Signature · 1 line
2.9.5
From: Chris Leech
Quoted 6 lines
Sent: 07 November 2017 22:45
I've posted these changes to allow iSCSI management within a container using a network namespace to the SCSI and Open-iSCSI lists, but seeing as it's not really SCSI/block related I'm casting a wider net looking for reviews.
I didn't spot you acquiring and releasing references to the namespace. (I might have missed it, the relevant patch is difficult to read).
If the sockets are created in the context of the process whose namespace you are using you don't need it, but given the hooks and callbacks I'm not at all sure that is obviously true.
David
A message that is not in the archive (sent off-list or not yet received): 063D6719AE5E284EB5DD2968C1650D6DD00B618E-VkEWCZq2GCInGFn1LkZF6NBPR1lH4CV8@public.gmane.org
Quoted 8 lines · David Laight
From: Chris Leech
Quoted 6 lines
Sent: 07 November 2017 22:45
I've posted these changes to allow iSCSI management within a container using a network namespace to the SCSI and Open-iSCSI lists, but seeing as it's not really SCSI/block related I'm casting a wider net looking for reviews.
Quoted 6 lines
I didn't spot you acquiring and releasing references to the namespace. (I might have missed it, the relevant patch is difficult to read).
If the sockets are created in the context of the process whose namespace you are using you don't need it, but given the hooks and callbacks I'm not at all sure that is obviously true.
Thanks David,
Looking at it again, you're right and I think I need to hold a reference for the iSCSI host and handle namespace deletion. Even for iscsi_tcp the socket gets handed off from the creating process to the transport and can outlive iscsid.
I'm looking at migration or destruction now rather than later.
Chris
Chris Leech
maintainerQuoted 8 lines · David Laight
From: Chris Leech
Quoted 6 lines
Sent: 07 November 2017 22:45
I've posted these changes to allow iSCSI management within a container using a network namespace to the SCSI and Open-iSCSI lists, but seeing as it's not really SCSI/block related I'm casting a wider net looking for reviews.
Quoted 6 lines
I didn't spot you acquiring and releasing references to the namespace. (I might have missed it, the relevant patch is difficult to read).
If the sockets are created in the context of the process whose namespace you are using you don't need it, but given the hooks and callbacks I'm not at all sure that is obviously true.
Thanks David,
Looking at it again, you're right and I think I need to hold a reference for the iSCSI host and handle namespace deletion. Even for iscsi_tcp the socket gets handed off from the creating process to the transport and can outlive iscsid.
I'm looking at migration or destruction now rather than later.
Chris
From: Chris Leech
Quoted 21 lines
Sent: 15 November 2017 00:25
To: David Laight
Cc: [email protected]; [email protected]
Subject: Re: [PATCH 0/9] use network namespace for iSCSI control interfacesQuoted 8 lines · David Laight
From: Chris Leech
Quoted 6 lines
Sent: 07 November 2017 22:45
I've posted these changes to allow iSCSI management within a container using a network namespace to the SCSI and Open-iSCSI lists, but seeing as it's not really SCSI/block related I'm casting a wider net looking for reviews.
Quoted 6 lines
I didn't spot you acquiring and releasing references to the namespace. (I might have missed it, the relevant patch is difficult to read).
If the sockets are created in the context of the process whose namespace you are using you don't need it, but given the hooks and callbacks I'm not at all sure that is obviously true.
Quoted 6 lines
Thanks David,
Looking at it again, you're right and I think I need to hold a reference for the iSCSI host and handle namespace deletion. Even for
iscsi_tcpthe socket gets handed off from the creating process to the transport and can outlive iscsid.
It isn't that simple....
IIRC:
The namespace delete callback isn't made until the reference count is zero. Sockets created with sock_create_kern() don't hold a reference to the namespace
This is all fine for sockets used for admin purposes, but rather hopeless if you really need the namespace to continue to exist while the connections are open - if only for long enough to close the connection.
To make matters even more annoying the functions for holding and releasing a namespace are GPL_ONLY :-(
David
A message that is not in the archive (sent off-list or not yet received): 687d0196888f4325aebc0989a8e12ced-1XygrNkDbNvwg4NCKwmqgw@public.gmane.org
Quoted 2 lines · David Laight
To make matters even more annoying the functions for holding and releasing a namespace are
GPL_ONLY:-(
I am going to pick on this by itself for a moment without mentioning anything else, so as hopefully not to derail what otherwise sounds like a good technical conversation.
So far every time when someone has complained to me about things being GPL_ONLY and I have looked into it, all I have seen is someone trying to come up with a way to release derivative works of the kernel without honoring the terms of the GPLv2.
I read through the US Code a while back to see if I could understand what is legaly defined as a derivative work, and my impression at the time was that the FSF is quite conservative in what they consider a derivative work, and probably the scope is much wider.
So when people start complaining about things being GPLv2 those are the most annoying bug reports I ever deal with, as almost invariably people just want to take from the community and don't want to work with every one else.
It is especially annoying because I have never seen a case where there is a good justification for a kernel export being anything other than GPL_ONLY. That is the kernel's license after all, and if you are using kernel internal functions the chance that your code is not a derivative work is about 0.
Eric
Quoted 32 lines · David Laight
From: Chris Leech
Quoted 21 lines
Sent: 15 November 2017 00:25
To: David Laight
Cc: [email protected]; containers-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org
Subject: Re: [PATCH 0/9] use network namespace for iSCSI control interfacesQuoted 8 lines · David Laight
From: Chris Leech
Quoted 6 lines
Sent: 07 November 2017 22:45
I've posted these changes to allow iSCSI management within a container using a network namespace to the SCSI and Open-iSCSI lists, but seeing as it's not really SCSI/block related I'm casting a wider net looking for reviews.
Quoted 6 lines
I didn't spot you acquiring and releasing references to the namespace. (I might have missed it, the relevant patch is difficult to read).
If the sockets are created in the context of the process whose namespace you are using you don't need it, but given the hooks and callbacks I'm not at all sure that is obviously true.
Quoted 6 lines
Thanks David,
Looking at it again, you're right and I think I need to hold a reference for the iSCSI host and handle namespace deletion. Even for
iscsi_tcpthe socket gets handed off from the creating process to the transport and can outlive iscsid.It isn't that simple....
IIRC:
Quoted 7 lines
The namespace delete callback isn't made until the reference count is zero. Sockets created with
sock_create_kern()don't hold a reference to the namespaceThis is all fine for sockets used for admin purposes, but rather hopeless if you really need the namespace to continue to exist while the connections are open - if only for long enough to close the connection.
Yeah, I'm catching up on a lot of the details as I attempt to sort out what a sane behavior for iscsi_tcp should be here.
With these patches as is, iscsi_tcp will hold a reference to a TCP socket created by iscsid and keep the net namespace from exiting. That's good for keeping iSCSI sessions alive. Bad in that all processes attached to the namespace can terminate, and if filesystem references (like bind mounts from ip-netns) are unlinked then I don't see any way to get back into the namespace to shut down iSCSI.
I've been trying to sort out a way to shut down and clean up in that case, but the other approach might be to look at having a kernel thread to reference the namespace so that the ns inode could be recovered from /proc?
Quoted 2 lines
To make matters even more annoying the functions for holding and releasing a namespace are
GPL_ONLY:-(
I have no problem with that.
Thanks,
Chris Leech
Quoted 2 lines · David Laight
To make matters even more annoying the functions for holding and releasing a namespace are
GPL_ONLY:-(
I am going to pick on this by itself for a moment without mentioning anything else, so as hopefully not to derail what otherwise sounds like a good technical conversation.
So far every time when someone has complained to me about things being GPL_ONLY and I have looked into it, all I have seen is someone trying to come up with a way to release derivative works of the kernel without honoring the terms of the GPLv2.
I read through the US Code a while back to see if I could understand what is legaly defined as a derivative work, and my impression at the time was that the FSF is quite conservative in what they consider a derivative work, and probably the scope is much wider.
So when people start complaining about things being GPLv2 those are the most annoying bug reports I ever deal with, as almost invariably people just want to take from the community and don't want to work with every one else.
It is especially annoying because I have never seen a case where there is a good justification for a kernel export being anything other than GPL_ONLY. That is the kernel's license after all, and if you are using kernel internal functions the chance that your code is not a derivative work is about 0.
Eric
A message that is not in the archive (sent off-list or not yet received): 20171115002521.GA21082-r8IHplWLGbA5tHQWs+pTeqPFFGjUI2lm2LY78lusg7I@public.gmane.org
From: Chris Leech
Quoted 21 lines
Sent: 15 November 2017 00:25
To: David Laight
Cc: [email protected]; containers-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org
Subject: Re: [PATCH 0/9] use network namespace for iSCSI control interfacesQuoted 8 lines · David Laight
From: Chris Leech
Quoted 6 lines
Sent: 07 November 2017 22:45
I've posted these changes to allow iSCSI management within a container using a network namespace to the SCSI and Open-iSCSI lists, but seeing as it's not really SCSI/block related I'm casting a wider net looking for reviews.
Quoted 6 lines
I didn't spot you acquiring and releasing references to the namespace. (I might have missed it, the relevant patch is difficult to read).
If the sockets are created in the context of the process whose namespace you are using you don't need it, but given the hooks and callbacks I'm not at all sure that is obviously true.
Quoted 6 lines
Thanks David,
Looking at it again, you're right and I think I need to hold a reference for the iSCSI host and handle namespace deletion. Even for
iscsi_tcpthe socket gets handed off from the creating process to the transport and can outlive iscsid.
It isn't that simple....
IIRC:
The namespace delete callback isn't made until the reference count is zero. Sockets created with sock_create_kern() don't hold a reference to the namespace
This is all fine for sockets used for admin purposes, but rather hopeless if you really need the namespace to continue to exist while the connections are open - if only for long enough to close the connection.
To make matters even more annoying the functions for holding and releasing a namespace are GPL_ONLY :-(
David
Chris Leech
maintainerPATCH 2/9 iscsi: associate endpoints with a host
In reply to Chris LeechRight now the iscsi_endpoint is only linked to a connection once that connection has been established. For net namespace filtering of the sysfs objects, associate an endpoint with the host that it was allocated for when it is created.
--- drivers/infiniband/ulp/iser/iscsi_iser.c | 2 +- drivers/scsi/be2iscsi/be_iscsi.c | 2 +- drivers/scsi/bnx2i/bnx2i_iscsi.c | 2 +- drivers/scsi/cxgbi/libcxgbi.c | 2 +- drivers/scsi/qedi/qedi_iscsi.c | 2 +- drivers/scsi/qla4xxx/ql4_os.c | 2 +- drivers/scsi/scsi_transport_iscsi.c | 3 ++- include/scsi/scsi_transport_iscsi.h | 6 +++++- 8 files changed, 13 insertions(+), 8 deletions(-)
drivers/infiniband/ulp/iser/iscsi_iser.c +1 -1
@@ -817,7 +817,7 @@ iscsi_iser_ep_connect(struct Scsi_Host *shost, struct sockaddr *dst_addr,struct iser_conn *iser_conn;struct iscsi_endpoint *ep; - ep =iscsi_create_endpoint (0 ); + ep =iscsi_create_endpoint (shost,0 );if (!ep)return ERR_PTR (-ENOMEM );
drivers/scsi/be2iscsi/be_iscsi.c +1 -1
@@ -1157,7 +1157,7 @@ beiscsi_ep_connect(struct Scsi_Host *shost, struct sockaddr *dst_addr,return ERR_PTR (ret); } - ep =iscsi_create_endpoint (sizeof (struct beiscsi_endpoint )); + ep =iscsi_create_endpoint (shost,sizeof (struct beiscsi_endpoint ));if (!ep) { ret = -ENOMEM ;return ERR_PTR (ret);
drivers/scsi/bnx2i/bnx2i_iscsi.c +1 -1
@@ -384,7 +384,7 @@ static struct iscsi_endpoint *bnx2i_alloc_ep(struct bnx2i_hba *hba)struct bnx2i_endpoint *bnx2i_ep;u32 ec_div; - ep =iscsi_create_endpoint (sizeof (*bnx2i_ep)); + ep =iscsi_create_endpoint (hba->shost,sizeof (*bnx2i_ep));if (!ep) {printk (KERN_ERR "bnx2i: Could not allocate ep\n" );return NULL ;
drivers/scsi/cxgbi/libcxgbi.c +1 -1
@@ -2616,7 +2616,7 @@ struct iscsi_endpoint *cxgbi_ep_connect(struct Scsi_Host *shost, goto release_conn; } - ep =iscsi_create_endpoint (sizeof (*cep)); + ep =iscsi_create_endpoint (shost,sizeof (*cep));if (!ep) { err = -ENOMEM ;pr_info ("iscsi alloc ep, OOM.\n" );
drivers/scsi/qedi/qedi_iscsi.c +1 -1
@@ -847,7 +847,7 @@ qedi_ep_connect(struct Scsi_Host *shost, struct sockaddr *dst_addr,return ERR_PTR (ret); } - ep =iscsi_create_endpoint (sizeof (struct qedi_endpoint )); + ep =iscsi_create_endpoint (shost,sizeof (struct qedi_endpoint ));if (!ep) {QEDI_ERR (&qedi->dbg_ctx,"endpoint create fail\n" ); ret = -ENOMEM ;
drivers/scsi/qla4xxx/ql4_os.c +1 -1
@@ -1673,7 +1673,7 @@ qla4xxx_ep_connect(struct Scsi_Host *shost, struct sockaddr *dst_addr, } ha =iscsi_host_priv (shost); - ep =iscsi_create_endpoint (sizeof (struct qla_endpoint )); + ep =iscsi_create_endpoint (shost,sizeof (struct qla_endpoint ));if (!ep) { ret = -ENOMEM ;return ERR_PTR (ret);
drivers/scsi/scsi_transport_iscsi.c +2 -1
@@ -194,7 +194,7 @@ static int iscsi_match_epid(struct device *dev, const void *data) }struct iscsi_endpoint * -iscsi_create_endpoint (int dd_size) +iscsi_create_endpoint (struct Scsi_Host *shost,int dd_size) {struct device *dev;struct iscsi_endpoint *ep;
@@ -221,6 +221,7 @@ iscsi_create_endpoint(int dd_size) ep->id = id; ep->dev.class = &iscsi_endpoint_class; + ep->dev.parent = &shost->shost_gendev;dev_set_name (&ep->dev,"ep-%llu" , (unsigned long long ) id); err =device_register (&ep->dev);if (err)
include/scsi/scsi_transport_iscsi.h +5 -1
@@ -267,6 +267,9 @@ struct iscsi_cls_session {#define iscsi_session_to_shost (_session) \ dev_to_shost(_session->dev.parent) +#define iscsi_endpoint_to_shost (_ep) \ + dev_to_shost(_ep->dev.parent) +#define starget_to_session (_stgt) \ iscsi_dev_to_session(_stgt->dev.parent)
@@ -440,7 +443,8 @@ extern int iscsi_destroy_conn(struct iscsi_cls_conn *conn);extern void iscsi_unblock_session (struct iscsi_cls_session *session);extern void iscsi_block_session (struct iscsi_cls_session *session);extern int iscsi_scan_finished (struct Scsi_Host *shost,unsigned long time); -extern struct iscsi_endpoint *iscsi_create_endpoint (int dd_size); +extern struct iscsi_endpoint *iscsi_create_endpoint (struct Scsi_Host *shost, +int dd_size);extern void iscsi_destroy_endpoint (struct iscsi_endpoint *ep);extern struct iscsi_endpoint *iscsi_lookup_endpoint (u64 handle);extern int iscsi_block_scsi_eh (struct scsi_cmnd *cmd);
Signature · 1 line
2.9.5
Chris Leech
maintainerPATCH 3/9 iscsi: sysfs filtering by network namespace
In reply to Chris LeechThis makes the iscsi_host, iscsi_session, iscsi_connection, iscsi_iface, and iscsi_endpoint transport class devices only visible in sysfs under a matching network namespace. The network namespace for all of these objects is tracked in the iscsi_cls_host structure.
--- drivers/scsi/scsi_transport_iscsi.c | 128 +++++++++++++++++++++++++++++++----- include/scsi/scsi_transport_iscsi.h | 1 + 2 files changed, 112 insertions(+), 17 deletions(-)
drivers/scsi/scsi_transport_iscsi.c +111 -17
@@ -161,9 +161,31 @@ static void iscsi_endpoint_release(struct device *dev)kfree (ep); } +static struct net *iscsi_host_net (struct iscsi_cls_host *ihost) +{ +return ihost->netns; +} + +static struct net *iscsi_endpoint_net (struct iscsi_endpoint *ep) +{ +struct Scsi_Host *shost =iscsi_endpoint_to_shost (ep); +struct iscsi_cls_host *ihost = shost->shost_data; + +return iscsi_host_net (ihost); +} + +static const void *iscsi_endpoint_namespace (struct device *dev) +{ +struct iscsi_endpoint *ep =iscsi_dev_to_endpoint (dev); + +return iscsi_endpoint_net (ep); +} +static struct class iscsi_endpoint_class = { .name ="iscsi_endpoint" , .dev_release = iscsi_endpoint_release, + .ns_type = &net_ns_type_operations, + .namespace = iscsi_endpoint_namespace, }; static ssize_t
@@ -285,10 +307,26 @@ static void iscsi_iface_release(struct device *dev)put_device (parent); } +static struct net *iscsi_iface_net (struct iscsi_iface *iface) +{ +struct Scsi_Host *shost =iscsi_iface_to_shost (iface); +struct iscsi_cls_host *ihost = shost->shost_data; + +return iscsi_host_net (ihost); +} + +static const void *iscsi_iface_namespace (struct device *dev) +{ +struct iscsi_iface *iface =iscsi_dev_to_iface (dev); + +return iscsi_iface_net (iface); +}static struct class iscsi_iface_class = { .name ="iscsi_iface" , .dev_release = iscsi_iface_release, + .ns_type = &net_ns_type_operations, + .namespace = iscsi_iface_namespace, };#define ISCSI_IFACE_ATTR (_prefix, _name, _mode, _show, _store) \
@@ -1566,6 +1604,7 @@ static int iscsi_setup_host(struct transport_container *tc, struct device *dev,memset (ihost,0 ,sizeof (*ihost));atomic_set (&ihost->nr_scans,0 );mutex_init (&ihost->mutex); + ihost->netns = &init_net;iscsi_bsg_host_add (shost, ihost);/* ignore any bsg add error - we just can't do sgio */
@@ -1586,23 +1625,78 @@ static int iscsi_remove_host(struct transport_container *tc,return 0 ; } -static DECLARE_TRANSPORT_CLASS(iscsi_host_class, -"iscsi_host" , - iscsi_setup_host, - iscsi_remove_host, - NULL); - -static DECLARE_TRANSPORT_CLASS(iscsi_session_class, -"iscsi_session" , -NULL , -NULL , - NULL); - -static DECLARE_TRANSPORT_CLASS(iscsi_connection_class, -"iscsi_connection" , -NULL , -NULL , - NULL); +#define DECLARE_TRANSPORT_CLASS_NS (cls, nm, su, rm, cfg, ns, nslookup) \ +struct transport_class cls = { \ + .class = { \ + .name = nm, \ + .ns_type = ns, \ + .namespace = nslookup, \ + }, \ + .setup = su, \ + .remove = rm, \ + .configure = cfg, \ +} + +static const void *iscsi_host_namespace (struct device *dev) +{ +struct Scsi_Host *shost =transport_class_to_shost (dev); +struct iscsi_cls_host *ihost = shost->shost_data; + +return iscsi_host_net (ihost); +} + +static DECLARE_TRANSPORT_CLASS_NS(iscsi_host_class, +"iscsi_host" , + iscsi_setup_host, + iscsi_remove_host, +NULL , + &net_ns_type_operations, + iscsi_host_namespace); + +static struct net *iscsi_sess_net (struct iscsi_cls_session *cls_session) +{ +struct Scsi_Host *shost =iscsi_session_to_shost (cls_session); +struct iscsi_cls_host *ihost = shost->shost_data; + +return iscsi_host_net (ihost); +} + +static const void *iscsi_sess_namespace (struct device *dev) +{ +struct iscsi_cls_session *cls_session =transport_class_to_session (dev); + +return iscsi_sess_net (cls_session); +} + +static DECLARE_TRANSPORT_CLASS_NS(iscsi_session_class, +"iscsi_session" , +NULL , +NULL , +NULL , + &net_ns_type_operations, + iscsi_sess_namespace); + +static struct net *iscsi_conn_net (struct iscsi_cls_conn *cls_conn) +{ +struct iscsi_cls_session *cls_session =iscsi_conn_to_session (cls_conn); + +return iscsi_sess_net (cls_session); +} + +static const void *iscsi_conn_namespace (struct device *dev) +{ +struct iscsi_cls_conn *cls_conn =transport_class_to_conn (dev); + +return iscsi_conn_net (cls_conn); +} + +static DECLARE_TRANSPORT_CLASS_NS(iscsi_connection_class, +"iscsi_connection" , +NULL , +NULL , +NULL , + &net_ns_type_operations, + iscsi_conn_namespace);struct iscsi_net {struct sock *nls;
include/scsi/scsi_transport_iscsi.h +1 -0
@@ -279,6 +279,7 @@ struct iscsi_cls_host {struct request_queue *bsg_q;uint32_t port_speed;uint32_t port_state; +struct net *netns; };#define iscsi_job_to_shost (_job) \
Signature · 1 line
2.9.5
Chris Leech
maintainerPATCH 5/9 iscsi: set netns for iscsi_tcp hosts
In reply to Chris LeechThis lets iscsi_tcp operate in multiple namespaces. It uses current during session creation to find the net namespace, but it might be better to manage to pass it along from the iscsi netlink socket.
--- drivers/scsi/iscsi_tcp.c | 7 +++++++ drivers/scsi/scsi_transport_iscsi.c | 7 ++++++- include/scsi/scsi_transport_iscsi.h | 1 + 3 files changed, 14 insertions(+), 1 deletion(-)
drivers/scsi/iscsi_tcp.c +7 -0
@@ -957,6 +957,11 @@ static int iscsi_sw_tcp_slave_configure(struct scsi_device *sdev)return 0 ; } +static struct net *iscsi_sw_tcp_netns (struct Scsi_Host *shost) +{ +return current->nsproxy->net_ns; +} +static struct scsi_host_template iscsi_sw_tcp_sht = { .module =THIS_MODULE , .name ="iSCSI Initiator over TCP/IP" ,
@@ -1013,6 +1018,8 @@ static struct iscsi_transport iscsi_sw_tcp_transport = { .alloc_pdu = iscsi_sw_tcp_pdu_alloc,/* recovery */ .session_recovery_timedout = iscsi_session_recovery_timedout, +/* net namespace */ + .get_netns = iscsi_sw_tcp_netns, };static int __init iscsi_sw_tcp_init (void )
drivers/scsi/scsi_transport_iscsi.c +6 -1
@@ -1600,11 +1600,16 @@ static int iscsi_setup_host(struct transport_container *tc, struct device *dev, {struct Scsi_Host *shost =dev_to_shost (dev);struct iscsi_cls_host *ihost = shost->shost_data; +struct iscsi_internal *priv =to_iscsi_internal (shost->transportt); +struct iscsi_transport *transport = priv->iscsi_transport;memset (ihost,0 ,sizeof (*ihost));atomic_set (&ihost->nr_scans,0 );mutex_init (&ihost->mutex); - ihost->netns = &init_net; +if (transport->get_netns) + ihost->netns = transport->get_netns (shost); +else + ihost->netns = &init_net;iscsi_bsg_host_add (shost, ihost);/* ignore any bsg add error - we just can't do sgio */
include/scsi/scsi_transport_iscsi.h +1 -0
@@ -168,6 +168,7 @@ struct iscsi_transport {int (*logout_flashnode_sid) (struct iscsi_cls_session *cls_sess);int (*get_host_stats) (struct Scsi_Host *shost,char *buf,int len);u8 (*check_protection)(struct iscsi_task *task,sector_t *sector); +struct net *(*get_netns)(struct Scsi_Host *shost); };/*
Signature · 1 line
2.9.5
Chris Leech
maintainerPATCH 6/9 iscsi: check net namespace for all iscsi lookups
In reply to Chris LeechAll internal lookups of iSCSI transport objects need to be filtered by net namespace.
--- drivers/infiniband/ulp/iser/iscsi_iser.c | 5 +- drivers/scsi/be2iscsi/be_iscsi.c | 4 +- drivers/scsi/bnx2i/bnx2i_iscsi.c | 4 +- drivers/scsi/cxgbi/libcxgbi.c | 4 +- drivers/scsi/qedi/qedi_iscsi.c | 4 +- drivers/scsi/qla4xxx/ql4_os.c | 6 +- drivers/scsi/scsi_transport_iscsi.c | 201 +++++++++++++++++++------------ include/scsi/scsi_transport_iscsi.h | 5 +- 8 files changed, 150 insertions(+), 83 deletions(-)
drivers/infiniband/ulp/iser/iscsi_iser.c +4 -1
@@ -464,15 +464,18 @@ iscsi_iser_conn_bind(struct iscsi_cls_session *cls_session,struct iscsi_conn *conn = cls_conn->dd_data;struct iser_conn *iser_conn;struct iscsi_endpoint *ep; +struct net *net;int error; error =iscsi_conn_bind (cls_session, cls_conn, is_leading);if (error)return error; +/* the transport ep handle comes from user space so it must be * verified against the global ib connections list */ - ep =iscsi_lookup_endpoint (transport_eph); + net =iscsi_sess_net (cls_session); + ep =iscsi_lookup_endpoint (net, transport_eph);if (!ep) {iser_err ("can't bind eph %llx\n" , (unsigned long long )transport_eph);
drivers/scsi/be2iscsi/be_iscsi.c +3 -1
@@ -181,8 +181,10 @@ int beiscsi_conn_bind(struct iscsi_cls_session *cls_session,struct beiscsi_endpoint *beiscsi_ep;struct iscsi_endpoint *ep;uint16_t cri_index; +struct net *net; - ep =iscsi_lookup_endpoint (transport_fd); + net =iscsi_sess_net (cls_session); + ep =iscsi_lookup_endpoint (net, transport_fd);if (!ep)return -EINVAL ;
drivers/scsi/bnx2i/bnx2i_iscsi.c +3 -1
@@ -1414,9 +1414,11 @@ static int bnx2i_conn_bind(struct iscsi_cls_session *cls_session,struct bnx2i_hba *hba =iscsi_host_priv (shost);struct bnx2i_endpoint *bnx2i_ep;struct iscsi_endpoint *ep; +struct net *net;int ret_code; - ep =iscsi_lookup_endpoint (transport_fd); + net =iscsi_sess_net (cls_session); + ep =iscsi_lookup_endpoint (net, transport_fd);if (!ep)return -EINVAL ;/*
drivers/scsi/cxgbi/libcxgbi.c +3 -1
@@ -2373,9 +2373,11 @@ int cxgbi_bind_conn(struct iscsi_cls_session *cls_session,struct iscsi_endpoint *ep;struct cxgbi_endpoint *cep;struct cxgbi_sock *csk; +struct net *net;int err; - ep =iscsi_lookup_endpoint (transport_eph); + net =iscsi_sess_net (cls_session); + ep =iscsi_lookup_endpoint (net, transport_eph);if (!ep)return -EINVAL ;
drivers/scsi/qedi/qedi_iscsi.c +3 -1
@@ -381,8 +381,10 @@ static int qedi_conn_bind(struct iscsi_cls_session *cls_session,struct qedi_ctx *qedi =iscsi_host_priv (shost);struct qedi_endpoint *qedi_ep;struct iscsi_endpoint *ep; +struct net *net; - ep =iscsi_lookup_endpoint (transport_fd); + net =iscsi_sess_net (cls_session); + ep =iscsi_lookup_endpoint (net, transport_fd);if (!ep)return -EINVAL ;
drivers/scsi/qla4xxx/ql4_os.c +5 -1
@@ -3178,6 +3178,7 @@ static int qla4xxx_conn_bind(struct iscsi_cls_session *cls_session,struct ddb_entry *ddb_entry;struct scsi_qla_host *ha;struct iscsi_session *sess; +struct net *net; sess = cls_session->dd_data; ddb_entry = sess->dd_data;
@@ -3186,9 +3187,12 @@ static int qla4xxx_conn_bind(struct iscsi_cls_session *cls_session,DEBUG2 (ql4_printk (KERN_INFO , ha,"%s: sid = %d, cid = %d\n" , __func__, cls_session->sid, cls_conn->cid)); + net =iscsi_sess_net (cls_session); + ep =iscsi_lookup_endpoint (net, transport_fd); +if (!ep) +return -EINVAL ;if (iscsi_conn_bind (cls_session, cls_conn, is_leading))return -EINVAL ; - ep =iscsi_lookup_endpoint (transport_fd); conn = cls_conn->dd_data; qla_conn = conn->dd_data; qla_conn->qla_ep = ep->dd_data;
drivers/scsi/scsi_transport_iscsi.c +125 -76
608 lines not on this page · raw message
include/scsi/scsi_transport_iscsi.h +4 -1
@@ -271,6 +271,8 @@ struct iscsi_cls_session {#define iscsi_endpoint_to_shost (_ep) \ dev_to_shost(_ep->dev.parent) +extern struct net *iscsi_sess_net (struct iscsi_cls_session *session); +#define starget_to_session (_stgt) \ iscsi_dev_to_session(_stgt->dev.parent)
@@ -448,7 +450,8 @@ extern int iscsi_scan_finished(struct Scsi_Host *shost, unsigned long time);extern struct iscsi_endpoint *iscsi_create_endpoint (struct Scsi_Host *shost,int dd_size);extern void iscsi_destroy_endpoint (struct iscsi_endpoint *ep); -extern struct iscsi_endpoint *iscsi_lookup_endpoint (u64 handle); +extern struct iscsi_endpoint *iscsi_lookup_endpoint (struct net *net, +u64 handle);extern int iscsi_block_scsi_eh (struct scsi_cmnd *cmd); extern struct iscsi_iface *iscsi_create_iface(struct Scsi_Host *shost, struct iscsi_transport *t,
Signature · 1 line
2.9.5
Chris Leech
maintainerPATCH 7/9 iscsi: convert flashnode devices from bus to class
In reply to Chris LeechThe flashnode session and connection devices should be filtered by net namespace along with the iscsi_host, but we can't do that with a bus device. As these don't use any of the bus matching functionality, they make more sense as a class device anyway.
--- drivers/scsi/qla4xxx/ql4_os.c | 2 +- drivers/scsi/scsi_transport_iscsi.c | 36 +++++++++++++++--------------------- include/scsi/scsi_transport_iscsi.h | 2 ++ 3 files changed, 18 insertions(+), 22 deletions(-)
drivers/scsi/qla4xxx/ql4_os.c +1 -1
@@ -7164,7 +7164,7 @@ static int qla4xxx_sysfs_ddb_is_non_persistent(struct device *dev, void *data) {struct iscsi_bus_flash_session *fnode_sess; -if (!iscsi_flashnode_bus_match (dev,NULL )) +if (!iscsi_is_flashnode_session_dev (dev))return 0 ; fnode_sess =iscsi_dev_to_flash_session (dev);
drivers/scsi/scsi_transport_iscsi.c +15 -21
@@ -1060,6 +1060,12 @@ static const struct device_type iscsi_flashnode_sess_dev_type = { .release = iscsi_flashnode_sess_release, }; +bool iscsi_is_flashnode_session_dev (struct device *dev) +{ +return dev->type == &iscsi_flashnode_sess_dev_type; +} +EXPORT_SYMBOL_GPL (iscsi_is_flashnode_session_dev); +/* flash node connection attrs show */ #define iscsi_flashnode_conn_attr_show (type, name, param) \ static ssize_t \
@@ -1246,20 +1252,8 @@ static const struct device_type iscsi_flashnode_conn_dev_type = { .release = iscsi_flashnode_conn_release, }; -static struct bus_type iscsi_flashnode_bus; - -int iscsi_flashnode_bus_match (struct device *dev, -struct device_driver *drv) -{ -if (dev->bus == &iscsi_flashnode_bus) -return 1 ; -return 0 ; -} -EXPORT_SYMBOL_GPL (iscsi_flashnode_bus_match); - -static struct bus_type iscsi_flashnode_bus = { +static struct class iscsi_flashnode_bus = { .name ="iscsi_flashnode" , - .match = &iscsi_flashnode_bus_match, };/**
@@ -1290,7 +1284,7 @@ iscsi_create_flashnode_sess(struct Scsi_Host *shost, int index, fnode_sess->transport = transport; fnode_sess->target_id = index; fnode_sess->dev.type = &iscsi_flashnode_sess_dev_type; - fnode_sess->dev.bus = &iscsi_flashnode_bus; + fnode_sess->dev.class = &iscsi_flashnode_bus; fnode_sess->dev.parent = &shost->shost_gendev;dev_set_name (&fnode_sess->dev,"flashnode_sess-%u:%u" , shost->host_no, index);
@@ -1338,7 +1332,7 @@ iscsi_create_flashnode_conn(struct Scsi_Host *shost, fnode_conn->transport = transport; fnode_conn->dev.type = &iscsi_flashnode_conn_dev_type; - fnode_conn->dev.bus = &iscsi_flashnode_bus; + fnode_conn->dev.class = &iscsi_flashnode_bus; fnode_conn->dev.parent = &fnode_sess->dev;dev_set_name (&fnode_conn->dev,"flashnode_conn-%u:%u:0" , shost->host_no, fnode_sess->target_id);
@@ -1371,7 +1365,7 @@ EXPORT_SYMBOL_GPL(iscsi_create_flashnode_conn);*/ static int iscsi_is_flashnode_conn_dev (struct device *dev,void *data) { -return dev->bus == &iscsi_flashnode_bus; +return dev->type == &iscsi_flashnode_conn_dev_type; }static int iscsi_destroy_flashnode_conn (struct iscsi_bus_flash_conn *fnode_conn)
@@ -1385,7 +1379,7 @@ static int flashnode_match_index(struct device *dev, void *data)struct iscsi_bus_flash_session *fnode_sess =NULL ;int ret =0 ; -if (!iscsi_flashnode_bus_match (dev,NULL )) +if (dev->type != &iscsi_flashnode_sess_dev_type) goto exit_match_index; fnode_sess =iscsi_dev_to_flash_session (dev);
@@ -1491,7 +1485,7 @@ EXPORT_SYMBOL_GPL(iscsi_destroy_flashnode_sess);static int iscsi_iter_destroy_flashnode_fn (struct device *dev,void *data) { -if (!iscsi_flashnode_bus_match (dev,NULL )) +if (dev->type != &iscsi_flashnode_sess_dev_type)return 0 ;iscsi_destroy_flashnode_sess (iscsi_dev_to_flash_session (dev));
@@ -4752,7 +4746,7 @@ static __init int iscsi_transport_init(void)if (err) goto unregister_conn_class; - err =bus_register (&iscsi_flashnode_bus); + err =class_register (&iscsi_flashnode_bus);if (err) goto unregister_session_class;
@@ -4773,7 +4767,7 @@ static __init int iscsi_transport_init(void) unregister_pernet_subsys:unregister_pernet_subsys (&iscsi_net_ops); unregister_flashnode_bus: -bus_unregister (&iscsi_flashnode_bus); +class_unregister (&iscsi_flashnode_bus); unregister_session_class:transport_class_unregister (&iscsi_session_class); unregister_conn_class:
@@ -4793,7 +4787,7 @@ static void __exit iscsi_transport_exit(void) {destroy_workqueue (iscsi_eh_timer_workq);unregister_pernet_subsys (&iscsi_net_ops); -bus_unregister (&iscsi_flashnode_bus); +class_unregister (&iscsi_flashnode_bus);transport_class_unregister (&iscsi_connection_class);transport_class_unregister (&iscsi_session_class);transport_class_unregister (&iscsi_host_class);
include/scsi/scsi_transport_iscsi.h +2 -0
@@ -489,6 +489,8 @@ iscsi_find_flashnode_sess(struct Scsi_Host *shost, void *data,extern struct device *iscsi_find_flashnode_conn (struct iscsi_bus_flash_session *fnode_sess); +extern bool iscsi_is_flashnode_session_dev (struct device *dev); +extern char *iscsi_get_ipaddress_state_name (enum iscsi_ipaddress_state port_state);extern char *iscsi_get_router_state_name (enum iscsi_router_state router_state);
Signature · 1 line
2.9.5
Chris Leech
maintainerPATCH 8/9 iscsi: rename iscsi_bus_flash_* to iscsi_flash_*
In reply to Chris Leechcleanups after the bus to class conversion
--- drivers/scsi/qla4xxx/ql4_os.c | 52 +++++++++--------- drivers/scsi/scsi_transport_iscsi.c | 102 ++++++++++++++++++------------------ include/scsi/scsi_transport_iscsi.h | 48 +++++++++-------- 3 files changed, 102 insertions(+), 100 deletions(-)
drivers/scsi/qla4xxx/ql4_os.c +26 -26
@@ -169,20 +169,20 @@ static int qla4xxx_host_reset(struct Scsi_Host *shost, int reset_type);* iSCSI Flash DDB sysfs entry points */ static int -qla4xxx_sysfs_ddb_set_param (struct iscsi_bus_flash_session *fnode_sess, -struct iscsi_bus_flash_conn *fnode_conn, +qla4xxx_sysfs_ddb_set_param (struct iscsi_flash_session *fnode_sess, +struct iscsi_flash_conn *fnode_conn,void *data,int len);static int -qla4xxx_sysfs_ddb_get_param (struct iscsi_bus_flash_session *fnode_sess, +qla4xxx_sysfs_ddb_get_param (struct iscsi_flash_session *fnode_sess,int param,char *buf);static int qla4xxx_sysfs_ddb_add (struct Scsi_Host *shost,const char *buf,int len);static int -qla4xxx_sysfs_ddb_delete (struct iscsi_bus_flash_session *fnode_sess); -static int qla4xxx_sysfs_ddb_login (struct iscsi_bus_flash_session *fnode_sess, -struct iscsi_bus_flash_conn *fnode_conn); -static int qla4xxx_sysfs_ddb_logout (struct iscsi_bus_flash_session *fnode_sess, -struct iscsi_bus_flash_conn *fnode_conn); +qla4xxx_sysfs_ddb_delete (struct iscsi_flash_session *fnode_sess); +static int qla4xxx_sysfs_ddb_login (struct iscsi_flash_session *fnode_sess, +struct iscsi_flash_conn *fnode_conn); +static int qla4xxx_sysfs_ddb_logout (struct iscsi_flash_session *fnode_sess, +struct iscsi_flash_conn *fnode_conn);static int qla4xxx_sysfs_ddb_logout_sid (struct iscsi_cls_session *cls_sess); static struct qla4_8xxx_legacy_intr_set legacy_intr[] =
@@ -3454,8 +3454,8 @@ static int qla4xxx_task_xmit(struct iscsi_task *task)return -ENOSYS ; } -static int qla4xxx_copy_from_fwddb_param (struct iscsi_bus_flash_session *sess, -struct iscsi_bus_flash_conn *conn, +static int qla4xxx_copy_from_fwddb_param (struct iscsi_flash_session *sess, +struct iscsi_flash_conn *conn,struct dev_db_entry *fw_ddb_entry) {unsigned long options =0 ;
@@ -3596,8 +3596,8 @@ static int qla4xxx_copy_from_fwddb_param(struct iscsi_bus_flash_session *sess,return rc; } -static int qla4xxx_copy_to_fwddb_param (struct iscsi_bus_flash_session *sess, -struct iscsi_bus_flash_conn *conn, +static int qla4xxx_copy_to_fwddb_param (struct iscsi_flash_session *sess, +struct iscsi_flash_conn *conn,struct dev_db_entry *fw_ddb_entry) {uint16_t options;
@@ -7162,7 +7162,7 @@ static void qla4xxx_build_new_nt_list(struct scsi_qla_host *ha,**/ static int qla4xxx_sysfs_ddb_is_non_persistent (struct device *dev,void *data) { -struct iscsi_bus_flash_session *fnode_sess; +struct iscsi_flash_session *fnode_sess;if (!iscsi_is_flashnode_session_dev (dev))return 0 ;
@@ -7192,8 +7192,8 @@ static int qla4xxx_sysfs_ddb_tgt_create(struct scsi_qla_host *ha,struct dev_db_entry *fw_ddb_entry, uint16_t *idx, int user) { - struct iscsi_bus_flash_session *fnode_sess = NULL; -struct iscsi_bus_flash_conn *fnode_conn =NULL ; + struct iscsi_flash_session *fnode_sess = NULL; +struct iscsi_flash_conn *fnode_conn =NULL ;int rc =QLA_ERROR ; fnode_sess = iscsi_create_flashnode_sess(ha->host, *idx,
@@ -7330,8 +7330,8 @@ static int qla4xxx_sysfs_ddb_add(struct Scsi_Host *shost, const char *buf,* This writes the contents of target ddb buffer to Flash with a valid cookie * value in order to make the ddb entry persistent. **/ -static int qla4xxx_sysfs_ddb_apply (struct iscsi_bus_flash_session *fnode_sess, -struct iscsi_bus_flash_conn *fnode_conn) +static int qla4xxx_sysfs_ddb_apply (struct iscsi_flash_session *fnode_sess, +struct iscsi_flash_conn *fnode_conn) {struct Scsi_Host *shost =iscsi_flash_session_to_shost (fnode_sess);struct scsi_qla_host *ha =to_qla_host (shost);
@@ -7520,8 +7520,8 @@ static int qla4xxx_ddb_login_nt(struct scsi_qla_host *ha,* * This logs in to the specified target **/ -static int qla4xxx_sysfs_ddb_login (struct iscsi_bus_flash_session *fnode_sess, -struct iscsi_bus_flash_conn *fnode_conn) +static int qla4xxx_sysfs_ddb_login (struct iscsi_flash_session *fnode_sess, +struct iscsi_flash_conn *fnode_conn) {struct Scsi_Host *shost =iscsi_flash_session_to_shost (fnode_sess);struct scsi_qla_host *ha =to_qla_host (shost);
@@ -7704,8 +7704,8 @@ static int qla4xxx_sysfs_ddb_logout_sid(struct iscsi_cls_session *cls_sess)* * This performs log out from the specified target **/ -static int qla4xxx_sysfs_ddb_logout (struct iscsi_bus_flash_session *fnode_sess, -struct iscsi_bus_flash_conn *fnode_conn) +static int qla4xxx_sysfs_ddb_logout (struct iscsi_flash_session *fnode_sess, +struct iscsi_flash_conn *fnode_conn) {struct Scsi_Host *shost =iscsi_flash_session_to_shost (fnode_sess);struct scsi_qla_host *ha =to_qla_host (shost);
@@ -7816,12 +7816,12 @@ static int qla4xxx_sysfs_ddb_logout(struct iscsi_bus_flash_session *fnode_sess, }static int -qla4xxx_sysfs_ddb_get_param (struct iscsi_bus_flash_session *fnode_sess, +qla4xxx_sysfs_ddb_get_param (struct iscsi_flash_session *fnode_sess,int param,char *buf) {struct Scsi_Host *shost =iscsi_flash_session_to_shost (fnode_sess);struct scsi_qla_host *ha =to_qla_host (shost); -struct iscsi_bus_flash_conn *fnode_conn; +struct iscsi_flash_conn *fnode_conn;struct ql4_chap_table chap_tbl;struct device *dev;int parent_type;
@@ -8070,8 +8070,8 @@ qla4xxx_sysfs_ddb_get_param(struct iscsi_bus_flash_session *fnode_sess,* This sets the parameter of flash ddb entry and writes them to flash **/ static int -qla4xxx_sysfs_ddb_set_param (struct iscsi_bus_flash_session *fnode_sess, -struct iscsi_bus_flash_conn *fnode_conn, +qla4xxx_sysfs_ddb_set_param (struct iscsi_flash_session *fnode_sess, +struct iscsi_flash_conn *fnode_conn,void *data,int len) {struct Scsi_Host *shost =iscsi_flash_session_to_shost (fnode_sess);
@@ -8298,7 +8298,7 @@ qla4xxx_sysfs_ddb_set_param(struct iscsi_bus_flash_session *fnode_sess,* * This invalidates the flash ddb entry at the given index **/ -static int qla4xxx_sysfs_ddb_delete (struct iscsi_bus_flash_session *fnode_sess) +static int qla4xxx_sysfs_ddb_delete (struct iscsi_flash_session *fnode_sess) {struct Scsi_Host *shost =iscsi_flash_session_to_shost (fnode_sess);struct scsi_qla_host *ha =to_qla_host (shost);
drivers/scsi/scsi_transport_iscsi.c +51 -51
268 lines not on this page · raw message
include/scsi/scsi_transport_iscsi.h +25 -23
103 lines not on this page · raw message
Signature · 1 line
2.9.5
Chris Leech
maintainerPATCH 9/9 iscsi: filter flashnode sysfs by net namespace
In reply to Chris LeechFinished the net namespace support for flashnode sysfs devices
--- drivers/scsi/scsi_transport_iscsi.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+)
drivers/scsi/scsi_transport_iscsi.c +33 -0
@@ -1268,8 +1268,41 @@ static int iscsi_is_flashnode_conn_dev(struct device *dev, void *data)return dev->type == &iscsi_flashnode_conn_dev_type; } +static struct net *iscsi_flashnode_sess_net (struct iscsi_flash_session *f_sess) +{ +struct Scsi_Host *shost =iscsi_flash_session_to_shost (f_sess); +struct iscsi_cls_host *ihost = shost->shost_data; + +return iscsi_host_net (ihost); +} + +static struct net *iscsi_flashnode_conn_net (struct iscsi_flash_conn *f_conn) +{ +struct iscsi_flash_session *f_sess = +iscsi_flash_conn_to_flash_session (f_conn); + +return iscsi_flashnode_sess_net (f_sess); +} + +static const void *iscsi_flashnode_namespace (struct device *dev) +{ +struct iscsi_flash_conn *f_conn; +struct iscsi_flash_session *f_sess; + +if (iscsi_is_flashnode_conn_dev (dev,NULL )) { + f_conn =iscsi_dev_to_flash_conn (dev); +return iscsi_flashnode_conn_net (f_conn); + }else if (iscsi_is_flashnode_session_dev (dev)) { + f_sess =iscsi_dev_to_flash_session (dev); +return iscsi_flashnode_sess_net (f_sess); + } +return NULL ; +} +static struct class iscsi_flashnode = { .name ="iscsi_flashnode" , + .ns_type = &net_ns_type_operations, + .namespace = iscsi_flashnode_namespace, };/**
Signature · 1 line
2.9.5
James Bottomley
maintainerRe: network namespace, netlink and sysfs changes for iSCSI (Re: [PATCH 0/9] use network namespace for iSCSI control interfaces)
In reply to Chris LeechQuoted 5 lines · Chris Leech
Hello,
I have this set of changes to the iSCSI control interfaces pending review, but seeing as it's sysfs and netlink changes there's not a lot of feedback from linux-scsi.
Well, it's a bit unlikely that they understand network namespaces.
Quoted 2 lines
I was hoping I could get a brief review on the adding of network namespace support here.
Most network namespace work is done on [email protected], but they probably won't understand all the SCSI bits, but perhaps they don't need to; it's basically the netlink and the filters, right?
The other list that would take a more generic view is the containers one [email protected] because that's where most namespace stuff ends up.
James
Quoted 53 lines
Thank you,
ChrisQuoted 48 lines · Chris Leech
This series of changes makes the iSCSI netlink and sysfs control interfaces filtered by network namespace. This is required to run iscsid in any network namespace other than the initial default one.
Currently the netlink communication will fail if iscsid is started in a non-default network namespace, as there is no kernel side socket. After fixing that, the rest of these changes are to filter visibility of the iSCSI transport objects by netns. This allows for multiple iscsid instances to be run, one per netns, each controlling it's own set of iSCSI sessions.
The iSCSI transport objects are filtered, but not the SCSI or block layer devices. So while iSCSI hosts and sessions become limited to a network namespace, any attached devices remain visible system wide.
This currently only supports
iscsi_tcprunning in a new namespace, as it creates a virtual host per session. Support could be added later to allow assignment of iSCSI HBAs to network namespace, much as is done for network interfaces.Chris Leech (9):
iscsi: create per-net iscsi netlink kernel sockets
iscsi: associate endpoints with a host
iscsi: sysfs filtering by network namespace
iscsi: make all iSCSI netlink multicast namespace aware
iscsi: set netns foriscsi_tcphosts
iscsi: check net namespace for all iscsi lookups
iscsi: convert flashnode devices from bus to class
iscsi: rename iscsi_bus_flash_* to iscsi_flash_*
iscsi: filter flashnode sysfs by net namespacedrivers/infiniband/ulp/iser/iscsi_iser.c | 7 +- drivers/scsi/be2iscsi/be_iscsi.c | 6 +- drivers/scsi/bnx2i/bnx2i_iscsi.c | 6 +- drivers/scsi/cxgbi/libcxgbi.c | 6 +- drivers/scsi/iscsi_tcp.c | 7 + drivers/scsi/qedi/qedi_iscsi.c | 6 +- drivers/scsi/qla4xxx/ql4_os.c | 62 +-- drivers/scsi/scsi_transport_iscsi.c | 625
++++++++++++++++++++++---------
include/scsi/scsi_transport_iscsi.h | 63 ++--9 files changed, 538 insertions(+), 250 deletions(-)--
2.9.5
A message that is not in the archive (sent off-list or not yet received): 1510087526.3118.37.camel-d9PhHud1JfjCXq6kfMZ53/[email protected]
Re: network namespace, netlink and sysfs changes for iSCSI (Re: [PATCH 0/9] use network namespace for iSCSI control interfaces)
Quoted 8 lines · James Bottomley
Quoted 5 lines · Chris Leech
Hello,
I have this set of changes to the iSCSI control interfaces pending review, but seeing as it's sysfs and netlink changes there's not a lot of feedback from linux-scsi.
Well, it's a bit unlikely that they understand network namespaces.
I get that, just looking for suggestions of the right place to go before going to crazy with the cross posting.
Quoted 10 lines
Quoted 2 lines
I was hoping I could get a brief review on the adding of network namespace support here.
Most network namespace work is done on [email protected], but they probably won't understand all the SCSI bits, but perhaps they don't
need to; it's basically the netlink and the filters, right?The other list that would take a more generic view is the containers
one containers-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org because that's where most namespace stuff ends up.
Thanks James, the container list isn't one I would have come up with.
Chris
Quoted 59 lines
James
Quoted 53 lines
Thank you,
ChrisQuoted 48 lines · Chris Leech
This series of changes makes the iSCSI netlink and sysfs control interfaces filtered by network namespace. This is required to run iscsid in any network namespace other than the initial default one.
Currently the netlink communication will fail if iscsid is started in a non-default network namespace, as there is no kernel side socket. After fixing that, the rest of these changes are to filter visibility of the iSCSI transport objects by netns. This allows for multiple iscsid instances to be run, one per netns, each controlling it's own set of iSCSI sessions.
The iSCSI transport objects are filtered, but not the SCSI or block layer devices. So while iSCSI hosts and sessions become limited to a network namespace, any attached devices remain visible system wide.
This currently only supports
iscsi_tcprunning in a new namespace, as it creates a virtual host per session. Support could be added later to allow assignment of iSCSI HBAs to network namespace, much as is done for network interfaces.Chris Leech (9):
iscsi: create per-net iscsi netlink kernel sockets
iscsi: associate endpoints with a host
iscsi: sysfs filtering by network namespace
iscsi: make all iSCSI netlink multicast namespace aware
iscsi: set netns foriscsi_tcphosts
iscsi: check net namespace for all iscsi lookups
iscsi: convert flashnode devices from bus to class
iscsi: rename iscsi_bus_flash_* to iscsi_flash_*
iscsi: filter flashnode sysfs by net namespacedrivers/infiniband/ulp/iser/iscsi_iser.c | 7 +- drivers/scsi/be2iscsi/be_iscsi.c | 6 +- drivers/scsi/bnx2i/bnx2i_iscsi.c | 6 +- drivers/scsi/cxgbi/libcxgbi.c | 6 +- drivers/scsi/iscsi_tcp.c | 7 + drivers/scsi/qedi/qedi_iscsi.c | 6 +- drivers/scsi/qla4xxx/ql4_os.c | 62 +-- drivers/scsi/scsi_transport_iscsi.c | 625
++++++++++++++++++++++---------
include/scsi/scsi_transport_iscsi.h | 63 ++--9 files changed, 538 insertions(+), 250 deletions(-)--
2.9.5
Signature · 5 lines
You received this message because you are subscribed to the Google Groups "open-iscsi" group. To unsubscribe from this group and stop receiving emails from it, send an email to open-iscsi+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/[email protected] To post to this group, send email to open-iscsi-/JYPxA39Uh5TLH3MbocFF+G/[email protected] Visit this group at https://groups.google.com/group/open-iscsi. For more options, visit https://groups.google.com/d/optout.