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

node: fix device cleanups in error handling code

We can't use kfree() to free device managed resources so the kfree(dev)
is against the rules.

It's easier to write this code if we open code the device_register() as
a device_initialize() and device_add(). That way if dev_set_name() set
name fails we can call put_device() and it will clean up correctly.

Fixes: acc02a109b04 ("node: Add memory-side caching attributes")
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Link: https://lore.kernel.org/r/YHA0JUra+F64+NpB@mwanda
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Dan Carpenter and committed by
Greg Kroah-Hartman
4ce535ec b4104180

+12 -14
+12 -14
drivers/base/node.c
··· 268 268 if (!dev) 269 269 return; 270 270 271 + device_initialize(dev); 271 272 dev->parent = &node->dev; 272 273 dev->release = node_cache_release; 273 274 if (dev_set_name(dev, "memory_side_cache")) 274 - goto free_dev; 275 + goto put_device; 275 276 276 - if (device_register(dev)) 277 - goto free_name; 277 + if (device_add(dev)) 278 + goto put_device; 278 279 279 280 pm_runtime_no_callbacks(dev); 280 281 node->cache_dev = dev; 281 282 return; 282 - free_name: 283 - kfree_const(dev->kobj.name); 284 - free_dev: 285 - kfree(dev); 283 + put_device: 284 + put_device(dev); 286 285 } 287 286 288 287 /** ··· 318 319 return; 319 320 320 321 dev = &info->dev; 322 + device_initialize(dev); 321 323 dev->parent = node->cache_dev; 322 324 dev->release = node_cacheinfo_release; 323 325 dev->groups = cache_groups; 324 326 if (dev_set_name(dev, "index%d", cache_attrs->level)) 325 - goto free_cache; 327 + goto put_device; 326 328 327 329 info->cache_attrs = *cache_attrs; 328 - if (device_register(dev)) { 330 + if (device_add(dev)) { 329 331 dev_warn(&node->dev, "failed to add cache level:%d\n", 330 332 cache_attrs->level); 331 - goto free_name; 333 + goto put_device; 332 334 } 333 335 pm_runtime_no_callbacks(dev); 334 336 list_add_tail(&info->node, &node->cache_attrs); 335 337 return; 336 - free_name: 337 - kfree_const(dev->kobj.name); 338 - free_cache: 339 - kfree(info); 338 + put_device: 339 + put_device(dev); 340 340 } 341 341 342 342 static void node_remove_caches(struct node *node)