Skip to content

Commit 790f39a

Browse files
Mike ChristieJames Bottomley
authored andcommitted
[SCSI] iscsi: support mutiple daemons
Patch from david.somayajulu@qlogic.com and cleaned up by Tomo. qla4xxx is going to have a different daemon so this patch just routes the events to the right daemon. Signed-off-by: Mike Christie <michaelc@cs.wisc.edu> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
1 parent ffbfe92 commit 790f39a

File tree

1 file changed

+27
-11
lines changed

1 file changed

+27
-11
lines changed

drivers/scsi/scsi_transport_iscsi.c

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
#define ISCSI_HOST_ATTRS 0
3737

3838
struct iscsi_internal {
39+
int daemon_pid;
3940
struct scsi_transport_template t;
4041
struct iscsi_transport *iscsi_transport;
4142
struct list_head list;
@@ -145,7 +146,6 @@ static DECLARE_TRANSPORT_CLASS(iscsi_connection_class,
145146
NULL);
146147

147148
static struct sock *nls;
148-
static int daemon_pid;
149149
static DEFINE_MUTEX(rx_queue_mutex);
150150

151151
struct mempool_zone {
@@ -572,13 +572,13 @@ mempool_zone_get_skb(struct mempool_zone *zone)
572572
}
573573

574574
static int
575-
iscsi_unicast_skb(struct mempool_zone *zone, struct sk_buff *skb)
575+
iscsi_unicast_skb(struct mempool_zone *zone, struct sk_buff *skb, int pid)
576576
{
577577
unsigned long flags;
578578
int rc;
579579

580580
skb_get(skb);
581-
rc = netlink_unicast(nls, skb, daemon_pid, MSG_DONTWAIT);
581+
rc = netlink_unicast(nls, skb, pid, MSG_DONTWAIT);
582582
if (rc < 0) {
583583
mempool_free(skb, zone->pool);
584584
printk(KERN_ERR "iscsi: can not unicast skb (%d)\n", rc);
@@ -600,9 +600,14 @@ int iscsi_recv_pdu(struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr,
600600
struct sk_buff *skb;
601601
struct iscsi_uevent *ev;
602602
char *pdu;
603+
struct iscsi_internal *priv;
603604
int len = NLMSG_SPACE(sizeof(*ev) + sizeof(struct iscsi_hdr) +
604605
data_size);
605606

607+
priv = iscsi_if_transport_lookup(conn->transport);
608+
if (!priv)
609+
return -EINVAL;
610+
606611
mempool_zone_complete(conn->z_pdu);
607612

608613
skb = mempool_zone_get_skb(conn->z_pdu);
@@ -613,7 +618,7 @@ int iscsi_recv_pdu(struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr,
613618
return -ENOMEM;
614619
}
615620

616-
nlh = __nlmsg_put(skb, daemon_pid, 0, 0, (len - sizeof(*nlh)), 0);
621+
nlh = __nlmsg_put(skb, priv->daemon_pid, 0, 0, (len - sizeof(*nlh)), 0);
617622
ev = NLMSG_DATA(nlh);
618623
memset(ev, 0, sizeof(*ev));
619624
ev->transport_handle = iscsi_handle(conn->transport);
@@ -626,7 +631,7 @@ int iscsi_recv_pdu(struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr,
626631
memcpy(pdu, hdr, sizeof(struct iscsi_hdr));
627632
memcpy(pdu + sizeof(struct iscsi_hdr), data, data_size);
628633

629-
return iscsi_unicast_skb(conn->z_pdu, skb);
634+
return iscsi_unicast_skb(conn->z_pdu, skb, priv->daemon_pid);
630635
}
631636
EXPORT_SYMBOL_GPL(iscsi_recv_pdu);
632637

@@ -635,8 +640,13 @@ void iscsi_conn_error(struct iscsi_cls_conn *conn, enum iscsi_err error)
635640
struct nlmsghdr *nlh;
636641
struct sk_buff *skb;
637642
struct iscsi_uevent *ev;
643+
struct iscsi_internal *priv;
638644
int len = NLMSG_SPACE(sizeof(*ev));
639645

646+
priv = iscsi_if_transport_lookup(conn->transport);
647+
if (!priv)
648+
return;
649+
640650
mempool_zone_complete(conn->z_error);
641651

642652
skb = mempool_zone_get_skb(conn->z_error);
@@ -646,7 +656,7 @@ void iscsi_conn_error(struct iscsi_cls_conn *conn, enum iscsi_err error)
646656
return;
647657
}
648658

649-
nlh = __nlmsg_put(skb, daemon_pid, 0, 0, (len - sizeof(*nlh)), 0);
659+
nlh = __nlmsg_put(skb, priv->daemon_pid, 0, 0, (len - sizeof(*nlh)), 0);
650660
ev = NLMSG_DATA(nlh);
651661
ev->transport_handle = iscsi_handle(conn->transport);
652662
ev->type = ISCSI_KEVENT_CONN_ERROR;
@@ -656,7 +666,7 @@ void iscsi_conn_error(struct iscsi_cls_conn *conn, enum iscsi_err error)
656666
ev->r.connerror.cid = conn->cid;
657667
ev->r.connerror.sid = iscsi_conn_get_sid(conn);
658668

659-
iscsi_unicast_skb(conn->z_error, skb);
669+
iscsi_unicast_skb(conn->z_error, skb, priv->daemon_pid);
660670

661671
dev_printk(KERN_INFO, &conn->dev, "iscsi: detected conn error (%d)\n",
662672
error);
@@ -686,7 +696,7 @@ iscsi_if_send_reply(int pid, int seq, int type, int done, int multi,
686696
nlh = __nlmsg_put(skb, pid, seq, t, (len - sizeof(*nlh)), 0);
687697
nlh->nlmsg_flags = flags;
688698
memcpy(NLMSG_DATA(nlh), payload, size);
689-
return iscsi_unicast_skb(z_reply, skb);
699+
return iscsi_unicast_skb(z_reply, skb, pid);
690700
}
691701

692702
static int
@@ -698,12 +708,17 @@ iscsi_if_get_stats(struct iscsi_transport *transport, struct nlmsghdr *nlh)
698708
struct iscsi_cls_conn *conn;
699709
struct nlmsghdr *nlhstat;
700710
struct iscsi_uevent *evstat;
711+
struct iscsi_internal *priv;
701712
int len = NLMSG_SPACE(sizeof(*ev) +
702713
sizeof(struct iscsi_stats) +
703714
sizeof(struct iscsi_stats_custom) *
704715
ISCSI_STATS_CUSTOM_MAX);
705716
int err = 0;
706717

718+
priv = iscsi_if_transport_lookup(transport);
719+
if (!priv)
720+
return -EINVAL;
721+
707722
conn = iscsi_conn_lookup(ev->u.get_stats.sid, ev->u.get_stats.cid);
708723
if (!conn)
709724
return -EEXIST;
@@ -720,7 +735,7 @@ iscsi_if_get_stats(struct iscsi_transport *transport, struct nlmsghdr *nlh)
720735
return -ENOMEM;
721736
}
722737

723-
nlhstat = __nlmsg_put(skbstat, daemon_pid, 0, 0,
738+
nlhstat = __nlmsg_put(skbstat, priv->daemon_pid, 0, 0,
724739
(len - sizeof(*nlhstat)), 0);
725740
evstat = NLMSG_DATA(nlhstat);
726741
memset(evstat, 0, sizeof(*evstat));
@@ -746,7 +761,7 @@ iscsi_if_get_stats(struct iscsi_transport *transport, struct nlmsghdr *nlh)
746761
skb_trim(skbstat, NLMSG_ALIGN(actual_size));
747762
nlhstat->nlmsg_len = actual_size;
748763

749-
err = iscsi_unicast_skb(conn->z_pdu, skbstat);
764+
err = iscsi_unicast_skb(conn->z_pdu, skbstat, priv->daemon_pid);
750765
} while (err < 0 && err != -ECONNREFUSED);
751766

752767
return err;
@@ -981,6 +996,8 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
981996
if (!try_module_get(transport->owner))
982997
return -EINVAL;
983998

999+
priv->daemon_pid = NETLINK_CREDS(skb)->pid;
1000+
9841001
switch (nlh->nlmsg_type) {
9851002
case ISCSI_UEVENT_CREATE_SESSION:
9861003
err = iscsi_if_create_session(priv, ev);
@@ -1073,7 +1090,6 @@ iscsi_if_rx(struct sock *sk, int len)
10731090
skb_pull(skb, skb->len);
10741091
goto free_skb;
10751092
}
1076-
daemon_pid = NETLINK_CREDS(skb)->pid;
10771093

10781094
while (skb->len >= NLMSG_SPACE(0)) {
10791095
int err;

0 commit comments

Comments
 (0)