Skip to content

Commit

Permalink
hwmon: (pmbus) Don't return errors from driver remove functions
Browse files Browse the repository at this point in the history
Driver remove functions have an error return value, but rarely return an error
in practice. If a driver does return an error from its remove function, the
driver won't be unloaded and is expected to stay alive.

pmbus_do_remove() is defined as returning an int, but always returns 0 (no
error). Calling code passes that return value on to high level driver
remove functions, but does not evaluate it and removes driver data even if
pmbus_do_remove() returned an error (which it in practice never does). Even if
this code could never cause a real problem, it is nevertheless conceptually
wrong.

To reduce confusion and simplify the code, change pmbus_do_remove() to be a void
function, and have PMBus client drivers always return zero in their driver
remove functions.

Reported-by: Jean Delvare <khali@linux-fr.org>
Signed-off-by: Guenter Roeck <guenter.roeck@ericsson.com>
Acked-by: Jean Delvare <khali@linux-fr.org>
  • Loading branch information
Guenter Roeck committed Oct 24, 2011
1 parent 20fcfe1 commit 866cf12
Show file tree
Hide file tree
Showing 10 changed files with 18 additions and 21 deletions.
5 changes: 2 additions & 3 deletions drivers/hwmon/pmbus/adm1275.c
Original file line number Diff line number Diff line change
Expand Up @@ -152,11 +152,10 @@ static int adm1275_probe(struct i2c_client *client,
static int adm1275_remove(struct i2c_client *client)
{
const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
int ret;

ret = pmbus_do_remove(client);
pmbus_do_remove(client);
kfree(info);
return ret;
return 0;
}

static const struct i2c_device_id adm1275_id[] = {
Expand Down
5 changes: 2 additions & 3 deletions drivers/hwmon/pmbus/lm25066.c
Original file line number Diff line number Diff line change
Expand Up @@ -309,11 +309,10 @@ static int lm25066_remove(struct i2c_client *client)
{
const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
const struct lm25066_data *data = to_lm25066_data(info);
int ret;

ret = pmbus_do_remove(client);
pmbus_do_remove(client);
kfree(data);
return ret;
return 0;
}

static const struct i2c_device_id lm25066_id[] = {
Expand Down
3 changes: 2 additions & 1 deletion drivers/hwmon/pmbus/max16064.c
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,8 @@ static int max16064_probe(struct i2c_client *client,

static int max16064_remove(struct i2c_client *client)
{
return pmbus_do_remove(client);
pmbus_do_remove(client);
return 0;
}

static const struct i2c_device_id max16064_id[] = {
Expand Down
3 changes: 2 additions & 1 deletion drivers/hwmon/pmbus/max34440.c
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,8 @@ static int max34440_probe(struct i2c_client *client,

static int max34440_remove(struct i2c_client *client)
{
return pmbus_do_remove(client);
pmbus_do_remove(client);
return 0;
}

static const struct i2c_device_id max34440_id[] = {
Expand Down
3 changes: 2 additions & 1 deletion drivers/hwmon/pmbus/max8688.c
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,8 @@ static int max8688_probe(struct i2c_client *client,

static int max8688_remove(struct i2c_client *client)
{
return pmbus_do_remove(client);
pmbus_do_remove(client);
return 0;
}

static const struct i2c_device_id max8688_id[] = {
Expand Down
5 changes: 2 additions & 3 deletions drivers/hwmon/pmbus/pmbus.c
Original file line number Diff line number Diff line change
Expand Up @@ -187,13 +187,12 @@ static int pmbus_probe(struct i2c_client *client,

static int pmbus_remove(struct i2c_client *client)
{
int ret;
const struct pmbus_driver_info *info;

info = pmbus_get_driver_info(client);
ret = pmbus_do_remove(client);
pmbus_do_remove(client);
kfree(info);
return ret;
return 0;
}

/*
Expand Down
2 changes: 1 addition & 1 deletion drivers/hwmon/pmbus/pmbus.h
Original file line number Diff line number Diff line change
Expand Up @@ -361,7 +361,7 @@ bool pmbus_check_byte_register(struct i2c_client *client, int page, int reg);
bool pmbus_check_word_register(struct i2c_client *client, int page, int reg);
int pmbus_do_probe(struct i2c_client *client, const struct i2c_device_id *id,
struct pmbus_driver_info *info);
int pmbus_do_remove(struct i2c_client *client);
void pmbus_do_remove(struct i2c_client *client);
const struct pmbus_driver_info *pmbus_get_driver_info(struct i2c_client
*client);

Expand Down
3 changes: 1 addition & 2 deletions drivers/hwmon/pmbus/pmbus_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -1764,7 +1764,7 @@ int pmbus_do_probe(struct i2c_client *client, const struct i2c_device_id *id,
}
EXPORT_SYMBOL_GPL(pmbus_do_probe);

int pmbus_do_remove(struct i2c_client *client)
void pmbus_do_remove(struct i2c_client *client)
{
struct pmbus_data *data = i2c_get_clientdata(client);
hwmon_device_unregister(data->hwmon_dev);
Expand All @@ -1774,7 +1774,6 @@ int pmbus_do_remove(struct i2c_client *client)
kfree(data->booleans);
kfree(data->sensors);
kfree(data);
return 0;
}
EXPORT_SYMBOL_GPL(pmbus_do_remove);

Expand Down
5 changes: 2 additions & 3 deletions drivers/hwmon/pmbus/ucd9000.c
Original file line number Diff line number Diff line change
Expand Up @@ -239,13 +239,12 @@ static int ucd9000_probe(struct i2c_client *client,

static int ucd9000_remove(struct i2c_client *client)
{
int ret;
struct ucd9000_data *data;

data = to_ucd9000_data(pmbus_get_driver_info(client));
ret = pmbus_do_remove(client);
pmbus_do_remove(client);
kfree(data);
return ret;
return 0;
}


Expand Down
5 changes: 2 additions & 3 deletions drivers/hwmon/pmbus/ucd9200.c
Original file line number Diff line number Diff line change
Expand Up @@ -171,13 +171,12 @@ static int ucd9200_probe(struct i2c_client *client,

static int ucd9200_remove(struct i2c_client *client)
{
int ret;
const struct pmbus_driver_info *info;

info = pmbus_get_driver_info(client);
ret = pmbus_do_remove(client);
pmbus_do_remove(client);
kfree(info);
return ret;
return 0;
}


Expand Down

0 comments on commit 866cf12

Please sign in to comment.