X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=drivers%2Fconnector%2Fconnector.c;h=a44db75bc25bac35e97905c096fe50ffa2686c3e;hb=8c4a013da84e69e4d736363921792e1b37525577;hp=b49bacfd8de8cb6800a833526424a53a303ddefb;hpb=2a2ed2db353d949c06b6ef8b6913f65b39111eab;p=powerpc.git diff --git a/drivers/connector/connector.c b/drivers/connector/connector.c index b49bacfd8d..a44db75bc2 100644 --- a/drivers/connector/connector.c +++ b/drivers/connector/connector.c @@ -135,7 +135,7 @@ static int cn_call_callback(struct cn_msg *msg, void (*destruct_data)(void *), v 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,32 +143,28 @@ 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); - + __cbq = kzalloc(sizeof(*__cbq), GFP_ATOMIC); + if (__cbq) { + d = &__cbq->data; d->callback_priv = msg; d->callback = __cbq->data.callback; d->ddata = data; d->destruct_data = destruct_data; - d->free = w; + d->free = __cbq; - INIT_LIST_HEAD(&w->entry); - w->pending = 0; - w->func = &cn_queue_wrapper; - w->data = d; - init_timer(&w->timer); + INIT_WORK(&__cbq->work, + &cn_queue_wrapper); - if (queue_work(dev->cbdev->cn_queue, w)) + if (queue_work(dev->cbdev->cn_queue, + &__cbq->work)) err = 0; else { - kfree(w); + kfree(__cbq); err = -EINVAL; } } else