>From 9b5744450d07b1e6e32e441785b9b69d7e54a7b1 Mon Sep 17 00:00:00 2001 From: Heikki Krogerus Date: Mon, 28 Sep 2020 14:38:09 +0300 Subject: [PATCH] software nodes: Handle the refcounting also in software_node_get_next_child() Incrementing the reference count of the node that is returned in software_node_get_next_child(), and decrementing the reference count of the previous node. Signed-off-by: Heikki Krogerus --- drivers/base/swnode.c | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/drivers/base/swnode.c b/drivers/base/swnode.c index 010828fc785bc..adbaafab3887b 100644 --- a/drivers/base/swnode.c +++ b/drivers/base/swnode.c @@ -439,18 +439,26 @@ static struct fwnode_handle * software_node_get_next_child(const struct fwnode_handle *fwnode, struct fwnode_handle *child) { - struct swnode *p = to_swnode(fwnode); - struct swnode *c = to_swnode(child); + struct swnode *parent = to_swnode(fwnode); + struct swnode *prev = to_swnode(child); + struct swnode *next; - if (!p || list_empty(&p->children) || - (c && list_is_last(&c->entry, &p->children))) + if (!parent || list_empty(&parent->children)) return NULL; - if (c) - c = list_next_entry(c, entry); - else - c = list_first_entry(&p->children, struct swnode, entry); - return &c->fwnode; + if (prev && list_is_last(&prev->entry, &parent->children)) { + kobject_put(&prev->kobj); + return NULL; + } + + if (prev) { + next = list_next_entry(prev, entry); + kobject_put(&prev->kobj); + } else { + next = list_first_entry(&parent->children, struct swnode, entry); + } + + return fwnode_handle_get(&next->fwnode); } static struct fwnode_handle * -- 2.28.0