[netfilter-cvslog] r6846 - in trunk/patch-o-matic-ng/patchlets/ROUTE/linux-2.6/net: ipv4/netfilter ipv6/netfilter

kaber at trash.net kaber at trash.net
Thu May 24 20:46:56 CEST 2007


Author: kaber at trash.net
Date: 2007-05-24 20:46:54 +0200 (Thu, 24 May 2007)
New Revision: 6846

Modified:
   trunk/patch-o-matic-ng/patchlets/ROUTE/linux-2.6/net/ipv4/netfilter/ipt_ROUTE.c
   trunk/patch-o-matic-ng/patchlets/ROUTE/linux-2.6/net/ipv6/netfilter/ip6t_ROUTE.c
Log:
[PATCH]: ROUTE: convert hh_lock to seqlock

hh_cache's lock has been converted to a seqlock in recent kernels.

Signed-off-by: Robert S. Edmonds <edmonds at debian.org>


Modified: trunk/patch-o-matic-ng/patchlets/ROUTE/linux-2.6/net/ipv4/netfilter/ipt_ROUTE.c
===================================================================
--- trunk/patch-o-matic-ng/patchlets/ROUTE/linux-2.6/net/ipv4/netfilter/ipt_ROUTE.c	2007-05-24 11:32:53 UTC (rev 6845)
+++ trunk/patch-o-matic-ng/patchlets/ROUTE/linux-2.6/net/ipv4/netfilter/ipt_ROUTE.c	2007-05-24 18:46:54 UTC (rev 6846)
@@ -118,6 +118,7 @@
 	struct hh_cache *hh = dst->hh;
 	struct net_device *dev = dst->dev;
 	int hh_len = LL_RESERVED_SPACE(dev);
+	unsigned seq;
 
 	/* Be paranoid, rather than too clever. */
 	if (unlikely(skb_headroom(skb) < hh_len && dev->hard_header)) {
@@ -135,12 +136,13 @@
 	}
 
 	if (hh) {
-		int hh_alen;
+		do {
+			int hh_alen;
 
-		read_lock_bh(&hh->hh_lock);
-		hh_alen = HH_DATA_ALIGN(hh->hh_len);
-  		memcpy(skb->data - hh_alen, hh->hh_data, hh_alen);
-		read_unlock_bh(&hh->hh_lock);
+			seq = read_seqbegin(&hh->hh_lock);
+			hh_alen = HH_DATA_ALIGN(hh->hh_len);
+			memcpy(skb->data - hh_alen, hh->hh_data, hh_alen);
+		} while (read_seqretry(&hh->hh_lock, seq));
 		skb_push(skb, hh->hh_len);
 		hh->hh_output(skb);
 	} else if (dst->neighbour)

Modified: trunk/patch-o-matic-ng/patchlets/ROUTE/linux-2.6/net/ipv6/netfilter/ip6t_ROUTE.c
===================================================================
--- trunk/patch-o-matic-ng/patchlets/ROUTE/linux-2.6/net/ipv6/netfilter/ip6t_ROUTE.c	2007-05-24 11:32:53 UTC (rev 6845)
+++ trunk/patch-o-matic-ng/patchlets/ROUTE/linux-2.6/net/ipv6/netfilter/ip6t_ROUTE.c	2007-05-24 18:46:54 UTC (rev 6846)
@@ -120,11 +120,13 @@
 {
 	struct dst_entry *dst = skb->dst;
 	struct hh_cache *hh = dst->hh;
+	unsigned seq;
 
 	if (hh) {
-		read_lock_bh(&hh->hh_lock);
-		memcpy(skb->data - 16, hh->hh_data, 16);
-		read_unlock_bh(&hh->hh_lock);
+		do {
+			seq = read_seqbegin(&hh->hh_lock);
+			memcpy(skb->data - 16, hh->hh_data, 16);
+		} while (read_seqretry(&hh->hh_lock, seq));
 		skb_push(skb, hh->hh_len);
 		hh->hh_output(skb);
 	} else if (dst->neighbour)




More information about the netfilter-cvslog mailing list