The acpi device callbacks add, start, remove, suspend and resume can never be called with a NULL acpi_device. Each callsite in acpi/scan.c has to dereference the device in order to get the ops structure, e.g. struct acpi_device *acpi_dev = to_acpi_device(dev); struct acpi_driver *acpi_drv = acpi_dev->driver; if (acpi_drv && acpi_drv->ops.suspend) return acpi_drv->ops.suspend(acpi_dev, state); Remove all checks for acpi_dev == NULL within these callbacks. Also remove the checks for acpi_driver_data(acpi_dev) == NULL. None of these checks could fail unless the driver does something strange (which none of them do), the acpi core did something terribly wrong, or we have a memory corruption issue. If this does happen then it's best to dereference the pointer and crash noisily. Signed-off-by: Alan Jenkins <alan-jenkins@xxxxxxxxxxxxxx> Reviewed-by: Bjorn Helgaas <bjorn.helgaas@xxxxxx> --- v2: Tidy up acpi/sbs.c a little after removing the check drivers/acpi/ac.c | 18 ++++-------------- drivers/acpi/acpi_memhotplug.c | 11 ++--------- drivers/acpi/battery.c | 16 +++++----------- drivers/acpi/container.c | 8 +------- drivers/acpi/ec.c | 6 +----- drivers/acpi/fan.c | 12 ------------ drivers/acpi/power.c | 17 ++--------------- drivers/acpi/processor_core.c | 7 +------ drivers/acpi/sbs.c | 11 +++-------- drivers/acpi/sbshc.c | 9 +-------- drivers/acpi/thermal.c | 19 +++---------------- drivers/acpi/video.c | 14 ++------------ drivers/hwmon/hp_accel.c | 6 ------ drivers/platform/x86/asus-laptop.c | 6 ------ drivers/platform/x86/asus_acpi.c | 6 ------ drivers/platform/x86/eeepc-laptop.c | 5 ----- drivers/platform/x86/fujitsu-laptop.c | 6 ------ drivers/platform/x86/intel_menlow.c | 6 ------ drivers/platform/x86/panasonic-laptop.c | 9 --------- 19 files changed, 25 insertions(+), 167 deletions(-) diff --git a/drivers/acpi/ac.c b/drivers/acpi/ac.c index 98b9690..7725bda 100644 --- a/drivers/acpi/ac.c +++ b/drivers/acpi/ac.c @@ -256,11 +256,8 @@ static void acpi_ac_notify(struct acpi_device *device, u32 event) static int acpi_ac_add(struct acpi_device *device) { int result = 0; - struct acpi_ac *ac = NULL; - + struct acpi_ac *ac; - if (!device) - return -EINVAL; ac = kzalloc(sizeof(struct acpi_ac), GFP_KERNEL); if (!ac) @@ -306,11 +303,9 @@ static int acpi_ac_add(struct acpi_device *device) static int acpi_ac_resume(struct acpi_device *device) { - struct acpi_ac *ac; + struct acpi_ac *ac = acpi_driver_data(device); unsigned old_state; - if (!device || !acpi_driver_data(device)) - return -EINVAL; - ac = acpi_driver_data(device); + old_state = ac->state; if (acpi_ac_get_state(ac)) return 0; @@ -323,13 +318,8 @@ static int acpi_ac_resume(struct acpi_device *device) static int acpi_ac_remove(struct acpi_device *device, int type) { - struct acpi_ac *ac = NULL; - - - if (!device || !acpi_driver_data(device)) - return -EINVAL; + struct acpi_ac *ac = acpi_driver_data(device); - ac = acpi_driver_data(device); #ifdef CONFIG_ACPI_SYSFS_POWER if (ac->charger.dev) diff --git a/drivers/acpi/acpi_memhotplug.c b/drivers/acpi/acpi_memhotplug.c index 28ccdbc..71085b9 100644 --- a/drivers/acpi/acpi_memhotplug.c +++ b/drivers/acpi/acpi_memhotplug.c @@ -401,11 +401,8 @@ static void acpi_memory_device_notify(acpi_handle handle, u32 event, void *data) static int acpi_memory_device_add(struct acpi_device *device) { int result; - struct acpi_memory_device *mem_device = NULL; - + struct acpi_memory_device *mem_device; - if (!device) - return -EINVAL; mem_device = kzalloc(sizeof(struct acpi_memory_device), GFP_KERNEL); if (!mem_device) @@ -450,13 +447,9 @@ static int acpi_memory_device_add(struct acpi_device *device) static int acpi_memory_device_remove(struct acpi_device *device, int type) { - struct acpi_memory_device *mem_device = NULL; + struct acpi_memory_device *mem_device = acpi_driver_data(device); - if (!device || !acpi_driver_data(device)) - return -EINVAL; - - mem_device = acpi_driver_data(device); kfree(mem_device); return 0; diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c index 3f4602b..90e39d9 100644 --- a/drivers/acpi/battery.c +++ b/drivers/acpi/battery.c @@ -840,9 +840,8 @@ static void acpi_battery_notify(struct acpi_device *device, u32 event) static int acpi_battery_add(struct acpi_device *device) { int result = 0; - struct acpi_battery *battery = NULL; - if (!device) - return -EINVAL; + struct acpi_battery *battery; + battery = kzalloc(sizeof(struct acpi_battery), GFP_KERNEL); if (!battery) return -ENOMEM; @@ -870,11 +869,8 @@ static int acpi_battery_add(struct acpi_device *device) static int acpi_battery_remove(struct acpi_device *device, int type) { - struct acpi_battery *battery = NULL; + struct acpi_battery *battery = acpi_driver_data(device); - if (!device || !acpi_driver_data(device)) - return -EINVAL; - battery = acpi_driver_data(device); #ifdef CONFIG_ACPI_PROCFS_POWER acpi_battery_remove_fs(device); #endif @@ -889,10 +885,8 @@ static int acpi_battery_remove(struct acpi_device *device, int type) /* this is needed to learn about changes made in suspended state */ static int acpi_battery_resume(struct acpi_device *device) { - struct acpi_battery *battery; - if (!device) - return -EINVAL; - battery = acpi_driver_data(device); + struct acpi_battery *battery = acpi_driver_data(device); + battery->update_time = 0; acpi_battery_update(battery); return 0; diff --git a/drivers/acpi/container.c b/drivers/acpi/container.c index 642bb30..30c4700 100644 --- a/drivers/acpi/container.c +++ b/drivers/acpi/container.c @@ -97,11 +97,6 @@ static int acpi_container_add(struct acpi_device *device) struct acpi_container *container; - if (!device) { - printk(KERN_ERR PREFIX "device is NULL\n"); - return -EINVAL; - } - container = kzalloc(sizeof(struct acpi_container), GFP_KERNEL); if (!container) return -ENOMEM; @@ -120,9 +115,8 @@ static int acpi_container_add(struct acpi_device *device) static int acpi_container_remove(struct acpi_device *device, int type) { acpi_status status = AE_OK; - struct acpi_container *pc = NULL; + struct acpi_container *pc = acpi_driver_data(device); - pc = acpi_driver_data(device); kfree(pc); return status; } diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c index add6621..5e93ae3 100644 --- a/drivers/acpi/ec.c +++ b/drivers/acpi/ec.c @@ -837,13 +837,9 @@ static int acpi_ec_add(struct acpi_device *device) static int acpi_ec_remove(struct acpi_device *device, int type) { - struct acpi_ec *ec; + struct acpi_ec *ec = acpi_driver_data(device); struct acpi_ec_query_handler *handler, *tmp; - if (!device) - return -EINVAL; - - ec = acpi_driver_data(device); ec_remove_handlers(ec); mutex_lock(&ec->lock); list_for_each_entry_safe(handler, tmp, &ec->list, node) { diff --git a/drivers/acpi/fan.c b/drivers/acpi/fan.c index f419849..d40e214 100644 --- a/drivers/acpi/fan.c +++ b/drivers/acpi/fan.c @@ -244,9 +244,6 @@ static int acpi_fan_add(struct acpi_device *device) int state = 0; struct thermal_cooling_device *cdev; - if (!device) - return -EINVAL; - strcpy(acpi_device_name(device), "Fan"); strcpy(acpi_device_class(device), ACPI_FAN_CLASS); @@ -300,9 +297,6 @@ static int acpi_fan_remove(struct acpi_device *device, int type) { struct thermal_cooling_device *cdev = acpi_driver_data(device); - if (!device || !cdev) - return -EINVAL; - acpi_fan_remove_fs(device); sysfs_remove_link(&device->dev.kobj, "thermal_cooling"); sysfs_remove_link(&cdev->device.kobj, "device"); @@ -313,9 +307,6 @@ static int acpi_fan_remove(struct acpi_device *device, int type) static int acpi_fan_suspend(struct acpi_device *device, pm_message_t state) { - if (!device) - return -EINVAL; - acpi_bus_set_power(device->handle, ACPI_STATE_D0); return AE_OK; @@ -326,9 +317,6 @@ static int acpi_fan_resume(struct acpi_device *device) int result = 0; int power_state = 0; - if (!device) - return -EINVAL; - result = acpi_bus_get_power(device->handle, &power_state); if (result) { printk(KERN_ERR PREFIX diff --git a/drivers/acpi/power.c b/drivers/acpi/power.c index e86603f..2c3d844 100644 --- a/drivers/acpi/power.c +++ b/drivers/acpi/power.c @@ -639,9 +639,6 @@ static int acpi_power_add(struct acpi_device *device) struct acpi_buffer buffer = { sizeof(acpi_object), &acpi_object }; - if (!device) - return -EINVAL; - resource = kzalloc(sizeof(struct acpi_power_resource), GFP_KERNEL); if (!resource) return -ENOMEM; @@ -695,15 +692,10 @@ static int acpi_power_add(struct acpi_device *device) static int acpi_power_remove(struct acpi_device *device, int type) { - struct acpi_power_resource *resource = NULL; + struct acpi_power_resource *resource = acpi_driver_data(device); struct list_head *node, *next; - if (!device || !acpi_driver_data(device)) - return -EINVAL; - - resource = acpi_driver_data(device); - acpi_power_remove_fs(device); mutex_lock(&resource->resource_lock); @@ -722,14 +714,9 @@ static int acpi_power_remove(struct acpi_device *device, int type) static int acpi_power_resume(struct acpi_device *device) { int result = 0, state; - struct acpi_power_resource *resource = NULL; + struct acpi_power_resource *resource = acpi_driver_data(device); struct acpi_power_reference *ref; - if (!device || !acpi_driver_data(device)) - return -EINVAL; - - resource = acpi_driver_data(device); - result = acpi_power_get_state(device->handle, &state); if (result) return result; diff --git a/drivers/acpi/processor_core.c b/drivers/acpi/processor_core.c index c2d4d6e..38ad5ef 100644 --- a/drivers/acpi/processor_core.c +++ b/drivers/acpi/processor_core.c @@ -888,13 +888,8 @@ err_free_cpumask: static int acpi_processor_remove(struct acpi_device *device, int type) { - struct acpi_processor *pr = NULL; - - - if (!device || !acpi_driver_data(device)) - return -EINVAL; + struct acpi_processor *pr = acpi_driver_data(device); - pr = acpi_driver_data(device); if (pr->id >= nr_cpu_ids) goto free; diff --git a/drivers/acpi/sbs.c b/drivers/acpi/sbs.c index 52b9db8..25a2f6a 100644 --- a/drivers/acpi/sbs.c +++ b/drivers/acpi/sbs.c @@ -960,12 +960,9 @@ static int acpi_sbs_add(struct acpi_device *device) static int acpi_sbs_remove(struct acpi_device *device, int type) { - struct acpi_sbs *sbs; + struct acpi_sbs *sbs = acpi_driver_data(device); int id; - if (!device) - return -EINVAL; - sbs = acpi_driver_data(device); if (!sbs) return -EINVAL; mutex_lock(&sbs->lock); @@ -995,10 +992,8 @@ static void acpi_sbs_rmdirs(void) static int acpi_sbs_resume(struct acpi_device *device) { - struct acpi_sbs *sbs; - if (!device) - return -EINVAL; - sbs = device->driver_data; + struct acpi_sbs *sbs = acpi_driver_data(device); + acpi_sbs_callback(sbs); return 0; } diff --git a/drivers/acpi/sbshc.c b/drivers/acpi/sbshc.c index 8d89337..9e06e9c 100644 --- a/drivers/acpi/sbshc.c +++ b/drivers/acpi/sbshc.c @@ -262,9 +262,6 @@ static int acpi_smbus_hc_add(struct acpi_device *device) unsigned long long val; struct acpi_smb_hc *hc; - if (!device) - return -EINVAL; - status = acpi_evaluate_integer(device->handle, "_EC", NULL, &val); if (ACPI_FAILURE(status)) { printk(KERN_ERR PREFIX "error obtaining _EC.\n"); @@ -296,12 +293,8 @@ extern void acpi_ec_remove_query_handler(struct acpi_ec *ec, u8 query_bit); static int acpi_smbus_hc_remove(struct acpi_device *device, int type) { - struct acpi_smb_hc *hc; - - if (!device) - return -EINVAL; + struct acpi_smb_hc *hc = acpi_driver_data(device); - hc = acpi_driver_data(device); acpi_ec_remove_query_handler(hc->ec, hc->query_bit); kfree(hc); return 0; diff --git a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c index 65f6781..fca61a1 100644 --- a/drivers/acpi/thermal.c +++ b/drivers/acpi/thermal.c @@ -1361,12 +1361,9 @@ static void acpi_thermal_guess_offset(struct acpi_thermal *tz) static int acpi_thermal_add(struct acpi_device *device) { int result = 0; - struct acpi_thermal *tz = NULL; + struct acpi_thermal *tz; - if (!device) - return -EINVAL; - tz = kzalloc(sizeof(struct acpi_thermal), GFP_KERNEL); if (!tz) return -ENOMEM; @@ -1408,12 +1405,7 @@ end: static int acpi_thermal_remove(struct acpi_device *device, int type) { - struct acpi_thermal *tz = NULL; - - if (!device || !acpi_driver_data(device)) - return -EINVAL; - - tz = acpi_driver_data(device); + struct acpi_thermal *tz = acpi_driver_data(device); acpi_thermal_remove_fs(device); acpi_thermal_unregister_thermal_zone(tz); @@ -1424,15 +1416,10 @@ static int acpi_thermal_remove(struct acpi_device *device, int type) static int acpi_thermal_resume(struct acpi_device *device) { - struct acpi_thermal *tz = NULL; + struct acpi_thermal *tz = acpi_driver_data(device); int i, j, power_state, result; - if (!device || !acpi_driver_data(device)) - return -EINVAL; - - tz = acpi_driver_data(device); - for (i = 0; i < ACPI_THERMAL_MAX_ACTIVE; i++) { if (!(&tz->trips.active[i])) break; diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c index f405807..576a600 100644 --- a/drivers/acpi/video.c +++ b/drivers/acpi/video.c @@ -2207,15 +2207,10 @@ static void acpi_video_device_notify(acpi_handle handle, u32 event, void *data) static int instance; static int acpi_video_resume(struct acpi_device *device) { - struct acpi_video_bus *video; + struct acpi_video_bus *video = acpi_driver_data(device); struct acpi_video_device *video_device; int i; - if (!device || !acpi_driver_data(device)) - return -EINVAL; - - video = acpi_driver_data(device); - for (i = 0; i < video->attached_count; i++) { video_device = video->attached_array[i].bind_info; if (video_device && video_device->backlight) @@ -2351,13 +2346,8 @@ static int acpi_video_bus_add(struct acpi_device *device) static int acpi_video_bus_remove(struct acpi_device *device, int type) { - struct acpi_video_bus *video = NULL; - - - if (!device || !acpi_driver_data(device)) - return -EINVAL; + struct acpi_video_bus *video = acpi_driver_data(device); - video = acpi_driver_data(device); acpi_video_bus_stop_devices(video); acpi_video_bus_put_devices(video); diff --git a/drivers/hwmon/hp_accel.c b/drivers/hwmon/hp_accel.c index 6679854..c8d3c88 100644 --- a/drivers/hwmon/hp_accel.c +++ b/drivers/hwmon/hp_accel.c @@ -275,9 +275,6 @@ static int lis3lv02d_add(struct acpi_device *device) { int ret; - if (!device) - return -EINVAL; - lis3_dev.bus_priv = device; lis3_dev.init = lis3lv02d_acpi_init; lis3_dev.read = lis3lv02d_acpi_read; @@ -315,9 +312,6 @@ static int lis3lv02d_add(struct acpi_device *device) static int lis3lv02d_remove(struct acpi_device *device, int type) { - if (!device) - return -EINVAL; - lis3lv02d_joystick_disable(); lis3lv02d_poweroff(&lis3_dev); diff --git a/drivers/platform/x86/asus-laptop.c b/drivers/platform/x86/asus-laptop.c index b39d2bb..8af43e9 100644 --- a/drivers/platform/x86/asus-laptop.c +++ b/drivers/platform/x86/asus-laptop.c @@ -1240,9 +1240,6 @@ static int asus_hotk_add(struct acpi_device *device) { int result; - if (!device) - return -EINVAL; - pr_notice("Asus Laptop Support version %s\n", ASUS_LAPTOP_VERSION); @@ -1306,9 +1303,6 @@ end: static int asus_hotk_remove(struct acpi_device *device, int type) { - if (!device || !acpi_driver_data(device)) - return -EINVAL; - kfree(hotk->name); kfree(hotk); diff --git a/drivers/platform/x86/asus_acpi.c b/drivers/platform/x86/asus_acpi.c index ddf5240..25a7d57 100644 --- a/drivers/platform/x86/asus_acpi.c +++ b/drivers/platform/x86/asus_acpi.c @@ -1334,9 +1334,6 @@ static int asus_hotk_add(struct acpi_device *device) acpi_status status = AE_OK; int result; - if (!device) - return -EINVAL; - printk(KERN_NOTICE "Asus Laptop ACPI Extras version %s\n", ASUS_ACPI_VERSION); @@ -1392,9 +1389,6 @@ end: static int asus_hotk_remove(struct acpi_device *device, int type) { - if (!device || !acpi_driver_data(device)) - return -EINVAL; - asus_hotk_remove_fs(device); kfree(hotk); diff --git a/drivers/platform/x86/eeepc-laptop.c b/drivers/platform/x86/eeepc-laptop.c index da3c08b..e7f14a4 100644 --- a/drivers/platform/x86/eeepc-laptop.c +++ b/drivers/platform/x86/eeepc-laptop.c @@ -1194,8 +1194,6 @@ static int eeepc_hotk_add(struct acpi_device *device) struct device *dev; int result; - if (!device) - return -EINVAL; pr_notice(EEEPC_HOTK_NAME "\n"); ehotk = kzalloc(sizeof(struct eeepc_hotk), GFP_KERNEL); if (!ehotk) @@ -1276,9 +1274,6 @@ fail_platform_driver: static int eeepc_hotk_remove(struct acpi_device *device, int type) { - if (!device || !acpi_driver_data(device)) - return -EINVAL; - eeepc_backlight_exit(); eeepc_rfkill_exit(); eeepc_input_exit(); diff --git a/drivers/platform/x86/fujitsu-laptop.c b/drivers/platform/x86/fujitsu-laptop.c index f35aee5..2ab0318 100644 --- a/drivers/platform/x86/fujitsu-laptop.c +++ b/drivers/platform/x86/fujitsu-laptop.c @@ -657,9 +657,6 @@ static int acpi_fujitsu_add(struct acpi_device *device) struct input_dev *input; int error; - if (!device) - return -EINVAL; - fujitsu->acpi_handle = device->handle; sprintf(acpi_device_name(device), "%s", ACPI_FUJITSU_DEVICE_NAME); sprintf(acpi_device_class(device), "%s", ACPI_FUJITSU_CLASS); @@ -813,9 +810,6 @@ static int acpi_fujitsu_hotkey_add(struct acpi_device *device) int error; int i; - if (!device) - return -EINVAL; - fujitsu_hotkey->acpi_handle = device->handle; sprintf(acpi_device_name(device), "%s", ACPI_FUJITSU_HOTKEY_DEVICE_NAME); diff --git a/drivers/platform/x86/intel_menlow.c b/drivers/platform/x86/intel_menlow.c index 29432a5..58de8fd 100644 --- a/drivers/platform/x86/intel_menlow.c +++ b/drivers/platform/x86/intel_menlow.c @@ -156,9 +156,6 @@ static int intel_menlow_memory_add(struct acpi_device *device) acpi_handle dummy; struct thermal_cooling_device *cdev; - if (!device) - return -EINVAL; - status = acpi_get_handle(device->handle, MEMORY_GET_BANDWIDTH, &dummy); if (ACPI_FAILURE(status)) goto end; @@ -200,9 +197,6 @@ static int intel_menlow_memory_remove(struct acpi_device *device, int type) { struct thermal_cooling_device *cdev = acpi_driver_data(device); - if (!device || !cdev) - return -EINVAL; - sysfs_remove_link(&device->dev.kobj, "thermal_cooling"); sysfs_remove_link(&cdev->device.kobj, "device"); thermal_cooling_device_unregister(cdev); diff --git a/drivers/platform/x86/panasonic-laptop.c b/drivers/platform/x86/panasonic-laptop.c index fe7cf01..953b60c 100644 --- a/drivers/platform/x86/panasonic-laptop.c +++ b/drivers/platform/x86/panasonic-laptop.c @@ -588,9 +588,6 @@ static int acpi_pcc_hotkey_resume(struct acpi_device *device) struct pcc_acpi *pcc = acpi_driver_data(device); acpi_status status = AE_OK; - if (device == NULL || pcc == NULL) - return -EINVAL; - ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Sticky mode restore: %d\n", pcc->sticky_mode)); @@ -604,9 +601,6 @@ static int acpi_pcc_hotkey_add(struct acpi_device *device) struct pcc_acpi *pcc; int num_sifr, result; - if (!device) - return -EINVAL; - num_sifr = acpi_pcc_get_sqty(device); if (num_sifr > 255) { @@ -703,9 +697,6 @@ static int acpi_pcc_hotkey_remove(struct acpi_device *device, int type) { struct pcc_acpi *pcc = acpi_driver_data(device); - if (!device || !pcc) - return -EINVAL; - sysfs_remove_group(&device->dev.kobj, &pcc_attr_group); backlight_device_unregister(pcc->backlight); -- 1.6.3.2 -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html