You can import this changeset into BK by piping this whole message to:
'| bk receive [path to repository]' or apply the patch as usual.

===================================================================


ChangeSet@1.1422.1.18, 2003-11-14 21:48:16-02:00, acme@conectiva.com.br
  o LLC: do better struct sock accounting on skbs


 af_llc.c   |    2 --
 llc_c_ac.c |    2 +-
 llc_conn.c |   14 +++++++++-----
 llc_sap.c  |    8 ++++----
 llc_sap.h  |    6 ++++--
 5 files changed, 18 insertions(+), 14 deletions(-)


diff -Nru a/net/llc/af_llc.c b/net/llc/af_llc.c
--- a/net/llc/af_llc.c	Sat Nov 15 17:00:34 2003
+++ b/net/llc/af_llc.c	Sat Nov 15 17:00:34 2003
@@ -583,7 +583,6 @@
 	/* put original socket back into a clean listen state. */
 	sk->sk_state = TCP_LISTEN;
 	sk->sk_ack_backlog--;
-	skb->sk = NULL;
 	dprintk("%s: ok success on %02X, client on %02X\n", __FUNCTION__,
 		llc_sk(sk)->addr.sllc_sap, newllc->daddr.lsap);
 frees:
@@ -693,7 +692,6 @@
 	lock_sock(sk);
 	if (!skb)
 		goto release;
-	skb->sk	      = sk;
 	skb->dev      = llc->dev;
 	skb->protocol = llc_proto_type(addr->sllc_arphrd);
 	skb_reserve(skb, hdrlen); 
diff -Nru a/net/llc/llc_c_ac.c b/net/llc/llc_c_ac.c
--- a/net/llc/llc_c_ac.c	Sat Nov 15 17:00:34 2003
+++ b/net/llc/llc_c_ac.c	Sat Nov 15 17:00:34 2003
@@ -1423,7 +1423,7 @@
 	if (skb) {
 		struct llc_conn_state_ev *ev = llc_conn_ev(skb);
 
-		skb->sk  = sk;
+		skb_set_owner_r(skb, sk);
 		ev->type = type;
 		llc_process_tmr_ev(sk, skb);
 	}
