36
36
#define ISCSI_HOST_ATTRS 0
37
37
38
38
struct iscsi_internal {
39
+ int daemon_pid ;
39
40
struct scsi_transport_template t ;
40
41
struct iscsi_transport * iscsi_transport ;
41
42
struct list_head list ;
@@ -145,7 +146,6 @@ static DECLARE_TRANSPORT_CLASS(iscsi_connection_class,
145
146
NULL) ;
146
147
147
148
static struct sock * nls ;
148
- static int daemon_pid ;
149
149
static DEFINE_MUTEX (rx_queue_mutex );
150
150
151
151
struct mempool_zone {
@@ -572,13 +572,13 @@ mempool_zone_get_skb(struct mempool_zone *zone)
572
572
}
573
573
574
574
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 )
576
576
{
577
577
unsigned long flags ;
578
578
int rc ;
579
579
580
580
skb_get (skb );
581
- rc = netlink_unicast (nls , skb , daemon_pid , MSG_DONTWAIT );
581
+ rc = netlink_unicast (nls , skb , pid , MSG_DONTWAIT );
582
582
if (rc < 0 ) {
583
583
mempool_free (skb , zone -> pool );
584
584
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,
600
600
struct sk_buff * skb ;
601
601
struct iscsi_uevent * ev ;
602
602
char * pdu ;
603
+ struct iscsi_internal * priv ;
603
604
int len = NLMSG_SPACE (sizeof (* ev ) + sizeof (struct iscsi_hdr ) +
604
605
data_size );
605
606
607
+ priv = iscsi_if_transport_lookup (conn -> transport );
608
+ if (!priv )
609
+ return - EINVAL ;
610
+
606
611
mempool_zone_complete (conn -> z_pdu );
607
612
608
613
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,
613
618
return - ENOMEM ;
614
619
}
615
620
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 );
617
622
ev = NLMSG_DATA (nlh );
618
623
memset (ev , 0 , sizeof (* ev ));
619
624
ev -> transport_handle = iscsi_handle (conn -> transport );
@@ -626,7 +631,7 @@ int iscsi_recv_pdu(struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr,
626
631
memcpy (pdu , hdr , sizeof (struct iscsi_hdr ));
627
632
memcpy (pdu + sizeof (struct iscsi_hdr ), data , data_size );
628
633
629
- return iscsi_unicast_skb (conn -> z_pdu , skb );
634
+ return iscsi_unicast_skb (conn -> z_pdu , skb , priv -> daemon_pid );
630
635
}
631
636
EXPORT_SYMBOL_GPL (iscsi_recv_pdu );
632
637
@@ -635,8 +640,13 @@ void iscsi_conn_error(struct iscsi_cls_conn *conn, enum iscsi_err error)
635
640
struct nlmsghdr * nlh ;
636
641
struct sk_buff * skb ;
637
642
struct iscsi_uevent * ev ;
643
+ struct iscsi_internal * priv ;
638
644
int len = NLMSG_SPACE (sizeof (* ev ));
639
645
646
+ priv = iscsi_if_transport_lookup (conn -> transport );
647
+ if (!priv )
648
+ return ;
649
+
640
650
mempool_zone_complete (conn -> z_error );
641
651
642
652
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)
646
656
return ;
647
657
}
648
658
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 );
650
660
ev = NLMSG_DATA (nlh );
651
661
ev -> transport_handle = iscsi_handle (conn -> transport );
652
662
ev -> type = ISCSI_KEVENT_CONN_ERROR ;
@@ -656,7 +666,7 @@ void iscsi_conn_error(struct iscsi_cls_conn *conn, enum iscsi_err error)
656
666
ev -> r .connerror .cid = conn -> cid ;
657
667
ev -> r .connerror .sid = iscsi_conn_get_sid (conn );
658
668
659
- iscsi_unicast_skb (conn -> z_error , skb );
669
+ iscsi_unicast_skb (conn -> z_error , skb , priv -> daemon_pid );
660
670
661
671
dev_printk (KERN_INFO , & conn -> dev , "iscsi: detected conn error (%d)\n" ,
662
672
error );
@@ -686,7 +696,7 @@ iscsi_if_send_reply(int pid, int seq, int type, int done, int multi,
686
696
nlh = __nlmsg_put (skb , pid , seq , t , (len - sizeof (* nlh )), 0 );
687
697
nlh -> nlmsg_flags = flags ;
688
698
memcpy (NLMSG_DATA (nlh ), payload , size );
689
- return iscsi_unicast_skb (z_reply , skb );
699
+ return iscsi_unicast_skb (z_reply , skb , pid );
690
700
}
691
701
692
702
static int
@@ -698,12 +708,17 @@ iscsi_if_get_stats(struct iscsi_transport *transport, struct nlmsghdr *nlh)
698
708
struct iscsi_cls_conn * conn ;
699
709
struct nlmsghdr * nlhstat ;
700
710
struct iscsi_uevent * evstat ;
711
+ struct iscsi_internal * priv ;
701
712
int len = NLMSG_SPACE (sizeof (* ev ) +
702
713
sizeof (struct iscsi_stats ) +
703
714
sizeof (struct iscsi_stats_custom ) *
704
715
ISCSI_STATS_CUSTOM_MAX );
705
716
int err = 0 ;
706
717
718
+ priv = iscsi_if_transport_lookup (transport );
719
+ if (!priv )
720
+ return - EINVAL ;
721
+
707
722
conn = iscsi_conn_lookup (ev -> u .get_stats .sid , ev -> u .get_stats .cid );
708
723
if (!conn )
709
724
return - EEXIST ;
@@ -720,7 +735,7 @@ iscsi_if_get_stats(struct iscsi_transport *transport, struct nlmsghdr *nlh)
720
735
return - ENOMEM ;
721
736
}
722
737
723
- nlhstat = __nlmsg_put (skbstat , daemon_pid , 0 , 0 ,
738
+ nlhstat = __nlmsg_put (skbstat , priv -> daemon_pid , 0 , 0 ,
724
739
(len - sizeof (* nlhstat )), 0 );
725
740
evstat = NLMSG_DATA (nlhstat );
726
741
memset (evstat , 0 , sizeof (* evstat ));
@@ -746,7 +761,7 @@ iscsi_if_get_stats(struct iscsi_transport *transport, struct nlmsghdr *nlh)
746
761
skb_trim (skbstat , NLMSG_ALIGN (actual_size ));
747
762
nlhstat -> nlmsg_len = actual_size ;
748
763
749
- err = iscsi_unicast_skb (conn -> z_pdu , skbstat );
764
+ err = iscsi_unicast_skb (conn -> z_pdu , skbstat , priv -> daemon_pid );
750
765
} while (err < 0 && err != - ECONNREFUSED );
751
766
752
767
return err ;
@@ -981,6 +996,8 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
981
996
if (!try_module_get (transport -> owner ))
982
997
return - EINVAL ;
983
998
999
+ priv -> daemon_pid = NETLINK_CREDS (skb )-> pid ;
1000
+
984
1001
switch (nlh -> nlmsg_type ) {
985
1002
case ISCSI_UEVENT_CREATE_SESSION :
986
1003
err = iscsi_if_create_session (priv , ev );
@@ -1073,7 +1090,6 @@ iscsi_if_rx(struct sock *sk, int len)
1073
1090
skb_pull (skb , skb -> len );
1074
1091
goto free_skb ;
1075
1092
}
1076
- daemon_pid = NETLINK_CREDS (skb )-> pid ;
1077
1093
1078
1094
while (skb -> len >= NLMSG_SPACE (0 )) {
1079
1095
int err ;
0 commit comments