]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
PCI hotplug: fix lock imbalance in pciehp
authorJiri Slaby <jirislaby@gmail.com>
Sat, 17 Jan 2009 15:23:55 +0000 (16:23 +0100)
committerGreg Kroah-Hartman <gregkh@suse.de>
Mon, 2 Feb 2009 16:28:16 +0000 (08:28 -0800)
commit c2fdd36b550659f5ac2240d1f5a83ffa1a092289 upstream.

set_lock_status omits mutex_unlock in fail path. Add the omitted
unlock.

As a result a lockup caused by this can be triggered from userspace
by writing 1 to /sys/bus/pci/slots/.../lock often enough.

Signed-off-by: Jiri Slaby <jirislaby@gmail.com>
Reviewed-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/pci/hotplug/pciehp_core.c

index 6e18736667639c22d58d64b02ce772b4da3071b1..6d9b0743031d374344b842e007edfa06909bd8d9 100644 (file)
@@ -126,8 +126,10 @@ static int set_lock_status(struct hotplug_slot *hotplug_slot, u8 status)
        mutex_lock(&slot->ctrl->crit_sect);
 
        /* has it been >1 sec since our last toggle? */
-       if ((get_seconds() - slot->last_emi_toggle) < 1)
+       if ((get_seconds() - slot->last_emi_toggle) < 1) {
+               mutex_unlock(&slot->ctrl->crit_sect);
                return -EINVAL;
+       }
 
        /* see what our current state is */
        retval = get_lock_status(hotplug_slot, &value);