__NFT_TABLE_F_WAS_AWAKEN | \
                                         __NFT_TABLE_F_WAS_ORPHAN)
 
+static bool nft_table_pending_update(const struct nft_ctx *ctx)
+{
+       struct nftables_pernet *nft_net = nft_pernet(ctx->net);
+       struct nft_trans *trans;
+
+       if (ctx->table->flags & __NFT_TABLE_F_UPDATE)
+               return true;
+
+       list_for_each_entry(trans, &nft_net->commit_list, list) {
+               if ((trans->msg_type == NFT_MSG_NEWCHAIN ||
+                    trans->msg_type == NFT_MSG_DELCHAIN) &&
+                   trans->ctx.table == ctx->table &&
+                   nft_trans_chain_update(trans))
+                       return true;
+       }
+
+       return false;
+}
+
 static int nf_tables_updtable(struct nft_ctx *ctx)
 {
        struct nft_trans *trans;
                return -EOPNOTSUPP;
 
        /* No dormant off/on/off/on games in single transaction */
-       if (ctx->table->flags & __NFT_TABLE_F_UPDATE)
+       if (nft_table_pending_update(ctx))
                return -EINVAL;
 
        trans = nft_trans_alloc(ctx, NFT_MSG_NEWTABLE,
                }
        }
 
+       if (table->flags & __NFT_TABLE_F_UPDATE &&
+           !list_empty(&hook.list)) {
+               NL_SET_BAD_ATTR(extack, attr);
+               err = -EOPNOTSUPP;
+               goto err_hooks;
+       }
+
        if (!(table->flags & NFT_TABLE_F_DORMANT) &&
            nft_is_base_chain(chain) &&
            !list_empty(&hook.list)) {
        struct nft_trans *trans;
        int err;
 
+       if (ctx->table->flags & __NFT_TABLE_F_UPDATE)
+               return -EOPNOTSUPP;
+
        err = nft_chain_parse_hook(ctx->net, basechain, nla, &chain_hook,
                                   ctx->family, chain->flags, extack);
        if (err < 0)