diff options
| author | Philipp Reisner <philipp.reisner@linbit.com> | 2009-10-02 02:40:04 +0000 | 
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2009-10-02 10:53:58 -0700 | 
| commit | 293500a23f4b0698cb04abfecfc9a954d8ab2742 (patch) | |
| tree | 15c873cfbdaebe5f644ae60958c656fd449061d5 /drivers/connector/connector.c | |
| parent | 19d5afd4f0d26201d8d8bec351ee0442775a5379 (diff) | |
| download | olio-linux-3.10-293500a23f4b0698cb04abfecfc9a954d8ab2742.tar.xz olio-linux-3.10-293500a23f4b0698cb04abfecfc9a954d8ab2742.zip  | |
connector: Keep the skb in cn_callback_data
Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Acked-by: Lars Ellenberg <lars.ellenberg@linbit.com>
Acked-by: Evgeniy Polyakov <zbr@ioremap.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/connector/connector.c')
| -rw-r--r-- | drivers/connector/connector.c | 11 | 
1 files changed, 5 insertions, 6 deletions
diff --git a/drivers/connector/connector.c b/drivers/connector/connector.c index 74f52af7956..fc9887fa453 100644 --- a/drivers/connector/connector.c +++ b/drivers/connector/connector.c @@ -129,10 +129,11 @@ EXPORT_SYMBOL_GPL(cn_netlink_send);  /*   * 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_dev *dev = &cdev; +	struct cn_msg *msg = NLMSG_DATA(nlmsg_hdr(skb));  	int err = -ENODEV;  	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 (likely(!work_pending(&__cbq->work) &&  					__cbq->data.ddata == NULL)) { -				__cbq->data.callback_priv = msg; +				__cbq->data.skb = skb;  				__cbq->data.ddata = 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);  				if (__new_cbq) {  					d = &__new_cbq->data; -					d->callback_priv = msg; +					d->skb = skb;  					d->callback = __cbq->data.callback;  					d->ddata = 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)  { -	struct cn_msg *msg;  	struct nlmsghdr *nlh;  	int err;  	struct sk_buff *skb; @@ -208,8 +208,7 @@ static void cn_rx_skb(struct sk_buff *__skb)  			return;  		} -		msg = NLMSG_DATA(nlh); -		err = cn_call_callback(msg, (void (*)(void *))kfree_skb, skb); +		err = cn_call_callback(skb, (void (*)(void *))kfree_skb, skb);  		if (err < 0)  			kfree_skb(skb);  	}  |