From aea16005f4081a745c2178e6e4e5825c01a6226e Mon Sep 17 00:00:00 2001 From: Daniel Scheller Date: Sun, 26 Nov 2017 08:00:04 -0500 Subject: [PATCH] media: dvb-frontends/stv0910: WARN_ON() on consecutive mutex_unlock() Stack dump when gate_ctrl() is called in a way that consecutive unlocks happen. This is a clear indication that other drivers interfacing with the stv0910 driver don't do things properly or don't check for failures, so dump stack so that those drivers can be identified and fixed. Signed-off-by: Daniel Scheller Tested-by: Richard Scobie Signed-off-by: Mauro Carvalho Chehab --- drivers/media/dvb-frontends/stv0910.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/media/dvb-frontends/stv0910.c b/drivers/media/dvb-frontends/stv0910.c index 73f6df0abbfe..4b7e901220e4 100644 --- a/drivers/media/dvb-frontends/stv0910.c +++ b/drivers/media/dvb-frontends/stv0910.c @@ -1241,7 +1241,8 @@ static int gate_ctrl(struct dvb_frontend *fe, int enable) if (write_reg(state, state->nr ? RSTV0910_P2_I2CRPT : RSTV0910_P1_I2CRPT, i2crpt) < 0) { /* don't hold the I2C bus lock on failure */ - mutex_unlock(&state->base->i2c_lock); + if (!WARN_ON(!mutex_is_locked(&state->base->i2c_lock))) + mutex_unlock(&state->base->i2c_lock); dev_err(&state->base->i2c->dev, "%s() write_reg failure (enable=%d)\n", __func__, enable); @@ -1251,7 +1252,8 @@ static int gate_ctrl(struct dvb_frontend *fe, int enable) state->i2crpt = i2crpt; if (!enable) - mutex_unlock(&state->base->i2c_lock); + if (!WARN_ON(!mutex_is_locked(&state->base->i2c_lock))) + mutex_unlock(&state->base->i2c_lock); return 0; } -- 2.45.2