Nathan Lynch <nath...@linux.ibm.com> writes:
> In pseries_devicetree_update(), with each call to ibm,update-nodes the
> partition firmware communicates the node to be deleted or updated by
> placing its phandle in the work buffer. Each of delete_dt_node(),
> update_dt_node(), and add_dt_node() have duplicate lookups using the
> phandle value and corresponding refcount management.

...

I noticed that this introduces a reference count imbalance in an error
path:

> -static int add_dt_node(__be32 parent_phandle, __be32 drc_index)
> +static int add_dt_node(struct device_node *parent_dn, __be32 drc_index)
>  {
>       struct device_node *dn;
> -     struct device_node *parent_dn;
>       int rc;
>  
> -     parent_dn = of_find_node_by_phandle(be32_to_cpu(parent_phandle));
> -     if (!parent_dn)
> -             return -ENOENT;
> -
>       dn = dlpar_configure_connector(drc_index, parent_dn);
>       if (!dn) {
>               of_node_put(parent_dn);

here:           ^^^

> @@ -251,7 +230,6 @@ static int add_dt_node(__be32 parent_phandle, __be32 
> drc_index)
>  
>       pr_debug("added node %pOFfp\n", dn);
>  
> -     of_node_put(parent_dn);
>       return rc;
>  }

The change correctly removes the of_node_put() from the happy path but
the put in the error branch should have been removed too.

Reply via email to