stm class: Fix unlocking braino in the error path
authorAlexander Shishkin <alexander.shishkin@linux.intel.com>
Mon, 15 Feb 2016 17:12:05 +0000 (19:12 +0200)
committerMathieu Poirier <mathieu.poirier@linaro.org>
Wed, 1 Jun 2016 21:28:45 +0000 (15:28 -0600)
If an illegal attempt is made to unlink stm source device from an
stm device, the stm device's link spinlock mistakenly remains locked.
While this really shouldn't happen (there's a warning in place), the
locking should remain in order so that we can still recover from this
situation if it indeed does happen.

This patch unifies the unlocking in the exit path of
__stm_source_link_drop() to fix this.

Reported-by: Laurent Fert <laurent.fert@intel.com>
Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
(cherry picked from commit 1810f2c44817c74ca3d05d1e3981e3a2e2ceb6f5)

drivers/hwtracing/stm/core.c

index 1f2b7b47692d76834f3eebcd45f8e345484a0881..7aaed081fbf91359f6bfece97ac8a7022f3e815e 100644 (file)
@@ -816,10 +816,8 @@ static void __stm_source_link_drop(struct stm_source_device *src,
        spin_lock(&stm->link_lock);
        spin_lock(&src->link_lock);
        link = srcu_dereference_check(src->link, &stm_source_srcu, 1);
-       if (WARN_ON_ONCE(link != stm)) {
-               spin_unlock(&src->link_lock);
-               return;
-       }
+       if (WARN_ON_ONCE(link != stm))
+               goto unlock;
 
        stm_output_free(link, &src->output);
        list_del_init(&src->link_entry);
@@ -827,6 +825,7 @@ static void __stm_source_link_drop(struct stm_source_device *src,
        stm_put_device(link);
        rcu_assign_pointer(src->link, NULL);
 
+unlock:
        spin_unlock(&src->link_lock);
        spin_unlock(&stm->link_lock);
 }