long compat_sys_timer_create(clockid_t which_clock, struct compat_sigevent __user *timer_event_spec, timer_t __user *created_timer_id) { struct sigevent __user *event = NULL; if (timer_event_spec) { struct sigevent kevent; event = compat_alloc_user_space(sizeof(*event)); if (get_compat_sigevent(&kevent, timer_event_spec) || copy_to_user(event, &kevent, sizeof(*event))) return -EFAULT; } return sys_timer_create(which_clock, event, created_timer_id); }
static int create_posix_timers(struct task_restore_args *args) { int ret, i; timer_t next_id; struct sigevent sev; for (i = 0; i < args->timer_n; i++) { sev.sigev_notify = args->posix_timers[i].spt.it_sigev_notify; sev.sigev_signo = args->posix_timers[i].spt.si_signo; sev.sigev_value.sival_ptr = args->posix_timers[i].spt.sival_ptr; while (1) { ret = sys_timer_create(args->posix_timers[i].spt.clock_id, &sev, &next_id); if (ret < 0) { pr_err("Can't create posix timer - %d\n", i); return ret; } if ((long)next_id == args->posix_timers[i].spt.it_id) break; ret = sys_timer_delete(next_id); if (ret < 0) { pr_err("Can't remove temporaty posix timer %lx\n", (long) next_id); return ret; } if ((long)next_id > args->posix_timers[i].spt.it_id) { pr_err("Can't create timers, kernel don't give them consequently"); return -1; } } } return 0; }