diff -Nru a/net/llc/llc_conn.c b/net/llc/llc_conn.c
--- a/net/llc/llc_conn.c	Sat Nov 15 17:00:34 2003
+++ b/net/llc/llc_conn.c	Sat Nov 15 17:00:34 2003
@@ -86,8 +86,8 @@
 
 	switch (ev->ind_prim) {
 	case LLC_DATA_PRIM:
-		llc_save_primitive(skb, LLC_DATA_PRIM);
-		if (sock_queue_rcv_skb(sk, skb)) {
+		llc_save_primitive(sk, skb, LLC_DATA_PRIM);
+		if (unlikely(sock_queue_rcv_skb(sk, skb))) {
 			/*
 			 * shouldn't happen
 			 */
@@ -99,6 +99,11 @@
 	case LLC_CONN_PRIM: {
 		struct sock *parent = skb->sk;
 
+		skb_orphan(skb);
+		/*
+		 * Set the skb->sk to the new struct sock, so that at accept
+		 * type the upper layer can get the newly created struct sock.
+		 */
 		skb->sk = sk;
 		skb_queue_tail(&parent->sk_receive_queue, skb);
 		sk->sk_state_change(parent);
@@ -697,10 +702,9 @@
 		memcpy(&llc->daddr, &saddr, sizeof(llc->daddr));
 		llc_sap_add_socket(sap, sk);
 		sock_hold(sk);
+		skb_set_owner_r(skb, parent);
 		sock_put(parent);
-		skb->sk = parent;
-	} else
-		skb->sk = sk;
+	}
 	bh_lock_sock(sk);
 	if (!sock_owned_by_user(sk))
 		llc_conn_rcv(sk, skb);
diff -Nru a/net/llc/llc_sap.c b/net/llc/llc_sap.c
--- a/net/llc/llc_sap.c	Sat Nov 15 17:00:34 2003
+++ b/net/llc/llc_sap.c	Sat Nov 15 17:00:34 2003
@@ -42,12 +42,12 @@
 	return skb;
 }
 
-void llc_save_primitive(struct sk_buff* skb, u8 prim)
+void llc_save_primitive(struct sock *sk, struct sk_buff* skb, u8 prim)
 {
 	struct sockaddr_llc *addr = llc_ui_skb_cb(skb);
 
        /* save primitive for use by the user. */
-	addr->sllc_family = skb->sk->sk_family;
+	addr->sllc_family = sk->sk_family;
 	addr->sllc_arphrd = skb->dev->type;
 	addr->sllc_test   = prim == LLC_TEST_PRIM;
 	addr->sllc_xid    = prim == LLC_XID_PRIM;
@@ -187,7 +187,7 @@
 		if (skb->sk->sk_state == TCP_LISTEN)
 			kfree_skb(skb);
 		else {
-			llc_save_primitive(skb, ev->prim);
+			llc_save_primitive(skb->sk, skb, ev->prim);
 
 			/* queue skb to the user. */
 			if (sock_queue_rcv_skb(skb->sk, skb))
@@ -305,7 +305,7 @@
 
 	sk = llc_lookup_dgram(sap, &laddr);
 	if (sk) {
-		skb->sk = sk;
+		skb_set_owner_r(skb, sk);
 		llc_sap_rcv(sap, skb);
 		sock_put(sk);
 	} else
diff -Nru a/net/llc/llc_sap.h b/net/llc/llc_sap.h
--- a/net/llc/llc_sap.h	Sat Nov 15 17:00:34 2003
+++ b/net/llc/llc_sap.h	Sat Nov 15 17:00:34 2003
@@ -12,11 +12,13 @@
  * See the GNU General Public License for more details.
  */
 struct llc_sap;
-struct sk_buff;
 struct net_device;
+struct sk_buff;
+struct sock;
 
 extern void llc_sap_state_process(struct llc_sap *sap, struct sk_buff *skb);
 extern void llc_sap_rtn_pdu(struct llc_sap *sap, struct sk_buff *skb);
-extern void llc_save_primitive(struct sk_buff* skb, unsigned char prim);
+extern void llc_save_primitive(struct sock *sk, struct sk_buff* skb,
+			       unsigned char prim);
 extern struct sk_buff *llc_alloc_frame(struct net_device *dev);
 #endif /* LLC_SAP_H */

===================================================================


This BitKeeper patch contains the following changesets:
1.1422.1.18
## Wrapped with gzip_uu ##


M'XL( -)WMC\  \U877/B-A1]MGZ%9O8E21?0MVTR9#8-.RW3=)I)N\\>(<N!
M 6QJ&]),W?_>*YND)($$TWV(,=+82,='ND?GRGS"WPJ;]SUM%A9]PC]G1=GW
M3)9:4T[7NFNR17><PP^W608_]";9PO9<V]YXQGJI+3NLJ[H408L;79H)7MN\
MZ'NTRY_NE ]+V_=NO_[T[?KR%J'! %]-='IG?[<E'@Q0F>5K/8^++[J<S+.T
M6^8Z+1:VK)]=/36M&"$,/I+ZG$A5446$7QD:4ZH%M3%A(E ".6I?7M)_CL(I
MI8)Q0450P5=)-,2T"[=8%ZH $]ZCM$<%9K0O@CY5'<+ZA."=T/@'B3L$_8B_
M[S"ND,$9OKZ^ZN,XPV-;EC;'19FO3(F+S,R C,E6:3E-[W"6XF(V+M OF(J0
M$'3SW_RB3LL#(:()NM@]U@K"W9O/C?M&CD77-,.1G!+.)1,5Y[Z2%0]"GS$#
MDRO'H;7V'3B=1% U8(_!"0BK& ^(.(B,B;3900:N>$7]1 M"PY"11%'!6\%M
MTR%AX*O#Z&1INH,.E8I721!JFC"@%'(=BZ 5W#8=&3*?'18JO=P5*0GZ5]90
M,Q;4V$0QQL,V:,_) -Q>,M/4S%>Q[6U@:HC)2T),^2JH$G\<DT HD:B LC@^
MD-#D)2'*)?=KLWG5U)G.=^>Y!W$?3Q(2P04A%24R: R(L9?.0]C;SB-PAWT4
MYZFG^S?<R>_K$YSDYO7,'V%'0RHQ12.J,$./+&;1>)4DYVB+U3D:,N(:0LF0
M_0M(IWB=36/</'QMHV4^74QA_NS)]FC.BMEG_!SXS WJ,_(\#S?'*BVF=ZF-
ML9GH'#N<T_-7TFH\8[^VCK6K5G!N!3 J 3&H2"##L%86%VV517&'?A!EU:;[
MAK":P1^E+,%4K:VF]CQX8E38,LKN4YM'^8F3 =#8%>S:D0\,=HMDT JN#C;A
M!*I*2,%5'6PAVP8[Q!WY08+=Y+2WHEV/_IAH!R$8PRAT]N!YNTS!^8 +.'".
MAI=_7$8WMZ-?(?:>-TWPR2J=3V=V_G#BR$=_KNS*1KE91]#EL>OIZ2G^&^1$
M*)8;-67Y$N;-":D&ZIU!@<^PV_F6$^LZ=2Z*&4Q]?9G:^^TI E!W7Y?8G<;8
M9=ET=QOJNL-JN819G>L'*(U.\=T&%X#F#]CD5I?@6EN0W1J@AT8J#/=+?JES
MFY; >.C#6#@:^82[UO_LS*<'+H,6FY V:-NY5"I(_D<Z'N12\6$6@=M+O9-+
MCUH#HLZE=?F_<B->!4T:1$-99]VZ]'0<YZ!GAYKHQ10D.(#F3N&;:U 4#>L.
M3>7M68GUJM@L1[ON7&Q2[I"3P'5NJD/]^O'MXD"9MGBM>0?NY6L-)XISYL,&
MDM%&IBIL*U/R<;9\S=O9'ID^COT8E<K I>.A"EWU]"^"F5@S*U:+@20VB0VX
*Q+\:L.A<NA      
 
