Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 293500a2 authored by Philipp Reisner's avatar Philipp Reisner Committed by David S. Miller
Browse files

connector: Keep the skb in cn_callback_data

parent 19d5afd4
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -78,8 +78,9 @@ void cn_queue_wrapper(struct work_struct *work)
	struct cn_callback_entry *cbq =
	struct cn_callback_entry *cbq =
		container_of(work, struct cn_callback_entry, work);
		container_of(work, struct cn_callback_entry, work);
	struct cn_callback_data *d = &cbq->data;
	struct cn_callback_data *d = &cbq->data;
	struct cn_msg *msg = NLMSG_DATA(nlmsg_hdr(d->skb));


	d->callback(d->callback_priv);
	d->callback(msg);


	d->destruct_data(d->ddata);
	d->destruct_data(d->ddata);
	d->ddata = NULL;
	d->ddata = NULL;
+5 −6
Original line number Original line Diff line number Diff line
@@ -129,10 +129,11 @@ EXPORT_SYMBOL_GPL(cn_netlink_send);
/*
/*
 * Callback helper - queues work and setup destructor for given data.
 * Callback helper - queues work and setup destructor for given data.
 */
 */
static int cn_call_callback(struct cn_msg *msg, void (*destruct_data)(void *), void *data)
static int cn_call_callback(struct sk_buff *skb, void (*destruct_data)(void *), void *data)
{
{
	struct cn_callback_entry *__cbq, *__new_cbq;
	struct cn_callback_entry *__cbq, *__new_cbq;
	struct cn_dev *dev = &cdev;
	struct cn_dev *dev = &cdev;
	struct cn_msg *msg = NLMSG_DATA(nlmsg_hdr(skb));
	int err = -ENODEV;
	int err = -ENODEV;


	spin_lock_bh(&dev->cbdev->queue_lock);
	spin_lock_bh(&dev->cbdev->queue_lock);
@@ -140,7 +141,7 @@ static int cn_call_callback(struct cn_msg *msg, void (*destruct_data)(void *), v
		if (cn_cb_equal(&__cbq->id.id, &msg->id)) {
		if (cn_cb_equal(&__cbq->id.id, &msg->id)) {
			if (likely(!work_pending(&__cbq->work) &&
			if (likely(!work_pending(&__cbq->work) &&
					__cbq->data.ddata == NULL)) {
					__cbq->data.ddata == NULL)) {
				__cbq->data.callback_priv = msg;
				__cbq->data.skb = skb;


				__cbq->data.ddata = data;
				__cbq->data.ddata = data;
				__cbq->data.destruct_data = destruct_data;
				__cbq->data.destruct_data = destruct_data;
@@ -156,7 +157,7 @@ static int cn_call_callback(struct cn_msg *msg, void (*destruct_data)(void *), v
				__new_cbq = kzalloc(sizeof(struct cn_callback_entry), GFP_ATOMIC);
				__new_cbq = kzalloc(sizeof(struct cn_callback_entry), GFP_ATOMIC);
				if (__new_cbq) {
				if (__new_cbq) {
					d = &__new_cbq->data;
					d = &__new_cbq->data;
					d->callback_priv = msg;
					d->skb = skb;
					d->callback = __cbq->data.callback;
					d->callback = __cbq->data.callback;
					d->ddata = data;
					d->ddata = data;
					d->destruct_data = destruct_data;
					d->destruct_data = destruct_data;
@@ -191,7 +192,6 @@ static int cn_call_callback(struct cn_msg *msg, void (*destruct_data)(void *), v
 */
 */
static void cn_rx_skb(struct sk_buff *__skb)
static void cn_rx_skb(struct sk_buff *__skb)
{
{
	struct cn_msg *msg;
	struct nlmsghdr *nlh;
	struct nlmsghdr *nlh;
	int err;
	int err;
	struct sk_buff *skb;
	struct sk_buff *skb;
@@ -208,8 +208,7 @@ static void cn_rx_skb(struct sk_buff *__skb)
			return;
			return;
		}
		}


		msg = NLMSG_DATA(nlh);
		err = cn_call_callback(skb, (void (*)(void *))kfree_skb, skb);
		err = cn_call_callback(msg, (void (*)(void *))kfree_skb, skb);
		if (err < 0)
		if (err < 0)
			kfree_skb(skb);
			kfree_skb(skb);
	}
	}
+2 −2
Original line number Original line Diff line number Diff line
@@ -135,7 +135,7 @@ struct cn_callback_data {
	void (*destruct_data) (void *);
	void (*destruct_data) (void *);
	void *ddata;
	void *ddata;


	void *callback_priv;
	struct sk_buff *skb;
	void (*callback) (struct cn_msg *);
	void (*callback) (struct cn_msg *);


	void *free;
	void *free;