From: Stanislav Kinsburskiy <skinsbur...@virtuozzo.com>

This is precursor patch.

Signed-off-by: Stanislav Kinsburskiy <skinsbur...@virtuozzo.com>
Reviewed-by: Andrey Ryabinin <aryabi...@virtuozzo.com>

(cherry picked from vz8 commit 0c549e1074be22cab602238ddbc9b4ccd161040d)
Signed-off-by: Pavel Tikhomirov <ptikhomi...@virtuozzo.com>
---
 drivers/connector/connector.c | 49 +++++++++++++++++++++++++++--------
 include/linux/connector.h     |  9 +++++++
 2 files changed, 47 insertions(+), 11 deletions(-)

diff --git a/drivers/connector/connector.c b/drivers/connector/connector.c
index e2af22d7a4ee..cc649ec99c8b 100644
--- a/drivers/connector/connector.c
+++ b/drivers/connector/connector.c
@@ -62,15 +62,15 @@ static struct cn_dev *get_cdev(struct ve_struct *ve)
  * The message is sent to, the portid if given, the group if given, both if
  * both, or if both are zero then the group is looked up and sent there.
  */
-int cn_netlink_send_mult(struct cn_msg *msg, u16 len, u32 portid, u32 __group,
-       gfp_t gfp_mask)
+int cn_netlink_send_mult_ve(struct ve_struct *ve, struct cn_msg *msg, u16 len,
+                           u32 portid, u32 __group, gfp_t gfp_mask)
 {
        struct cn_callback_entry *__cbq;
        unsigned int size;
        struct sk_buff *skb;
        struct nlmsghdr *nlh;
        struct cn_msg *data;
-       struct cn_dev *dev = get_cdev(get_ve0());
+       struct cn_dev *dev = get_cdev(ve);
        u32 group = 0;
        int found = 0;
 
@@ -119,8 +119,22 @@ int cn_netlink_send_mult(struct cn_msg *msg, u16 len, u32 
portid, u32 __group,
        return netlink_unicast(dev->nls, skb, portid,
                        !gfpflags_allow_blocking(gfp_mask));
 }
+
+int cn_netlink_send_mult(struct cn_msg *msg, u16 len, u32 portid, u32 __group,
+       gfp_t gfp_mask)
+{
+       return cn_netlink_send_mult_ve(get_ve0(), msg, len, portid,
+                                      __group, gfp_mask);
+}
 EXPORT_SYMBOL_GPL(cn_netlink_send_mult);
 
+int cn_netlink_send_ve(struct ve_struct *ve, struct cn_msg *msg, u32 portid,
+                      u32 __group, gfp_t gfp_mask)
+{
+       return cn_netlink_send_mult_ve(ve, msg, msg->len, portid,
+                                      __group, gfp_mask);
+}
+
 /* same as cn_netlink_send_mult except msg->len is used for len */
 int cn_netlink_send(struct cn_msg *msg, u32 portid, u32 __group,
        gfp_t gfp_mask)
@@ -191,6 +205,19 @@ static void cn_rx_skb(struct sk_buff *skb)
        }
 }
 
+int cn_add_callback_ve(struct ve_struct *ve,
+                      const struct cb_id *id, const char *name,
+                      void (*callback)(struct cn_msg *,
+                                       struct netlink_skb_parms *))
+{
+       struct cn_dev *dev = get_cdev(ve);
+
+       if (!cn_already_initialized)
+               return -EAGAIN;
+
+       return cn_queue_add_callback(dev->cbdev, name, id, callback);
+}
+
 /*
  * Callback add routing - adds callback with given ID and name.
  * If there is registered callback with the same ID it will not be added.
@@ -201,14 +228,16 @@ int cn_add_callback(const struct cb_id *id, const char 
*name,
                    void (*callback)(struct cn_msg *,
                                     struct netlink_skb_parms *))
 {
-       struct cn_dev *dev = get_cdev(get_ve0());
+       return cn_add_callback_ve(get_ve0(), id, name, callback);
+}
+EXPORT_SYMBOL_GPL(cn_add_callback);
 
-       if (!cn_already_initialized)
-               return -EAGAIN;
+void cn_del_callback_ve(struct ve_struct *ve, const struct cb_id *id)
+{
+       struct cn_dev *dev = get_cdev(ve);
 
-       return cn_queue_add_callback(dev->cbdev, name, id, callback);
+       cn_queue_del_callback(dev->cbdev, id);
 }
-EXPORT_SYMBOL_GPL(cn_add_callback);
 
 /*
  * Callback remove routing - removes callback
@@ -220,9 +249,7 @@ EXPORT_SYMBOL_GPL(cn_add_callback);
  */
 void cn_del_callback(const struct cb_id *id)
 {
-       struct cn_dev *dev = get_cdev(get_ve0());
-
-       cn_queue_del_callback(dev->cbdev, id);
+       cn_del_callback_ve(get_ve0(), id);
 }
 EXPORT_SYMBOL_GPL(cn_del_callback);
 
diff --git a/include/linux/connector.h b/include/linux/connector.h
index c3bc18eee9f6..acee2c3bfc60 100644
--- a/include/linux/connector.h
+++ b/include/linux/connector.h
@@ -63,6 +63,15 @@ struct cn_private {
 
 };
 
+struct ve_struct;
+int cn_add_callback_ve(struct ve_struct *ve,
+                      const struct cb_id *id, const char *name,
+                      void (*callback)(struct cn_msg *,
+                                       struct netlink_skb_parms *));
+void cn_del_callback_ve(struct ve_struct *ve, const struct cb_id *id);
+int cn_netlink_send_ve(struct ve_struct *ve, struct cn_msg *msg, u32 portid,
+                      u32 group, gfp_t gfp_mask);
+
 /**
  * cn_add_callback() - Registers new callback with connector core.
  *
-- 
2.31.1

_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to