@@ -7061,6 +7061,16 @@ void nft_data_hold(const struct nft_data *data, enum nft_data_types type)
70617061 }
70627062}
70637063
7064+ static int nft_setelem_active_next (const struct net * net ,
7065+ const struct nft_set * set ,
7066+ struct nft_set_elem * elem )
7067+ {
7068+ const struct nft_set_ext * ext = nft_set_elem_ext (set , elem -> priv );
7069+ u8 genmask = nft_genmask_next (net );
7070+
7071+ return nft_set_elem_active (ext , genmask );
7072+ }
7073+
70647074static void nft_setelem_data_activate (const struct net * net ,
70657075 const struct nft_set * set ,
70667076 struct nft_set_elem * elem )
@@ -10538,8 +10548,10 @@ static int __nf_tables_abort(struct net *net, enum nfnl_abort_action action)
1053810548 case NFT_MSG_DESTROYSETELEM :
1053910549 te = (struct nft_trans_elem * )trans -> data ;
1054010550
10541- nft_setelem_data_activate (net , te -> set , & te -> elem );
10542- nft_setelem_activate (net , te -> set , & te -> elem );
10551+ if (!nft_setelem_active_next (net , te -> set , & te -> elem )) {
10552+ nft_setelem_data_activate (net , te -> set , & te -> elem );
10553+ nft_setelem_activate (net , te -> set , & te -> elem );
10554+ }
1054310555 if (!nft_setelem_is_catchall (te -> set , & te -> elem ))
1054410556 te -> set -> ndeact -- ;
1054510557
0 commit comments