Commit e4a7b9b0 authored by Wolfram Sang's avatar Wolfram Sang Committed by Jean Delvare

i2c-core: Erase pointer to clientdata on removal

After discovering that a lot of i2c-drivers leave the pointer to their
clientdata dangling, it was decided to let the core handle this issue.
It is assumed that the core may access the private data after remove()
as there are no guarantees for the lifetime of such pointers anyhow (see
thread starting at http://lkml.org/lkml/2010/3/21/68)
Signed-off-by: default avatarWolfram Sang <w.sang@pengutronix.de>
Signed-off-by: default avatarJean Delvare <khali@linux-fr.org>
parent d93ac51c
...@@ -74,6 +74,11 @@ structure at all. You should use this to keep device-specific data. ...@@ -74,6 +74,11 @@ structure at all. You should use this to keep device-specific data.
/* retrieve the value */ /* retrieve the value */
void *i2c_get_clientdata(const struct i2c_client *client); void *i2c_get_clientdata(const struct i2c_client *client);
Note that starting with kernel 2.6.34, you don't have to set the `data' field
to NULL in remove() or if probe() failed anymore. The i2c-core does this
automatically on these occasions. Those are also the only times the core will
touch this field.
Accessing the client Accessing the client
==================== ====================
......
...@@ -117,8 +117,10 @@ static int i2c_device_probe(struct device *dev) ...@@ -117,8 +117,10 @@ static int i2c_device_probe(struct device *dev)
dev_dbg(dev, "probe\n"); dev_dbg(dev, "probe\n");
status = driver->probe(client, i2c_match_id(driver->id_table, client)); status = driver->probe(client, i2c_match_id(driver->id_table, client));
if (status) if (status) {
client->driver = NULL; client->driver = NULL;
i2c_set_clientdata(client, NULL);
}
return status; return status;
} }
...@@ -139,8 +141,10 @@ static int i2c_device_remove(struct device *dev) ...@@ -139,8 +141,10 @@ static int i2c_device_remove(struct device *dev)
dev->driver = NULL; dev->driver = NULL;
status = 0; status = 0;
} }
if (status == 0) if (status == 0) {
client->driver = NULL; client->driver = NULL;
i2c_set_clientdata(client, NULL);
}
return status; return status;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment