Collapse tca_get_notify(), tca_add_notify() and tca_del_notify() in a
single function since they repeat the same code pattern.

Signed-off-by: Roman Mashak <m...@mojatatu.com>
---
 net/sched/act_api.c | 111 ++++++++++++++++------------------------------------
 1 file changed, 33 insertions(+), 78 deletions(-)

diff --git a/net/sched/act_api.c b/net/sched/act_api.c
index 57cf37145282..5b04184fb525 100644
--- a/net/sched/act_api.c
+++ b/net/sched/act_api.c
@@ -895,24 +895,41 @@ static int tca_get_fill(struct sk_buff *skb, struct 
list_head *actions,
        return -1;
 }
 
-static int
-tcf_get_notify(struct net *net, u32 portid, struct nlmsghdr *n,
-              struct list_head *actions, int event,
-              struct netlink_ext_ack *extack)
+static int tca_notify(struct net *net, struct nlmsghdr *n,
+                     struct list_head *actions, u32 portid, int event,
+                     size_t attr_size, struct netlink_ext_ack *extack)
 {
        struct sk_buff *skb;
+       int err;
 
-       skb = alloc_skb(NLMSG_GOODSIZE, GFP_KERNEL);
+       skb = alloc_skb(attr_size <= NLMSG_GOODSIZE ? NLMSG_GOODSIZE : 
attr_size,
+                       GFP_KERNEL);
        if (!skb)
                return -ENOBUFS;
-       if (tca_get_fill(skb, actions, portid, n->nlmsg_seq, 0, event,
-                        0, 0) <= 0) {
-               NL_SET_ERR_MSG(extack, "Failed to fill netlink attributes while 
adding TC action");
+
+       if (tca_get_fill(skb, actions, portid, n->nlmsg_seq,
+                        event == RTM_NEWACTION ? n->nlmsg_flags : 0,
+                        event, 0,
+                        event == RTM_DELACTION ? 1 : 0) <= 0) {
+               NL_SET_ERR_MSG(extack, "Failed to fill netlink TC action 
attributes in event message");
                kfree_skb(skb);
                return -EINVAL;
        }
 
-       return rtnl_unicast(skb, net, portid);
+       if (event == RTM_GETACTION) {
+               return rtnl_unicast(skb, net, portid);
+       } else if (event == RTM_DELACTION) {
+               /* now do the delete */
+               err = tcf_action_destroy(actions, 0);
+               if (err < 0) {
+                       NL_SET_ERR_MSG(extack, "Failed to delete TC action");
+                       kfree_skb(skb);
+                       return err;
+               }
+       }
+       err = rtnetlink_send(skb, net, portid, RTNLGRP_TC,
+                            n->nlmsg_flags & NLM_F_ECHO);
+       return err > 0 ? 0 : err;
 }
 
 static struct tc_action *tcf_action_get_1(struct net *net, struct nlattr *nla,
@@ -1034,40 +1051,6 @@ static int tca_action_flush(struct net *net, struct 
nlattr *nla,
 }
 
 static int
-tcf_del_notify(struct net *net, struct nlmsghdr *n, struct list_head *actions,
-              u32 portid, size_t attr_size, struct netlink_ext_ack *extack)
-{
-       int ret;
-       struct sk_buff *skb;
-
-       skb = alloc_skb(attr_size <= NLMSG_GOODSIZE ? NLMSG_GOODSIZE : 
attr_size,
-                       GFP_KERNEL);
-       if (!skb)
-               return -ENOBUFS;
-
-       if (tca_get_fill(skb, actions, portid, n->nlmsg_seq, 0, RTM_DELACTION,
-                        0, 1) <= 0) {
-               NL_SET_ERR_MSG(extack, "Failed to fill netlink TC action 
attributes");
-               kfree_skb(skb);
-               return -EINVAL;
-       }
-
-       /* now do the delete */
-       ret = tcf_action_destroy(actions, 0);
-       if (ret < 0) {
-               NL_SET_ERR_MSG(extack, "Failed to delete TC action");
-               kfree_skb(skb);
-               return ret;
-       }
-
-       ret = rtnetlink_send(skb, net, portid, RTNLGRP_TC,
-                            n->nlmsg_flags & NLM_F_ECHO);
-       if (ret > 0)
-               return 0;
-       return ret;
-}
-
-static int
 tca_action_gd(struct net *net, struct nlattr *nla, struct nlmsghdr *n,
              u32 portid, int event, struct netlink_ext_ack *extack)
 {
@@ -1102,46 +1085,17 @@ tca_action_gd(struct net *net, struct nlattr *nla, 
struct nlmsghdr *n,
 
        attr_size = tcf_action_full_attrs_size(attr_size);
 
-       if (event == RTM_GETACTION)
-               ret = tcf_get_notify(net, portid, n, &actions, event, extack);
-       else { /* delete */
-               ret = tcf_del_notify(net, n, &actions, portid, attr_size, 
extack);
-               if (ret)
-                       goto err;
-               return ret;
-       }
+       ret = tca_notify(net, n, &actions, portid, event, attr_size, extack);
+       if (ret)
+               goto err;
+       return ret;
+
 err:
        if (event != RTM_GETACTION)
                tcf_action_destroy(&actions, 0);
        return ret;
 }
 
-static int
-tcf_add_notify(struct net *net, struct nlmsghdr *n, struct list_head *actions,
-              u32 portid, size_t attr_size, struct netlink_ext_ack *extack)
-{
-       struct sk_buff *skb;
-       int err = 0;
-
-       skb = alloc_skb(attr_size <= NLMSG_GOODSIZE ? NLMSG_GOODSIZE : 
attr_size,
-                       GFP_KERNEL);
-       if (!skb)
-               return -ENOBUFS;
-
-       if (tca_get_fill(skb, actions, portid, n->nlmsg_seq, n->nlmsg_flags,
-                        RTM_NEWACTION, 0, 0) <= 0) {
-               NL_SET_ERR_MSG(extack, "Failed to fill netlink attributes while 
adding TC action");
-               kfree_skb(skb);
-               return -EINVAL;
-       }
-
-       err = rtnetlink_send(skb, net, portid, RTNLGRP_TC,
-                            n->nlmsg_flags & NLM_F_ECHO);
-       if (err > 0)
-               err = 0;
-       return err;
-}
-
 static int tcf_action_add(struct net *net, struct nlattr *nla,
                          struct nlmsghdr *n, u32 portid, int ovr,
                          struct netlink_ext_ack *extack)
@@ -1155,7 +1109,8 @@ static int tcf_action_add(struct net *net, struct nlattr 
*nla,
        if (ret)
                return ret;
 
-       return tcf_add_notify(net, n, &actions, portid, attr_size, extack);
+       return tca_notify(net, n, &actions, portid, RTM_NEWACTION, attr_size,
+                         extack);
 }
 
 static u32 tcaa_root_flags_allowed = TCA_FLAG_LARGE_DUMP_ON;
-- 
2.7.4

Reply via email to