@@ -1914,6 +1914,20 @@ static int nft_basechain_init(struct nft_base_chain *basechain, u8 family,
1914
1914
return 0 ;
1915
1915
}
1916
1916
1917
+ static int nft_chain_add (struct nft_table * table , struct nft_chain * chain )
1918
+ {
1919
+ int err ;
1920
+
1921
+ err = rhltable_insert_key (& table -> chains_ht , chain -> name ,
1922
+ & chain -> rhlhead , nft_chain_ht_params );
1923
+ if (err )
1924
+ return err ;
1925
+
1926
+ list_add_tail_rcu (& chain -> list , & table -> chains );
1927
+
1928
+ return 0 ;
1929
+ }
1930
+
1917
1931
static int nf_tables_addchain (struct nft_ctx * ctx , u8 family , u8 genmask ,
1918
1932
u8 policy , u32 flags )
1919
1933
{
@@ -1991,25 +2005,23 @@ static int nf_tables_addchain(struct nft_ctx *ctx, u8 family, u8 genmask,
1991
2005
if (err < 0 )
1992
2006
goto err1 ;
1993
2007
1994
- err = rhltable_insert_key (& table -> chains_ht , chain -> name ,
1995
- & chain -> rhlhead , nft_chain_ht_params );
1996
- if (err )
1997
- goto err2 ;
1998
-
1999
2008
trans = nft_trans_chain_add (ctx , NFT_MSG_NEWCHAIN );
2000
2009
if (IS_ERR (trans )) {
2001
2010
err = PTR_ERR (trans );
2002
- rhltable_remove (& table -> chains_ht , & chain -> rhlhead ,
2003
- nft_chain_ht_params );
2004
2011
goto err2 ;
2005
2012
}
2006
2013
2007
2014
nft_trans_chain_policy (trans ) = NFT_CHAIN_POLICY_UNSET ;
2008
2015
if (nft_is_base_chain (chain ))
2009
2016
nft_trans_chain_policy (trans ) = policy ;
2010
2017
2018
+ err = nft_chain_add (table , chain );
2019
+ if (err < 0 ) {
2020
+ nft_trans_destroy (trans );
2021
+ goto err2 ;
2022
+ }
2023
+
2011
2024
table -> use ++ ;
2012
- list_add_tail_rcu (& chain -> list , & table -> chains );
2013
2025
2014
2026
return 0 ;
2015
2027
err2 :
0 commit comments