stm class: Fix unlocking braino in the error path
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>
This commit is contained in:
parent
1192918530
commit
1810f2c448
|
@ -816,10 +816,8 @@ static void __stm_source_link_drop(struct stm_source_device *src,
|
||||||
spin_lock(&stm->link_lock);
|
spin_lock(&stm->link_lock);
|
||||||
spin_lock(&src->link_lock);
|
spin_lock(&src->link_lock);
|
||||||
link = srcu_dereference_check(src->link, &stm_source_srcu, 1);
|
link = srcu_dereference_check(src->link, &stm_source_srcu, 1);
|
||||||
if (WARN_ON_ONCE(link != stm)) {
|
if (WARN_ON_ONCE(link != stm))
|
||||||
spin_unlock(&src->link_lock);
|
goto unlock;
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
stm_output_free(link, &src->output);
|
stm_output_free(link, &src->output);
|
||||||
list_del_init(&src->link_entry);
|
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);
|
stm_put_device(link);
|
||||||
rcu_assign_pointer(src->link, NULL);
|
rcu_assign_pointer(src->link, NULL);
|
||||||
|
|
||||||
|
unlock:
|
||||||
spin_unlock(&src->link_lock);
|
spin_unlock(&src->link_lock);
|
||||||
spin_unlock(&stm->link_lock);
|
spin_unlock(&stm->link_lock);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue