drivers/video: release mutex in error handling code
authorJulia Lawall <julia@diku.dk>
Wed, 30 Jul 2008 05:33:28 +0000 (22:33 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 30 Jul 2008 16:41:45 +0000 (09:41 -0700)
The mutex is released on a successful return, so it would seem that it
should be released on an error return as well.

The semantic patch finds this problem is as follows:
(http://www.emn.fr/x-info/coccinelle/)

// <smpl>
@@
expression l;
@@

mutex_lock(l);
... when != mutex_unlock(l)
    when any
    when strict
(
if (...) { ... when != mutex_unlock(l)
+   mutex_unlock(l);
    return ...;
}
|
mutex_unlock(l);
)
// </smpl>

Signed-off-by: Julia Lawall <julia@diku.dk>
Acked-by: Krzysztof Helt <krzysztof.h1@wp.pl>
Acked-by: Ondrej Zajicek <santiago@crfreenet.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/video/arkfb.c
drivers/video/vt8623fb.c

index 5001bd4..38a1e83 100644 (file)
@@ -1126,11 +1126,8 @@ static int ark_pci_resume (struct pci_dev* dev)
        acquire_console_sem();
        mutex_lock(&(par->open_lock));
 
-       if (par->ref_count == 0) {
-               mutex_unlock(&(par->open_lock));
-               release_console_sem();
-               return 0;
-       }
+       if (par->ref_count == 0)
+               goto fail;
 
        pci_set_power_state(dev, PCI_D0);
        pci_restore_state(dev);
@@ -1143,8 +1140,8 @@ static int ark_pci_resume (struct pci_dev* dev)
        arkfb_set_par(info);
        fb_set_suspend(info, 0);
 
-       mutex_unlock(&(par->open_lock));
 fail:
+       mutex_unlock(&(par->open_lock));
        release_console_sem();
        return 0;
 }
index 536ab11..4a484ee 100644 (file)
@@ -853,11 +853,8 @@ static int vt8623_pci_resume(struct pci_dev* dev)
        acquire_console_sem();
        mutex_lock(&(par->open_lock));
 
-       if (par->ref_count == 0) {
-               mutex_unlock(&(par->open_lock));
-               release_console_sem();
-               return 0;
-       }
+       if (par->ref_count == 0)
+               goto fail;
 
        pci_set_power_state(dev, PCI_D0);
        pci_restore_state(dev);
@@ -870,8 +867,8 @@ static int vt8623_pci_resume(struct pci_dev* dev)
        vt8623fb_set_par(info);
        fb_set_suspend(info, 0);
 
-       mutex_unlock(&(par->open_lock));
 fail:
+       mutex_unlock(&(par->open_lock));
        release_console_sem();
 
        return 0;