diff options
Diffstat (limited to 'drivers/connector/connector.c')
-rw-r--r-- | drivers/connector/connector.c | 40 |
1 files changed, 8 insertions, 32 deletions
diff --git a/drivers/connector/connector.c b/drivers/connector/connector.c index bf9716b75513..fea2d3ed9cbd 100644 --- a/drivers/connector/connector.c +++ b/drivers/connector/connector.c @@ -88,6 +88,7 @@ int cn_netlink_send(struct cn_msg *msg, u32 __group, gfp_t gfp_mask) if (cn_cb_equal(&__cbq->id.id, &msg->id)) { found = 1; group = __cbq->group; + break; } } spin_unlock_bh(&dev->cbdev->queue_lock); @@ -181,33 +182,14 @@ static int cn_call_callback(struct cn_msg *msg, void (*destruct_data)(void *), v } /* - * Skb receive helper - checks skb and msg size and calls callback - * helper. - */ -static int __cn_rx_skb(struct sk_buff *skb, struct nlmsghdr *nlh) -{ - u32 pid, uid, seq, group; - struct cn_msg *msg; - - pid = NETLINK_CREDS(skb)->pid; - uid = NETLINK_CREDS(skb)->uid; - seq = nlh->nlmsg_seq; - group = NETLINK_CB((skb)).dst_group; - msg = NLMSG_DATA(nlh); - - return cn_call_callback(msg, (void (*)(void *))kfree_skb, skb); -} - -/* * Main netlink receiving function. * - * It checks skb and netlink header sizes and calls the skb receive - * helper with a shared skb. + * It checks skb, netlink header and msg sizes, and calls callback helper. */ static void cn_rx_skb(struct sk_buff *__skb) { + struct cn_msg *msg; struct nlmsghdr *nlh; - u32 len; int err; struct sk_buff *skb; @@ -223,11 +205,8 @@ static void cn_rx_skb(struct sk_buff *__skb) return; } - len = NLMSG_ALIGN(nlh->nlmsg_len); - if (len > skb->len) - len = skb->len; - - err = __cn_rx_skb(skb, nlh); + msg = NLMSG_DATA(nlh); + err = cn_call_callback(msg, (void (*)(void *))kfree_skb, skb); if (err < 0) kfree_skb(skb); } @@ -441,8 +420,7 @@ static int __devinit cn_init(void) dev->cbdev = cn_queue_alloc_dev("cqueue", dev->nls); if (!dev->cbdev) { - if (dev->nls->sk_socket) - sock_release(dev->nls->sk_socket); + netlink_kernel_release(dev->nls); return -EINVAL; } @@ -452,8 +430,7 @@ static int __devinit cn_init(void) if (err) { cn_already_initialized = 0; cn_queue_free_dev(dev->cbdev); - if (dev->nls->sk_socket) - sock_release(dev->nls->sk_socket); + netlink_kernel_release(dev->nls); return -EINVAL; } @@ -468,8 +445,7 @@ static void __devexit cn_fini(void) cn_del_callback(&dev->id); cn_queue_free_dev(dev->cbdev); - if (dev->nls->sk_socket) - sock_release(dev->nls->sk_socket); + netlink_kernel_release(dev->nls); } subsys_initcall(cn_init); |