]>
Commit | Line | Data |
---|---|---|
f92b3806 SL |
1 | From ac209ec94bc8936b41c211320d69283bc41896de Mon Sep 17 00:00:00 2001 |
2 | From: Sasha Levin <sashal@kernel.org> | |
3 | Date: Fri, 9 Apr 2021 14:01:57 +0300 | |
4 | Subject: node: fix device cleanups in error handling code | |
5 | ||
6 | From: Dan Carpenter <dan.carpenter@oracle.com> | |
7 | ||
8 | [ Upstream commit 4ce535ec0084f0d712317cb99d383cad3288e713 ] | |
9 | ||
10 | We can't use kfree() to free device managed resources so the kfree(dev) | |
11 | is against the rules. | |
12 | ||
13 | It's easier to write this code if we open code the device_register() as | |
14 | a device_initialize() and device_add(). That way if dev_set_name() set | |
15 | name fails we can call put_device() and it will clean up correctly. | |
16 | ||
17 | Fixes: acc02a109b04 ("node: Add memory-side caching attributes") | |
18 | Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com> | |
19 | Link: https://lore.kernel.org/r/YHA0JUra+F64+NpB@mwanda | |
20 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | |
21 | Signed-off-by: Sasha Levin <sashal@kernel.org> | |
22 | --- | |
23 | drivers/base/node.c | 26 ++++++++++++-------------- | |
24 | 1 file changed, 12 insertions(+), 14 deletions(-) | |
25 | ||
26 | diff --git a/drivers/base/node.c b/drivers/base/node.c | |
27 | index 04f71c7bc3f8..ec4bc09c2997 100644 | |
28 | --- a/drivers/base/node.c | |
29 | +++ b/drivers/base/node.c | |
30 | @@ -268,21 +268,20 @@ static void node_init_cache_dev(struct node *node) | |
31 | if (!dev) | |
32 | return; | |
33 | ||
34 | + device_initialize(dev); | |
35 | dev->parent = &node->dev; | |
36 | dev->release = node_cache_release; | |
37 | if (dev_set_name(dev, "memory_side_cache")) | |
38 | - goto free_dev; | |
39 | + goto put_device; | |
40 | ||
41 | - if (device_register(dev)) | |
42 | - goto free_name; | |
43 | + if (device_add(dev)) | |
44 | + goto put_device; | |
45 | ||
46 | pm_runtime_no_callbacks(dev); | |
47 | node->cache_dev = dev; | |
48 | return; | |
49 | -free_name: | |
50 | - kfree_const(dev->kobj.name); | |
51 | -free_dev: | |
52 | - kfree(dev); | |
53 | +put_device: | |
54 | + put_device(dev); | |
55 | } | |
56 | ||
57 | /** | |
58 | @@ -319,25 +318,24 @@ void node_add_cache(unsigned int nid, struct node_cache_attrs *cache_attrs) | |
59 | return; | |
60 | ||
61 | dev = &info->dev; | |
62 | + device_initialize(dev); | |
63 | dev->parent = node->cache_dev; | |
64 | dev->release = node_cacheinfo_release; | |
65 | dev->groups = cache_groups; | |
66 | if (dev_set_name(dev, "index%d", cache_attrs->level)) | |
67 | - goto free_cache; | |
68 | + goto put_device; | |
69 | ||
70 | info->cache_attrs = *cache_attrs; | |
71 | - if (device_register(dev)) { | |
72 | + if (device_add(dev)) { | |
73 | dev_warn(&node->dev, "failed to add cache level:%d\n", | |
74 | cache_attrs->level); | |
75 | - goto free_name; | |
76 | + goto put_device; | |
77 | } | |
78 | pm_runtime_no_callbacks(dev); | |
79 | list_add_tail(&info->node, &node->cache_attrs); | |
80 | return; | |
81 | -free_name: | |
82 | - kfree_const(dev->kobj.name); | |
83 | -free_cache: | |
84 | - kfree(info); | |
85 | +put_device: | |
86 | + put_device(dev); | |
87 | } | |
88 | ||
89 | static void node_remove_caches(struct node *node) | |
90 | -- | |
91 | 2.30.2 | |
92 |