]> git.proxmox.com Git - mirror_ubuntu-disco-kernel.git/commitdiff
media: dvb-frontends/stv0910: WARN_ON() on consecutive mutex_unlock()
authorDaniel Scheller <d.scheller@gmx.net>
Sun, 26 Nov 2017 13:00:04 +0000 (08:00 -0500)
committerMauro Carvalho Chehab <mchehab@s-opensource.com>
Wed, 13 Dec 2017 13:35:10 +0000 (08:35 -0500)
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 <d.scheller@gmx.net>
Tested-by: Richard Scobie <rascobie@slingshot.co.nz>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
drivers/media/dvb-frontends/stv0910.c

index 73f6df0abbfe117ad87e7f7983411dd5c55c01f7..4b7e901220e4dfe2e9646181f2ccd4158f84ea13 100644 (file)
@@ -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;
 }