@@ -448,6 +448,7 @@ nft_trans_alloc_chain(const struct nft_ctx *ctx, int msg_type)
448448
449449 trans_chain = nft_trans_container_chain (trans );
450450 INIT_LIST_HEAD (& trans_chain -> nft_trans_binding .binding_list );
451+ trans_chain -> chain = ctx -> chain ;
451452
452453 return trans ;
453454}
@@ -468,7 +469,6 @@ static struct nft_trans *nft_trans_chain_add(struct nft_ctx *ctx, int msg_type)
468469 ntohl (nla_get_be32 (ctx -> nla [NFTA_CHAIN_ID ]));
469470 }
470471 }
471- nft_trans_chain (trans ) = ctx -> chain ;
472472 nft_trans_commit_list_add_tail (ctx -> net , trans );
473473
474474 return trans ;
@@ -2089,18 +2089,19 @@ static struct nft_stats __percpu *nft_stats_alloc(const struct nlattr *attr)
20892089 return newstats ;
20902090}
20912091
2092- static void nft_chain_stats_replace (struct nft_trans * trans )
2092+ static void nft_chain_stats_replace (struct nft_trans_chain * trans )
20932093{
2094- struct nft_base_chain * chain = nft_base_chain (trans -> ctx .chain );
2094+ const struct nft_trans * t = & trans -> nft_trans_binding .nft_trans ;
2095+ struct nft_base_chain * chain = nft_base_chain (trans -> chain );
20952096
2096- if (!nft_trans_chain_stats ( trans ) )
2097+ if (!trans -> stats )
20972098 return ;
20982099
2099- nft_trans_chain_stats ( trans ) =
2100- rcu_replace_pointer (chain -> stats , nft_trans_chain_stats ( trans ) ,
2101- lockdep_commit_lock_is_held (trans -> ctx .net ));
2100+ trans -> stats =
2101+ rcu_replace_pointer (chain -> stats , trans -> stats ,
2102+ lockdep_commit_lock_is_held (t -> ctx .net ));
21022103
2103- if (!nft_trans_chain_stats ( trans ) )
2104+ if (!trans -> stats )
21042105 static_branch_inc (& nft_counters_enabled );
21052106}
21062107
@@ -9456,47 +9457,47 @@ static int nf_tables_validate(struct net *net)
94569457 *
94579458 * We defer the drop policy until the transaction has been finalized.
94589459 */
9459- static void nft_chain_commit_drop_policy (struct nft_trans * trans )
9460+ static void nft_chain_commit_drop_policy (struct nft_trans_chain * trans )
94609461{
94619462 struct nft_base_chain * basechain ;
94629463
9463- if (nft_trans_chain_policy ( trans ) != NF_DROP )
9464+ if (trans -> policy != NF_DROP )
94649465 return ;
94659466
9466- if (!nft_is_base_chain (trans -> ctx . chain ))
9467+ if (!nft_is_base_chain (trans -> chain ))
94679468 return ;
94689469
9469- basechain = nft_base_chain (trans -> ctx . chain );
9470+ basechain = nft_base_chain (trans -> chain );
94709471 basechain -> policy = NF_DROP ;
94719472}
94729473
9473- static void nft_chain_commit_update (struct nft_trans * trans )
9474+ static void nft_chain_commit_update (struct nft_trans_chain * trans )
94749475{
9475- struct nft_table * table = trans -> ctx .table ;
9476+ struct nft_table * table = trans -> nft_trans_binding . nft_trans . ctx .table ;
94769477 struct nft_base_chain * basechain ;
94779478
9478- if (nft_trans_chain_name ( trans ) ) {
9479+ if (trans -> name ) {
94799480 rhltable_remove (& table -> chains_ht ,
9480- & trans -> ctx . chain -> rhlhead ,
9481+ & trans -> chain -> rhlhead ,
94819482 nft_chain_ht_params );
9482- swap (trans -> ctx . chain -> name , nft_trans_chain_name ( trans ) );
9483+ swap (trans -> chain -> name , trans -> name );
94839484 rhltable_insert_key (& table -> chains_ht ,
9484- trans -> ctx . chain -> name ,
9485- & trans -> ctx . chain -> rhlhead ,
9485+ trans -> chain -> name ,
9486+ & trans -> chain -> rhlhead ,
94869487 nft_chain_ht_params );
94879488 }
94889489
9489- if (!nft_is_base_chain (trans -> ctx . chain ))
9490+ if (!nft_is_base_chain (trans -> chain ))
94909491 return ;
94919492
94929493 nft_chain_stats_replace (trans );
94939494
9494- basechain = nft_base_chain (trans -> ctx . chain );
9495+ basechain = nft_base_chain (trans -> chain );
94959496
9496- switch (nft_trans_chain_policy ( trans ) ) {
9497+ switch (trans -> policy ) {
94979498 case NF_DROP :
94989499 case NF_ACCEPT :
9499- basechain -> policy = nft_trans_chain_policy ( trans ) ;
9500+ basechain -> policy = trans -> policy ;
95009501 break ;
95019502 }
95029503}
@@ -10309,14 +10310,14 @@ static int nf_tables_commit(struct net *net, struct sk_buff *skb)
1030910310 break ;
1031010311 case NFT_MSG_NEWCHAIN :
1031110312 if (nft_trans_chain_update (trans )) {
10312- nft_chain_commit_update (trans );
10313+ nft_chain_commit_update (nft_trans_container_chain ( trans ) );
1031310314 nf_tables_chain_notify (& trans -> ctx , NFT_MSG_NEWCHAIN ,
1031410315 & nft_trans_chain_hooks (trans ));
1031510316 list_splice (& nft_trans_chain_hooks (trans ),
1031610317 & nft_trans_basechain (trans )-> hook_list );
1031710318 /* trans destroyed after rcu grace period */
1031810319 } else {
10319- nft_chain_commit_drop_policy (trans );
10320+ nft_chain_commit_drop_policy (nft_trans_container_chain ( trans ) );
1032010321 nft_clear (net , trans -> ctx .chain );
1032110322 nf_tables_chain_notify (& trans -> ctx , NFT_MSG_NEWCHAIN , NULL );
1032210323 nft_trans_destroy (trans );
0 commit comments