return sig;
}
-static struct sigqueue *__sigqueue_alloc(void)
+static inline struct sigqueue *__sigqueue_alloc(struct task_struct *t, int flags)
{
struct sigqueue *q = NULL;
- if (atomic_read(¤t->user->sigpending) <
- current->signal->rlim[RLIMIT_SIGPENDING].rlim_cur)
- q = kmem_cache_alloc(sigqueue_cachep, GFP_ATOMIC);
+ if (atomic_read(&t->user->sigpending) <
+ t->signal->rlim[RLIMIT_SIGPENDING].rlim_cur)
+ q = kmem_cache_alloc(sigqueue_cachep, flags);
if (q) {
INIT_LIST_HEAD(&q->list);
q->flags = 0;
q->lock = NULL;
- q->user = get_uid(current->user);
+ q->user = get_uid(t->user);
atomic_inc(&q->user->sigpending);
}
return(q);
make sure at least one signal gets delivered and don't
pass on the info struct. */
- if (atomic_read(&t->user->sigpending) <
- t->signal->rlim[RLIMIT_SIGPENDING].rlim_cur)
- q = kmem_cache_alloc(sigqueue_cachep, GFP_ATOMIC);
-
+ q = __sigqueue_alloc(t, GFP_ATOMIC);
if (q) {
- q->flags = 0;
- q->user = get_uid(t->user);
- atomic_inc(&q->user->sigpending);
list_add_tail(&q->list, &signals->list);
switch ((unsigned long) info) {
case 0:
{
struct sigqueue *q;
- if ((q = __sigqueue_alloc()))
+ if ((q = __sigqueue_alloc(current, GFP_KERNEL)))
q->flags |= SIGQUEUE_PREALLOC;
return(q);
}