return err;
 }
 
+static bool nft_set_is_same(const struct nft_set *set,
+                           const struct nft_set_desc *desc,
+                           struct nft_expr *exprs[], u32 num_exprs, u32 flags)
+{
+       int i;
+
+       if (set->ktype != desc->ktype ||
+           set->dtype != desc->dtype ||
+           set->flags != flags ||
+           set->klen != desc->klen ||
+           set->dlen != desc->dlen ||
+           set->field_count != desc->field_count ||
+           set->num_exprs != num_exprs)
+               return false;
+
+       for (i = 0; i < desc->field_count; i++) {
+               if (set->field_len[i] != desc->field_len[i])
+                       return false;
+       }
+
+       for (i = 0; i < num_exprs; i++) {
+               if (set->exprs[i]->ops != exprs[i]->ops)
+                       return false;
+       }
+
+       return true;
+}
+
 static int nf_tables_newset(struct sk_buff *skb, const struct nfnl_info *info,
                            const struct nlattr * const nla[])
 {
                if (err < 0)
                        return err;
 
+               err = 0;
+               if (!nft_set_is_same(set, &desc, exprs, num_exprs, flags)) {
+                       NL_SET_BAD_ATTR(extack, nla[NFTA_SET_NAME]);
+                       err = -EEXIST;
+               }
+
                for (i = 0; i < num_exprs; i++)
                        nft_expr_destroy(&ctx, exprs[i]);
 
-               return 0;
+               return err;
        }
 
        if (!(info->nlh->nlmsg_flags & NLM_F_CREATE))