On Thu, Sep 6, 2018 at 3:59 AM Al Viro <v...@zeniv.linux.org.uk> wrote: > > diff --git a/net/sched/cls_u32.c b/net/sched/cls_u32.c > index 3f985f29ef30..d14048e38b5c 100644 > --- a/net/sched/cls_u32.c > +++ b/net/sched/cls_u32.c > @@ -84,6 +84,7 @@ struct tc_u_hnode { > int refcnt; > unsigned int divisor; > struct idr handle_idr; > + bool is_root; > struct rcu_head rcu; > u32 flags; > /* The 'ht' field MUST be the last field in structure to allow for > @@ -377,6 +378,7 @@ static int u32_init(struct tcf_proto *tp) > root_ht->refcnt++; > root_ht->handle = tp_c ? gen_new_htid(tp_c, root_ht) : 0x80000000; > root_ht->prio = tp->prio; > + root_ht->is_root = true; > idr_init(&root_ht->handle_idr); > > if (tp_c == NULL) { > @@ -693,7 +695,7 @@ static int u32_delete(struct tcf_proto *tp, void *arg, > bool *last, > goto out; > } > > - if (root_ht == ht) { > + if (ht->is_root) {
What's wrong with comparing pointers with root ht? > NL_SET_ERR_MSG_MOD(extack, "Not allowed to delete root node"); > return -EINVAL; > } > @@ -795,6 +797,10 @@ static int u32_set_parms(struct net *net, struct > tcf_proto *tp, > NL_SET_ERR_MSG_MOD(extack, "Link hash table > not found"); > return -EINVAL; > } > + if (ht_down->is_root) { root ht is saved in tp->root, so you can compare ht_down with it too, if you want. If this check is all what you need, you don't need an extra flag.