From: <ag...@us...> - 2012-09-18 17:40:12
|
Revision: 482 http://iscsitarget.svn.sourceforge.net/iscsitarget/?rev=482&view=rev Author: agr1 Date: 2012-09-18 17:40:06 +0000 (Tue, 18 Sep 2012) Log Message: ----------- Fix retrieval of ietd pid from netlink The ietd pid was retrieved from the credentials in the netlink skb which happened to work with kernels < 3.2. These days the credentials are not sent by default anymore (and ietd doesn't fill them in) so the pid needs to be determined from the netlink_skb_parms. This fixes a bug reported by Clay Gerrard ("Can't delete target after initiator logs out", caused by the session removal event not making it to ietd). Signed-off-by: Arne Redlich <arn...@go...> Modified Paths: -------------- branches/1.4.20/kernel/event.c Modified: branches/1.4.20/kernel/event.c =================================================================== --- branches/1.4.20/kernel/event.c 2012-04-25 17:44:13 UTC (rev 481) +++ branches/1.4.20/kernel/event.c 2012-09-18 17:40:06 UTC (rev 482) @@ -14,24 +14,8 @@ static struct sock *nl; static u32 ietd_pid; -static int event_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) -{ - u32 uid, pid, seq; - char *data; - - pid = NETLINK_CREDS(skb)->pid; - uid = NETLINK_CREDS(skb)->uid; - seq = nlh->nlmsg_seq; - data = NLMSG_DATA(nlh); - - ietd_pid = pid; - - return 0; -} - static void event_recv_skb(struct sk_buff *skb) { - int err; struct nlmsghdr *nlh; u32 rlen; @@ -42,9 +26,9 @@ rlen = NLMSG_ALIGN(nlh->nlmsg_len); if (rlen > skb->len) rlen = skb->len; - if ((err = event_recv_msg(skb, nlh))) { - netlink_ack(skb, nlh, -err); - } else if (nlh->nlmsg_flags & NLM_F_ACK) + ietd_pid = NETLINK_CB(skb).pid; + WARN_ON(ietd_pid == 0); + if (nlh->nlmsg_flags & NLM_F_ACK) netlink_ack(skb, nlh, 0); skb_pull(skb, rlen); } @@ -59,6 +43,7 @@ if (!(skb = alloc_skb(NLMSG_SPACE(len), gfp_mask))) return -ENOMEM; + WARN_ON(ietd_pid == 0); nlh = __nlmsg_put(skb, ietd_pid, seq++, NLMSG_DONE, len - sizeof(*nlh), 0); memcpy(NLMSG_DATA(nlh), data, len); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |