lkml.org 
[lkml]   [2006]   [Nov]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    SubjectRe: [PATCH -mm 3/3][AIO] - AIO completion signal notification
    From
    Date
    On Thu, 2006-11-09 at 16:59 +0100, Sébastien Dugué wrote:

    > +
    > +static long aio_setup_sigevent(struct kiocb *iocb,
    > + struct sigevent __user *user_event)
    > +{
    > + int error = 0;
    > + sigevent_t event;
    > + struct task_struct *target;
    > + unsigned long flags;
    > +
    > + if (!access_ok(VERIFY_READ, user_event, sizeof(struct sigevent)))
    > + return -EFAULT;
    > +
    > + if (copy_from_user(&event, user_event, sizeof (event)))
    > + return -EFAULT;
    > +
    > + /* Check for the SIGEV_NONE case */
    > + if (event.sigev_notify == SIGEV_NONE)
    > + return 0;
    > +
    > + /* Setup the request completion notification parameters */
    > + iocb->ki_notify.notify = event.sigev_notify;
    > + iocb->ki_notify.signo = event.sigev_signo;
    > + iocb->ki_notify.value = event.sigev_value;
    > +
    > + /* Now get the notification target */
    > + read_lock(&tasklist_lock);
    > +
    > + if ((target = good_sigevent(&event))) {
    > +
    > + spin_lock_irqsave(&target->sighand->siglock, flags);
    > +
    > + if (!(target->flags & PF_EXITING)) {
    > + iocb->ki_notify.target = target;
    > +
    > + spin_unlock_irqrestore(&target->sighand->siglock, flags);
    > +
    > + /*
    > + * Get a ref on the task. It is dropped in really_put_req()
    > + * when we're done with the iocb, be it from the normal
    > + * completion path, the cancellation path or an error path.
    > + */
    > + if (iocb->ki_notify.notify == (SIGEV_SIGNAL|SIGEV_THREAD_ID))
    > + get_task_struct(target);
    > + } else {
    > + spin_unlock_irqrestore(&target->sighand->siglock, flags);
    > + error = -EINVAL;
    > + }
    > + } else
    > + error = -EINVAL;
    > +
    > + read_unlock(&tasklist_lock);
    > +
    > + if (!error) {
    > + /*
    > + * Alloc a sigqueue for this request
    > + *
    > + * NOTE: we cannot free the sigqueue in the completion path as
    > + * the signal may not have been delivered to the target task.
    > + * Therefore it has to be freed in __sigqueue_free() when the
    > + * signal is collected if si_code is SI_ASYNCIO.
    > + */
    > + if (unlikely(!(iocb->ki_sigq = sigqueue_alloc())))
    > + error = -EAGAIN;

    Don't you have to do put_task_struct() here ?

    > + }
    > +
    > +
    > + return error;
    > +}
    > +

    Thanks,
    Badari

    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2006-11-09 19:49    [W:0.025 / U:30.052 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site