On Mon, May 26, 2003 at 04:37:34PM -0700, David S. Miller wrote: > > Your patch doesn't apply. In particular this line: > > xfrm_policy_genid++; > > Does not exist in the tree anymore. OK, here is the updated patch against 2.5.70. -- Debian GNU/Linux 3.0 is out! ( http://www.debian.org/ ) Email: Herbert Xu ~{PmV>HI~} <herbert@gondor.apana.org.au> Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
Index: kernel-source-2.5/net/xfrm/xfrm_policy.c =================================================================== RCS file: /home/gondolin/herbert/src/CVS/debian/kernel-source-2.5/net/xfrm/xfrm_policy.c,v retrieving revision 1.1.1.3 diff -u -r1.1.1.3 xfrm_policy.c --- kernel-source-2.5/net/xfrm/xfrm_policy.c 27 May 2003 08:38:41 -0000 1.1.1.3 +++ kernel-source-2.5/net/xfrm/xfrm_policy.c 27 May 2003 08:58:48 -0000 @@ -244,22 +244,34 @@ int xfrm_policy_insert(int dir, struct xfrm_policy *policy, int excl) { struct xfrm_policy *pol, **p; + struct xfrm_policy *delpol = NULL; + struct xfrm_policy **newpos = NULL; write_lock_bh(&xfrm_policy_lock); for (p = &xfrm_policy_list[dir]; (pol=*p)!=NULL; p = &pol->next) { - if (memcmp(&policy->selector, &pol->selector, sizeof(pol->selector)) == 0) { + if (!delpol && memcmp(&policy->selector, &pol->selector, sizeof(pol->selector)) == 0) { if (excl) { write_unlock_bh(&xfrm_policy_lock); return -EEXIST; } + *p = pol->next; + delpol = pol; + if (policy->priority > pol->priority) + continue; + } else if (policy->priority >= pol->priority) + continue; + if (!newpos) + newpos = p; + if (delpol) break; - } } + if (newpos) + p = newpos; xfrm_pol_hold(policy); - policy->next = pol ? pol->next : NULL; + policy->next = *p; *p = policy; atomic_inc(&flow_cache_genid); - policy->index = pol ? pol->index : xfrm_gen_index(dir); + policy->index = delpol ? delpol->index : xfrm_gen_index(dir); policy->curlft.add_time = (unsigned long)xtime.tv_sec; policy->curlft.use_time = 0; if (policy->lft.hard_add_expires_seconds && @@ -267,10 +279,10 @@ xfrm_pol_hold(policy); write_unlock_bh(&xfrm_policy_lock); - if (pol) { - atomic_dec(&pol->refcnt); - xfrm_policy_kill(pol); - xfrm_pol_put(pol); + if (delpol) { + atomic_dec(&delpol->refcnt); + xfrm_policy_kill(delpol); + xfrm_pol_put(delpol); } return 0; }