mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-10-31 16:54:21 +00:00 
			
		
		
		
	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>
This commit is contained in:
		
							parent
							
								
									19d5afd4f0
								
							
						
					
					
						commit
						293500a23f
					
				
					 3 changed files with 9 additions and 9 deletions
				
			
		|  | @ -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; | ||||||
|  |  | ||||||
|  | @ -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); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -134,8 +134,8 @@ struct cn_callback_id { | ||||||
| struct cn_callback_data { | 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; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Philipp Reisner
						Philipp Reisner