diff options
author | Dan Carpenter <dan.carpenter@oracle.com> | 2018-01-19 16:22:36 +0300 |
---|---|---|
committer | Bjorn Andersson <bjorn.andersson@linaro.org> | 2018-01-19 18:04:33 +0300 |
commit | c3388a075c8ac568f892c40bec919ba8ac4077f0 (patch) | |
tree | 79f0edf21d846df03b3d9e9aafd888084d7d28b8 /drivers/rpmsg | |
parent | fb416f69900773d5a6030c909114099f92d07ab9 (diff) | |
download | linux-c3388a075c8ac568f892c40bec919ba8ac4077f0.tar.xz |
rpmsg: smd: Fix double unlock in __qcom_smd_send()
We're not holding the lock here, so we shouldn't unlock.
Fixes: 178f3f75bb4e ("rpmsg: smd: Don't hold the tx lock during wait")
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
[bjorn: renamed "out" label to further distinguish the two exit paths]
Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Diffstat (limited to 'drivers/rpmsg')
-rw-r--r-- | drivers/rpmsg/qcom_smd.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/drivers/rpmsg/qcom_smd.c b/drivers/rpmsg/qcom_smd.c index 10870189c0c8..e92fd0129658 100644 --- a/drivers/rpmsg/qcom_smd.c +++ b/drivers/rpmsg/qcom_smd.c @@ -747,7 +747,7 @@ static int __qcom_smd_send(struct qcom_smd_channel *channel, const void *data, channel->state == SMD_CHANNEL_OPENED) { if (!wait) { ret = -EAGAIN; - goto out; + goto out_unlock; } SET_TX_CHANNEL_FLAG(channel, fBLOCKREADINTR, 0); @@ -759,11 +759,11 @@ static int __qcom_smd_send(struct qcom_smd_channel *channel, const void *data, qcom_smd_get_tx_avail(channel) >= tlen || channel->state != SMD_CHANNEL_OPENED); if (ret) - goto out; + return ret; ret = mutex_lock_interruptible(&channel->tx_lock); if (ret) - goto out; + return ret; SET_TX_CHANNEL_FLAG(channel, fBLOCKREADINTR, 1); } @@ -771,7 +771,7 @@ static int __qcom_smd_send(struct qcom_smd_channel *channel, const void *data, /* Fail if the channel was closed */ if (channel->state != SMD_CHANNEL_OPENED) { ret = -EPIPE; - goto out; + goto out_unlock; } SET_TX_CHANNEL_FLAG(channel, fTAIL, 0); @@ -786,7 +786,7 @@ static int __qcom_smd_send(struct qcom_smd_channel *channel, const void *data, qcom_smd_signal_channel(channel); -out: +out_unlock: mutex_unlock(&channel->tx_lock); return ret; |