diff options
Diffstat (limited to 'drivers/connector/connector.c')
| -rw-r--r-- | drivers/connector/connector.c | 30 | 
1 files changed, 18 insertions, 12 deletions
diff --git a/drivers/connector/connector.c b/drivers/connector/connector.c index dde6a0fad40..82fa4f0f91d 100644 --- a/drivers/connector/connector.c +++ b/drivers/connector/connector.c @@ -1,5 +1,5 @@  /* - * 	connector.c + *	connector.c   *   * 2004+ Copyright (c) Evgeniy Polyakov <zbr@ioremap.net>   * All rights reserved. @@ -101,19 +101,19 @@ int cn_netlink_send(struct cn_msg *msg, u32 __group, gfp_t gfp_mask)  	if (!skb)  		return -ENOMEM; -	nlh = NLMSG_PUT(skb, 0, msg->seq, NLMSG_DONE, size - sizeof(*nlh)); +	nlh = nlmsg_put(skb, 0, msg->seq, NLMSG_DONE, size - sizeof(*nlh), 0); +	if (!nlh) { +		kfree_skb(skb); +		return -EMSGSIZE; +	} -	data = NLMSG_DATA(nlh); +	data = nlmsg_data(nlh);  	memcpy(data, msg, sizeof(*data) + msg->len);  	NETLINK_CB(skb).dst_group = group;  	return netlink_broadcast(dev->nls, skb, 0, group, gfp_mask); - -nlmsg_failure: -	kfree_skb(skb); -	return -EINVAL;  }  EXPORT_SYMBOL_GPL(cn_netlink_send); @@ -185,7 +185,8 @@ static void cn_rx_skb(struct sk_buff *__skb)   * May sleep.   */  int cn_add_callback(struct cb_id *id, const char *name, -		    void (*callback)(struct cn_msg *, struct netlink_skb_parms *)) +		    void (*callback)(struct cn_msg *, +				     struct netlink_skb_parms *))  {  	int err;  	struct cn_dev *dev = &cdev; @@ -251,15 +252,20 @@ static const struct file_operations cn_file_ops = {  	.release = single_release  }; +static struct cn_dev cdev = { +	.input   = cn_rx_skb, +}; +  static int __devinit cn_init(void)  {  	struct cn_dev *dev = &cdev; - -	dev->input = cn_rx_skb; +	struct netlink_kernel_cfg cfg = { +		.groups	= CN_NETLINK_USERS + 0xf, +		.input	= dev->input, +	};  	dev->nls = netlink_kernel_create(&init_net, NETLINK_CONNECTOR, -					 CN_NETLINK_USERS + 0xf, -					 dev->input, NULL, THIS_MODULE); +					 THIS_MODULE, &cfg);  	if (!dev->nls)  		return -EIO;  |