static int do_vperfctr_control(struct vperfctr *perfctr, unsigned int cmd, struct task_struct *tsk) { switch (cmd) { case VPERFCTR_CONTROL_UNLINK: return do_vperfctr_unlink(perfctr, tsk); case VPERFCTR_CONTROL_SUSPEND: return do_vperfctr_suspend(perfctr, tsk); case VPERFCTR_CONTROL_RESUME: return do_vperfctr_resume(perfctr, tsk); case VPERFCTR_CONTROL_CLEAR: return do_vperfctr_clear(perfctr, tsk); default: return -EINVAL; } }
asmlinkage long sys_vperfctr_unlink(int fd) { struct vperfctr *perfctr; struct task_struct *tsk; int ret; perfctr = fd_get_vperfctr(fd); if (IS_ERR(perfctr)) return PTR_ERR(perfctr); tsk = vperfctr_get_tsk(perfctr); if (IS_ERR(tsk)) { ret = PTR_ERR(tsk); goto out; } ret = do_vperfctr_unlink(perfctr, tsk); vperfctr_put_tsk(tsk); out: put_vperfctr(perfctr); return ret; }