From: Alexey Dobriyan If ->open() wasn't called, returning 0 is misleading and, theoretically, oopsable: 1. remove_proc_entry clears ->proc_fops, drops lock, 2. ->open "succeeds", 3. ->release oopses, because it assumes ->open was called (single_release()). Signed-off-by: Alexey Dobriyan Signed-off-by: Andrew Morton --- fs/proc/inode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff -puN fs/proc/inode.c~proc-fix-return-value-of-proc_reg_open-in-too-late-case fs/proc/inode.c --- a/fs/proc/inode.c~proc-fix-return-value-of-proc_reg_open-in-too-late-case +++ a/fs/proc/inode.c @@ -350,7 +350,7 @@ static int proc_reg_open(struct inode *i if (!pde->proc_fops) { spin_unlock(&pde->pde_unload_lock); kfree(pdeo); - return rv; + return -EINVAL; } pde->pde_users++; open = pde->proc_fops->open; _