From: Thomas Gleixner Date: Tue, 3 Nov 2009 05:16:28 +0000 (-0800) Subject: watchdog: Remove BKL from rio watchdog driver X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=462265bf494c4f2a2f6e06480590becadecbfea7;p=mv-sheeva.git watchdog: Remove BKL from rio watchdog driver cycle_kernel_lock() was added with the BKL pushdown. The rio driver indeed needs that because riowd_device is initialized after misc_register(). So an open(), write/ioctl() which happens to get between misc_register returning and riowd_device initialization would dereference a NULL pointer. Move riowd_device initialization before misc_register() and get rid of cycle_kernel_lock(). Signed-off-by: Thomas Gleixner Signed-off-by: David S. Miller --- diff --git a/drivers/watchdog/riowd.c b/drivers/watchdog/riowd.c index d3c824dc235..c14ae867690 100644 --- a/drivers/watchdog/riowd.c +++ b/drivers/watchdog/riowd.c @@ -10,7 +10,6 @@ #include #include #include -#include #include #include #include @@ -75,7 +74,6 @@ static void riowd_writereg(struct riowd *p, u8 val, int index) static int riowd_open(struct inode *inode, struct file *filp) { - cycle_kernel_lock(); nonseekable_open(inode, filp); return 0; } @@ -194,6 +192,8 @@ static int __devinit riowd_probe(struct of_device *op, printk(KERN_ERR PFX "Cannot map registers.\n"); goto out_free; } + /* Make miscdev useable right away */ + riowd_device = p; err = misc_register(&riowd_miscdev); if (err) { @@ -205,10 +205,10 @@ static int __devinit riowd_probe(struct of_device *op, "regs at %p\n", riowd_timeout, p->regs); dev_set_drvdata(&op->dev, p); - riowd_device = p; return 0; out_iounmap: + riowd_device = NULL; of_iounmap(&op->resource[0], p->regs, 2); out_free: