Signed-off-by: Cong Wang <xiyou.wangc...@gmail.com>
---
 include/net/act_api.h |  1 +
 net/sched/act_api.c   | 18 ++++++++++++++++++
 2 files changed, 19 insertions(+)

diff --git a/include/net/act_api.h b/include/net/act_api.h
index a374bab..17837af 100644
--- a/include/net/act_api.h
+++ b/include/net/act_api.h
@@ -166,6 +166,7 @@ void tcf_hash_cleanup(struct tc_action *a, struct nlattr 
*est);
 void tcf_hash_insert(struct tc_action_net *tn, struct tc_action *a);
 void tcf_hash_replace(struct tc_action_net *tn, struct tc_action **old,
                      struct tc_action *new, int bind);
+bool tcf_hash_copy(struct tc_action *dst, const struct tc_action *src);
 
 int __tcf_hash_release(struct tc_action *a, bool bind, bool strict);
 
diff --git a/net/sched/act_api.c b/net/sched/act_api.c
index d0a7db2..2f8db3c 100644
--- a/net/sched/act_api.c
+++ b/net/sched/act_api.c
@@ -296,6 +296,24 @@ int tcf_hash_create(struct tc_action_net *tn, u32 index, 
struct nlattr *est,
 }
 EXPORT_SYMBOL(tcf_hash_create);
 
+bool tcf_hash_copy(struct tc_action *dst, const struct tc_action *src)
+{
+       if (src) {
+               memcpy(dst, src, sizeof(*src));
+               spin_lock_init(&dst->tcfa_lock);
+               INIT_HLIST_NODE(&dst->tcfa_head);
+               INIT_LIST_HEAD(&dst->list);
+
+               /* tcf_hash_check() is called before this */
+               dst->tcfa_refcnt = src->tcfa_refcnt - 1;
+               if (src->tcfa_bindcnt)
+                       dst->tcfa_bindcnt = src->tcfa_bindcnt - 1;
+               return true;
+       }
+       return false;
+}
+EXPORT_SYMBOL(tcf_hash_copy);
+
 void tcf_hash_insert(struct tc_action_net *tn, struct tc_action *a)
 {
        struct tcf_hashinfo *hinfo = tn->hinfo;
-- 
2.1.0

Reply via email to