From: Julia Lawall <julia@xxxxxxx> Add a read_unlock missing on the error path. Other ways of reaching out_unlock have tasklist_lock unlocked. The semantic match that finds this problem is as follows: (http://coccinelle.lip6.fr/) // <smpl> @@ expression E1; @@ * read_lock(E1,...); <+... when != E1 if (...) { ... when != E1 * return ...; } ...+> * read_unlock(E1,...); // </smpl> Signed-off-by: Julia Lawall <julia@xxxxxxx> --- I wasn't able to find what security_task_setscheduler actually does. If it releases tasklist_lock in an error case, then ignire this patch. arch/mips/kernel/mips-mt-fpaff.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/arch/mips/kernel/mips-mt-fpaff.c b/arch/mips/kernel/mips-mt-fpaff.c index f5981c4..73581bf 100644 --- a/arch/mips/kernel/mips-mt-fpaff.c +++ b/arch/mips/kernel/mips-mt-fpaff.c @@ -86,8 +86,10 @@ asmlinkage long mipsmt_sys_sched_setaffinity(pid_t pid, unsigned int len, } retval = security_task_setscheduler(p, 0, NULL); - if (retval) + if (retval) { + read_unlock(&tasklist_lock); goto out_unlock; + } /* Record new user-specified CPU set for future reference */ p->thread.user_cpus_allowed = new_mask;