X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fconnector%2Fconnector.c;h=a905f782033196259dcdb46b5931701d0a642bad;hb=97bf2856c6014879bd04983a3e9dfcdac1e7fe85;hp=b49bacfd8de8cb6800a833526424a53a303ddefb;hpb=16c70f8c1b54b61c3b951b6fb220df250fe09b32;p=linux-2.6.git diff --git a/drivers/connector/connector.c b/drivers/connector/connector.c index b49bacfd8..a905f7820 100644 --- a/drivers/connector/connector.c +++ b/drivers/connector/connector.c @@ -128,14 +128,14 @@ 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(!test_bit(0, &__cbq->work.pending) && + if (likely(!work_pending(&__cbq->work) && __cbq->data.ddata == NULL)) { __cbq->data.callback_priv = msg; @@ -143,36 +143,32 @@ static int cn_call_callback(struct cn_msg *msg, void (*destruct_data)(void *), v __cbq->data.destruct_data = destruct_data; if (queue_work(dev->cbdev->cn_queue, - &__cbq->work)) + &__cbq->work)) err = 0; } else { - struct work_struct *w; struct cn_callback_data *d; - w = kzalloc(sizeof(*w) + sizeof(*d), GFP_ATOMIC); - if (w) { - d = (struct cn_callback_data *)(w+1); - + 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 = w; - - INIT_LIST_HEAD(&w->entry); - w->pending = 0; - w->func = &cn_queue_wrapper; - w->data = d; - init_timer(&w->timer); - - if (queue_work(dev->cbdev->cn_queue, w)) + 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(w); + kfree(__new_cbq); err = -EINVAL; } - } else - err = -ENOMEM; + } } break; }