Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

test_power: Fix a bug in setting module parameter values

When the kernel loads a module, module params are processed prior to
calling module_init. As a result, setting module param value should not
have side effects, at least as long as the module has not been
initialized.

Signed-off-by: Andrey Gelman <andreyg@compulab.co.il>
Signed-off-by: Anton Vorontsov <anton@enomsg.org>

authored by

Andrey Gelman and committed by
Anton Vorontsov
9239ebcf 6f8da5df

+21 -10
+21 -10
drivers/power/test_power.c
··· 30 30 static int battery_capacity = 50; 31 31 static int battery_voltage = 3300; 32 32 33 + static bool module_initialized; 34 + 33 35 static int test_power_get_ac_property(struct power_supply *psy, 34 36 enum power_supply_property psp, 35 37 union power_supply_propval *val) ··· 187 185 } 188 186 } 189 187 188 + module_initialized = true; 190 189 return 0; 191 190 failed: 192 191 while (--i >= 0) ··· 212 209 213 210 for (i = 0; i < ARRAY_SIZE(test_power_supplies); i++) 214 211 power_supply_unregister(&test_power_supplies[i]); 212 + 213 + module_initialized = false; 215 214 } 216 215 module_exit(test_power_exit); 217 216 ··· 226 221 }; 227 222 228 223 static struct battery_property_map map_ac_online[] = { 229 - { 0, "on" }, 230 - { 1, "off" }, 224 + { 0, "off" }, 225 + { 1, "on" }, 231 226 { -1, NULL }, 232 227 }; 233 228 ··· 300 295 return def_key; 301 296 } 302 297 298 + static inline void signal_power_supply_changed(struct power_supply *psy) 299 + { 300 + if (module_initialized) 301 + power_supply_changed(psy); 302 + } 303 + 303 304 static int param_set_ac_online(const char *key, const struct kernel_param *kp) 304 305 { 305 306 ac_online = map_get_value(map_ac_online, key, ac_online); 306 - power_supply_changed(&test_power_supplies[0]); 307 + signal_power_supply_changed(&test_power_supplies[0]); 307 308 return 0; 308 309 } 309 310 ··· 322 311 static int param_set_usb_online(const char *key, const struct kernel_param *kp) 323 312 { 324 313 usb_online = map_get_value(map_ac_online, key, usb_online); 325 - power_supply_changed(&test_power_supplies[2]); 314 + signal_power_supply_changed(&test_power_supplies[2]); 326 315 return 0; 327 316 } 328 317 ··· 336 325 const struct kernel_param *kp) 337 326 { 338 327 battery_status = map_get_value(map_status, key, battery_status); 339 - power_supply_changed(&test_power_supplies[1]); 328 + signal_power_supply_changed(&test_power_supplies[1]); 340 329 return 0; 341 330 } 342 331 ··· 350 339 const struct kernel_param *kp) 351 340 { 352 341 battery_health = map_get_value(map_health, key, battery_health); 353 - power_supply_changed(&test_power_supplies[1]); 342 + signal_power_supply_changed(&test_power_supplies[1]); 354 343 return 0; 355 344 } 356 345 ··· 364 353 const struct kernel_param *kp) 365 354 { 366 355 battery_present = map_get_value(map_present, key, battery_present); 367 - power_supply_changed(&test_power_supplies[0]); 356 + signal_power_supply_changed(&test_power_supplies[0]); 368 357 return 0; 369 358 } 370 359 ··· 380 369 { 381 370 battery_technology = map_get_value(map_technology, key, 382 371 battery_technology); 383 - power_supply_changed(&test_power_supplies[1]); 372 + signal_power_supply_changed(&test_power_supplies[1]); 384 373 return 0; 385 374 } 386 375 ··· 401 390 return -EINVAL; 402 391 403 392 battery_capacity = tmp; 404 - power_supply_changed(&test_power_supplies[1]); 393 + signal_power_supply_changed(&test_power_supplies[1]); 405 394 return 0; 406 395 } 407 396 ··· 416 405 return -EINVAL; 417 406 418 407 battery_voltage = tmp; 419 - power_supply_changed(&test_power_supplies[1]); 408 + signal_power_supply_changed(&test_power_supplies[1]); 420 409 return 0; 421 410 } 422 411