X-Git-Url: http://ftp.safe.ca/?a=blobdiff_plain;f=drivers%2Fconnector%2Fconnector.c;h=a7b9e9bb3e8d54017480857d2b7cc6dbceedcc6f;hb=f41d229865c984015914221959675b1c8723f6a7;hp=4cec1a82fd43ad45ee28e94e40b49cbe4b9456e3;hpb=d8172d822fb02d5c4f7508e41f9267428dd3d891;p=safe%2Fjmp%2Flinux-2.6 diff --git a/drivers/connector/connector.c b/drivers/connector/connector.c index 4cec1a8..a7b9e9b 100644 --- a/drivers/connector/connector.c +++ b/drivers/connector/connector.c @@ -128,49 +128,47 @@ EXPORT_SYMBOL_GPL(cn_netlink_send); */ static int cn_call_callback(struct cn_msg *msg, void (*destruct_data)(void *), void *data) { - struct cn_callback_entry *__cbq; + struct cn_callback_entry *__cbq, *__new_cbq; struct cn_dev *dev = &cdev; int err = -ENODEV; spin_lock_bh(&dev->cbdev->queue_lock); list_for_each_entry(__cbq, &dev->cbdev->queue_list, callback_entry) { if (cn_cb_equal(&__cbq->id.id, &msg->id)) { - if (likely(!work_pending(&__cbq->work.work) && + if (likely(!work_pending(&__cbq->work) && __cbq->data.ddata == NULL)) { __cbq->data.callback_priv = msg; __cbq->data.ddata = data; __cbq->data.destruct_data = destruct_data; - if (queue_delayed_work( - dev->cbdev->cn_queue, - &__cbq->work, 0)) + if (queue_work(dev->cbdev->cn_queue, + &__cbq->work)) err = 0; } else { struct cn_callback_data *d; - __cbq = kzalloc(sizeof(*__cbq), GFP_ATOMIC); - if (__cbq) { - d = &__cbq->data; + err = -ENOMEM; + __new_cbq = kzalloc(sizeof(struct cn_callback_entry), GFP_ATOMIC); + if (__new_cbq) { + d = &__new_cbq->data; d->callback_priv = msg; d->callback = __cbq->data.callback; d->ddata = data; d->destruct_data = destruct_data; - d->free = __cbq; - - INIT_DELAYED_WORK(&__cbq->work, - &cn_queue_wrapper); - - if (queue_delayed_work( - dev->cbdev->cn_queue, - &__cbq->work, 0)) + d->free = __new_cbq; + + INIT_WORK(&__new_cbq->work, + &cn_queue_wrapper); + + if (queue_work(dev->cbdev->cn_queue, + &__new_cbq->work)) err = 0; else { - kfree(__cbq); + kfree(__new_cbq); err = -EINVAL; } - } else - err = -ENOMEM; + } } break; } @@ -214,7 +212,7 @@ static void cn_rx_skb(struct sk_buff *__skb) skb = skb_get(__skb); if (skb->len >= NLMSG_SPACE(0)) { - nlh = (struct nlmsghdr *)skb->data; + nlh = nlmsg_hdr(skb); if (nlh->nlmsg_len < sizeof(struct cn_msg) || skb->len < nlh->nlmsg_len || @@ -450,7 +448,7 @@ static int __devinit cn_init(void) dev->nls = netlink_kernel_create(NETLINK_CONNECTOR, CN_NETLINK_USERS + 0xf, - dev->input, THIS_MODULE); + dev->input, NULL, THIS_MODULE); if (!dev->nls) return -EIO;