Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 78ae87c3 authored by Andrew Morton's avatar Andrew Morton Committed by Linus Torvalds
Browse files

vanishing ioctl handler debugging



We've had several reoprts of the CPU jumping to 0x00000000 is do_ioctl().  I
assume that there's a race and someone is zeroing out the ioctl handler while
this CPU waits for the lock_kernel().

The patch adds code to detect this, then emits stuff which will hopefuly lead
us to the culprit.

Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 4c738480
Loading
Loading
Loading
Loading
+11 −3
Original line number Original line Diff line number Diff line
@@ -12,6 +12,7 @@
#include <linux/fs.h>
#include <linux/fs.h>
#include <linux/security.h>
#include <linux/security.h>
#include <linux/module.h>
#include <linux/module.h>
#include <linux/kallsyms.h>


#include <asm/uaccess.h>
#include <asm/uaccess.h>
#include <asm/ioctls.h>
#include <asm/ioctls.h>
@@ -20,6 +21,7 @@ static long do_ioctl(struct file *filp, unsigned int cmd,
		unsigned long arg)
		unsigned long arg)
{
{
	int error = -ENOTTY;
	int error = -ENOTTY;
	void *f;


	if (!filp->f_op)
	if (!filp->f_op)
		goto out;
		goto out;
@@ -29,10 +31,16 @@ static long do_ioctl(struct file *filp, unsigned int cmd,
		if (error == -ENOIOCTLCMD)
		if (error == -ENOIOCTLCMD)
			error = -EINVAL;
			error = -EINVAL;
		goto out;
		goto out;
	} else if (filp->f_op->ioctl) {
	} else if ((f = filp->f_op->ioctl)) {
		lock_kernel();
		lock_kernel();
		if (!filp->f_op->ioctl) {
			printk("%s: ioctl %p disappeared\n", __FUNCTION__, f);
			print_symbol("symbol: %s\n", (unsigned long)f);
			dump_stack();
		} else {
			error = filp->f_op->ioctl(filp->f_path.dentry->d_inode,
			error = filp->f_op->ioctl(filp->f_path.dentry->d_inode,
						  filp, cmd, arg);
						  filp, cmd, arg);
		}
		unlock_kernel();
		unlock_kernel();
	}
	}