i2c-smbus: Convert kzalloc to devm_kzalloc
Converting kzalloc to devm_kzalloc simplifies the code and ensures that the result, alert, is freed after the irq allocated by the subsequent devm_request_irq. This in turn ensures that when an interrupt can be triggered, the alert structure is still available. The problem of a free after a devm_request_irq was found using the following semantic match (http://coccinelle.lip6.fr/) // <smpl> @r exists@ expression e1,e2,x,a,b,c,d; identifier free; position p1,p2; @@ devm_request_irq@p1(e1,e2,...,x) ... when any when != e2 = a when != x = b if (...) { ... when != e2 = c when != x = d free@p2(...,x,...); ... return ...; } // </smpl> Signed-off-by: Julia Lawall <Julia.Lawall@lip6.fr> Signed-off-by: Jean Delvare <khali@linux-fr.org>
This commit is contained in:
parent
eee543e824
commit
71b578452e
1 changed files with 4 additions and 7 deletions
|
@ -142,7 +142,8 @@ static int smbalert_probe(struct i2c_client *ara,
|
|||
struct i2c_adapter *adapter = ara->adapter;
|
||||
int res;
|
||||
|
||||
alert = kzalloc(sizeof(struct i2c_smbus_alert), GFP_KERNEL);
|
||||
alert = devm_kzalloc(&ara->dev, sizeof(struct i2c_smbus_alert),
|
||||
GFP_KERNEL);
|
||||
if (!alert)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@ -154,10 +155,8 @@ static int smbalert_probe(struct i2c_client *ara,
|
|||
if (setup->irq > 0) {
|
||||
res = devm_request_irq(&ara->dev, setup->irq, smbalert_irq,
|
||||
0, "smbus_alert", alert);
|
||||
if (res) {
|
||||
kfree(alert);
|
||||
if (res)
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
i2c_set_clientdata(ara, alert);
|
||||
|
@ -167,14 +166,12 @@ static int smbalert_probe(struct i2c_client *ara,
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* IRQ resource is managed so it is freed automatically */
|
||||
/* IRQ and memory resources are managed so they are freed automatically */
|
||||
static int smbalert_remove(struct i2c_client *ara)
|
||||
{
|
||||
struct i2c_smbus_alert *alert = i2c_get_clientdata(ara);
|
||||
|
||||
cancel_work_sync(&alert->alert);
|
||||
|
||||
kfree(alert);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue