@@ -448,6 +448,7 @@ nft_trans_alloc_chain(const struct nft_ctx *ctx, int msg_type)
448
448
449
449
trans_chain = nft_trans_container_chain (trans );
450
450
INIT_LIST_HEAD (& trans_chain -> nft_trans_binding .binding_list );
451
+ trans_chain -> chain = ctx -> chain ;
451
452
452
453
return trans ;
453
454
}
@@ -468,7 +469,6 @@ static struct nft_trans *nft_trans_chain_add(struct nft_ctx *ctx, int msg_type)
468
469
ntohl (nla_get_be32 (ctx -> nla [NFTA_CHAIN_ID ]));
469
470
}
470
471
}
471
- nft_trans_chain (trans ) = ctx -> chain ;
472
472
nft_trans_commit_list_add_tail (ctx -> net , trans );
473
473
474
474
return trans ;
@@ -2089,18 +2089,19 @@ static struct nft_stats __percpu *nft_stats_alloc(const struct nlattr *attr)
2089
2089
return newstats ;
2090
2090
}
2091
2091
2092
- static void nft_chain_stats_replace (struct nft_trans * trans )
2092
+ static void nft_chain_stats_replace (struct nft_trans_chain * trans )
2093
2093
{
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 );
2095
2096
2096
- if (!nft_trans_chain_stats ( trans ) )
2097
+ if (!trans -> stats )
2097
2098
return ;
2098
2099
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 ));
2102
2103
2103
- if (!nft_trans_chain_stats ( trans ) )
2104
+ if (!trans -> stats )
2104
2105
static_branch_inc (& nft_counters_enabled );
2105
2106
}
2106
2107
@@ -9456,47 +9457,47 @@ static int nf_tables_validate(struct net *net)
9456
9457
*
9457
9458
* We defer the drop policy until the transaction has been finalized.
9458
9459
*/
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 )
9460
9461
{
9461
9462
struct nft_base_chain * basechain ;
9462
9463
9463
- if (nft_trans_chain_policy ( trans ) != NF_DROP )
9464
+ if (trans -> policy != NF_DROP )
9464
9465
return ;
9465
9466
9466
- if (!nft_is_base_chain (trans -> ctx . chain ))
9467
+ if (!nft_is_base_chain (trans -> chain ))
9467
9468
return ;
9468
9469
9469
- basechain = nft_base_chain (trans -> ctx . chain );
9470
+ basechain = nft_base_chain (trans -> chain );
9470
9471
basechain -> policy = NF_DROP ;
9471
9472
}
9472
9473
9473
- static void nft_chain_commit_update (struct nft_trans * trans )
9474
+ static void nft_chain_commit_update (struct nft_trans_chain * trans )
9474
9475
{
9475
- struct nft_table * table = trans -> ctx .table ;
9476
+ struct nft_table * table = trans -> nft_trans_binding . nft_trans . ctx .table ;
9476
9477
struct nft_base_chain * basechain ;
9477
9478
9478
- if (nft_trans_chain_name ( trans ) ) {
9479
+ if (trans -> name ) {
9479
9480
rhltable_remove (& table -> chains_ht ,
9480
- & trans -> ctx . chain -> rhlhead ,
9481
+ & trans -> chain -> rhlhead ,
9481
9482
nft_chain_ht_params );
9482
- swap (trans -> ctx . chain -> name , nft_trans_chain_name ( trans ) );
9483
+ swap (trans -> chain -> name , trans -> name );
9483
9484
rhltable_insert_key (& table -> chains_ht ,
9484
- trans -> ctx . chain -> name ,
9485
- & trans -> ctx . chain -> rhlhead ,
9485
+ trans -> chain -> name ,
9486
+ & trans -> chain -> rhlhead ,
9486
9487
nft_chain_ht_params );
9487
9488
}
9488
9489
9489
- if (!nft_is_base_chain (trans -> ctx . chain ))
9490
+ if (!nft_is_base_chain (trans -> chain ))
9490
9491
return ;
9491
9492
9492
9493
nft_chain_stats_replace (trans );
9493
9494
9494
- basechain = nft_base_chain (trans -> ctx . chain );
9495
+ basechain = nft_base_chain (trans -> chain );
9495
9496
9496
- switch (nft_trans_chain_policy ( trans ) ) {
9497
+ switch (trans -> policy ) {
9497
9498
case NF_DROP :
9498
9499
case NF_ACCEPT :
9499
- basechain -> policy = nft_trans_chain_policy ( trans ) ;
9500
+ basechain -> policy = trans -> policy ;
9500
9501
break ;
9501
9502
}
9502
9503
}
@@ -10309,14 +10310,14 @@ static int nf_tables_commit(struct net *net, struct sk_buff *skb)
10309
10310
break ;
10310
10311
case NFT_MSG_NEWCHAIN :
10311
10312
if (nft_trans_chain_update (trans )) {
10312
- nft_chain_commit_update (trans );
10313
+ nft_chain_commit_update (nft_trans_container_chain ( trans ) );
10313
10314
nf_tables_chain_notify (& trans -> ctx , NFT_MSG_NEWCHAIN ,
10314
10315
& nft_trans_chain_hooks (trans ));
10315
10316
list_splice (& nft_trans_chain_hooks (trans ),
10316
10317
& nft_trans_basechain (trans )-> hook_list );
10317
10318
/* trans destroyed after rcu grace period */
10318
10319
} else {
10319
- nft_chain_commit_drop_policy (trans );
10320
+ nft_chain_commit_drop_policy (nft_trans_container_chain ( trans ) );
10320
10321
nft_clear (net , trans -> ctx .chain );
10321
10322
nf_tables_chain_notify (& trans -> ctx , NFT_MSG_NEWCHAIN , NULL );
10322
10323
nft_trans_destroy (trans );
0 commit comments