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\\>(*YND)($$TWV(,=+82,='ND?GRGS"WPJ;]SUM%A9]PC]G1=GW M3)9:4T[7NFNR17>5K/8^++[J$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\
Y!W$?3Q(2P04A%24R: R(L9?.0]C;SB-PAWT4 MYZFG^S?_K$YSDYO7,'V%'0RHQ12.J,$./+&;1>)4DYVB+U3D:,N(:0LF0 M_0M(IWB=36/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!4T:1$-99]VZ]'0L. M3>7M68GUJM@L1[ON7&Q2[I"3P'5NJD/]^O'MXD"9MGBM>0?NY6L-)XISYL,& MDM%&IBIL*U/R<;9\S=O9'ID^COT8E.A"EWU]"^"F5@S*U:+@20VB0VX *Q+\:L.A