@@ -504,6 +504,7 @@ bool nft_pipapo_lookup(const struct net *net, const struct nft_set *set,
504504 * pipapo_get() - Get matching element reference given key data
505505 * @net: Network namespace
506506 * @set: nftables API set representation
507+ * @m: storage containing active/existing elements
507508 * @data: Key data to be matched against existing elements
508509 * @genmask: If set, check that element is active in given genmask
509510 * @tstamp: timestamp to check for expired elements
@@ -517,17 +518,15 @@ bool nft_pipapo_lookup(const struct net *net, const struct nft_set *set,
517518 */
518519static struct nft_pipapo_elem * pipapo_get (const struct net * net ,
519520 const struct nft_set * set ,
521+ const struct nft_pipapo_match * m ,
520522 const u8 * data , u8 genmask ,
521523 u64 tstamp , gfp_t gfp )
522524{
523525 struct nft_pipapo_elem * ret = ERR_PTR (- ENOENT );
524- struct nft_pipapo * priv = nft_set_priv (set );
525526 unsigned long * res_map , * fill_map = NULL ;
526- const struct nft_pipapo_match * m ;
527527 const struct nft_pipapo_field * f ;
528528 int i ;
529529
530- m = priv -> clone ;
531530 if (m -> bsize_max == 0 )
532531 return ret ;
533532
@@ -612,9 +611,11 @@ static struct nft_elem_priv *
612611nft_pipapo_get (const struct net * net , const struct nft_set * set ,
613612 const struct nft_set_elem * elem , unsigned int flags )
614613{
614+ struct nft_pipapo * priv = nft_set_priv (set );
615+ struct nft_pipapo_match * m = rcu_dereference (priv -> match );
615616 struct nft_pipapo_elem * e ;
616617
617- e = pipapo_get (net , set , (const u8 * )elem -> key .val .data ,
618+ e = pipapo_get (net , set , m , (const u8 * )elem -> key .val .data ,
618619 nft_genmask_cur (net ), get_jiffies_64 (),
619620 GFP_ATOMIC );
620621 if (IS_ERR (e ))
@@ -1288,7 +1289,7 @@ static int nft_pipapo_insert(const struct net *net, const struct nft_set *set,
12881289 else
12891290 end = start ;
12901291
1291- dup = pipapo_get (net , set , start , genmask , tstamp , GFP_KERNEL );
1292+ dup = pipapo_get (net , set , m , start , genmask , tstamp , GFP_KERNEL );
12921293 if (!IS_ERR (dup )) {
12931294 /* Check if we already have the same exact entry */
12941295 const struct nft_data * dup_key , * dup_end ;
@@ -1310,7 +1311,7 @@ static int nft_pipapo_insert(const struct net *net, const struct nft_set *set,
13101311
13111312 if (PTR_ERR (dup ) == - ENOENT ) {
13121313 /* Look for partially overlapping entries */
1313- dup = pipapo_get (net , set , end , nft_genmask_next (net ), tstamp ,
1314+ dup = pipapo_get (net , set , m , end , nft_genmask_next (net ), tstamp ,
13141315 GFP_KERNEL );
13151316 }
13161317
@@ -1862,9 +1863,11 @@ static struct nft_elem_priv *
18621863nft_pipapo_deactivate (const struct net * net , const struct nft_set * set ,
18631864 const struct nft_set_elem * elem )
18641865{
1866+ const struct nft_pipapo * priv = nft_set_priv (set );
1867+ struct nft_pipapo_match * m = priv -> clone ;
18651868 struct nft_pipapo_elem * e ;
18661869
1867- e = pipapo_get (net , set , (const u8 * )elem -> key .val .data ,
1870+ e = pipapo_get (net , set , m , (const u8 * )elem -> key .val .data ,
18681871 nft_genmask_next (net ), nft_net_tstamp (net ), GFP_KERNEL );
18691872 if (IS_ERR (e ))
18701873 return NULL ;
0 commit comments