diff options
| -rw-r--r-- | net/xfrm/xfrm_state.c | 18 | 
1 files changed, 10 insertions, 8 deletions
| diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c index 84bbf8474f3e..899de9ed22a6 100644 --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c @@ -505,6 +505,14 @@ __xfrm_state_locate(struct xfrm_state *x, int use_spi, int family)  						  x->id.proto, family);  } +static void xfrm_hash_grow_check(int have_hash_collision) +{ +	if (have_hash_collision && +	    (xfrm_state_hmask + 1) < xfrm_state_hashmax && +	    xfrm_state_num > xfrm_state_hmask) +		schedule_work(&xfrm_hash_work); +} +  struct xfrm_state *  xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr,   		struct flowi *fl, struct xfrm_tmpl *tmpl, @@ -598,6 +606,8 @@ xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr,  			x->lft.hard_add_expires_seconds = XFRM_ACQ_EXPIRES;  			x->timer.expires = jiffies + XFRM_ACQ_EXPIRES*HZ;  			add_timer(&x->timer); +			xfrm_state_num++; +			xfrm_hash_grow_check(x->bydst.next != NULL);  		} else {  			x->km.state = XFRM_STATE_DEAD;  			xfrm_state_put(x); @@ -614,14 +624,6 @@ out:  	return x;  } -static void xfrm_hash_grow_check(int have_hash_collision) -{ -	if (have_hash_collision && -	    (xfrm_state_hmask + 1) < xfrm_state_hashmax && -	    xfrm_state_num > xfrm_state_hmask) -		schedule_work(&xfrm_hash_work); -} -  static void __xfrm_state_insert(struct xfrm_state *x)  {  	unsigned int h; | 
