V4L/DVB (6475): Fix some troubles at list handling
authorMauro Carvalho Chehab <mchehab@infradead.org>
Mon, 29 Oct 2007 20:38:59 +0000 (17:38 -0300)
committerMauro Carvalho Chehab <mchehab@infradead.org>
Fri, 25 Jan 2008 21:01:35 +0000 (19:01 -0200)
- priv->count were wrong. Should be incremented since the first usage;
- forgot to use list_del() to remove the driver;
- Release memory if an error occurs during _attach

Thanks to Aidan Thornton <makosoft@googlemail.com> for pointing this.

Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
drivers/media/video/tuner-xc2028.c

index 7d53d58aafa183338097a27a2740cfd24b9ee567..c5bdeff54288abf9f0d3b1bc1e47c1d7db6ecb08 100644 (file)
@@ -639,6 +639,8 @@ static int xc2028_dvb_release(struct dvb_frontend *fe)
        priv->count--;
 
        if (!priv->count) {
+               list_del(&priv->xc2028_list);
+
                if (priv->ctrl.fname)
                        kfree(priv->ctrl.fname);
 
@@ -728,7 +730,6 @@ int xc2028_attach(struct dvb_frontend *fe, struct i2c_adapter* i2c_adap,
        list_for_each_entry(priv, &xc2028_list, xc2028_list) {
                if (priv->dev == dev) {
                        dev = NULL;
-                       priv->count++;
                }
        }
 
@@ -754,6 +755,7 @@ int xc2028_attach(struct dvb_frontend *fe, struct i2c_adapter* i2c_adap,
 
                list_add_tail(&priv->xc2028_list,&xc2028_list);
        }
+       priv->count++;
 
        memcpy(&fe->ops.tuner_ops, &xc2028_dvb_tuner_ops,
                                               sizeof(xc2028_dvb_tuner_ops));