All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] device property: Fix the secondary firmware node handling in set_primary_fwnode()
@ 2020-08-21 10:53 Heikki Krogerus
  2020-08-21 18:28 ` Rafael J. Wysocki
  0 siblings, 1 reply; 2+ messages in thread
From: Heikki Krogerus @ 2020-08-21 10:53 UTC (permalink / raw)
  To: Rafael J. Wysocki; +Cc: Greg Kroah-Hartman, linux-kernel, linux-acpi, stable

When the primary firmware node pointer is removed from a
device (set to NULL) the secondary firmware node pointer,
when it exists, is made the primary node for the device.
However, the secondary firmware node pointer of the original
primary firmware node is never cleared (set to NULL).

To avoid situation where the secondary firmware node pointer
is pointing to a non-existing object, clearing it properly
when the primary node is removed from a device in
set_primary_fwnode().

Fixes: 97badf873ab6 ("device property: Make it possible to use secondary firmware nodes")
Cc: stable@vger.kernel.org
Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
---
 drivers/base/core.c | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/drivers/base/core.c b/drivers/base/core.c
index ac1046a382bc0..f6f620aa94086 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -4264,9 +4264,9 @@ static inline bool fwnode_is_primary(struct fwnode_handle *fwnode)
  */
 void set_primary_fwnode(struct device *dev, struct fwnode_handle *fwnode)
 {
-	if (fwnode) {
-		struct fwnode_handle *fn = dev->fwnode;
+	struct fwnode_handle *fn = dev->fwnode;
 
+	if (fwnode) {
 		if (fwnode_is_primary(fn))
 			fn = fn->secondary;
 
@@ -4276,8 +4276,12 @@ void set_primary_fwnode(struct device *dev, struct fwnode_handle *fwnode)
 		}
 		dev->fwnode = fwnode;
 	} else {
-		dev->fwnode = fwnode_is_primary(dev->fwnode) ?
-			dev->fwnode->secondary : NULL;
+		if (fwnode_is_primary(fn)) {
+			dev->fwnode = fn->secondary;
+			fn->secondary = NULL;
+		} else {
+			dev->fwnode = NULL;
+		}
 	}
 }
 EXPORT_SYMBOL_GPL(set_primary_fwnode);
-- 
2.28.0


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] device property: Fix the secondary firmware node handling in set_primary_fwnode()
  2020-08-21 10:53 [PATCH] device property: Fix the secondary firmware node handling in set_primary_fwnode() Heikki Krogerus
@ 2020-08-21 18:28 ` Rafael J. Wysocki
  0 siblings, 0 replies; 2+ messages in thread
From: Rafael J. Wysocki @ 2020-08-21 18:28 UTC (permalink / raw)
  To: Heikki Krogerus
  Cc: Rafael J. Wysocki, Greg Kroah-Hartman, Linux Kernel Mailing List,
	ACPI Devel Maling List, Stable

On Fri, Aug 21, 2020 at 12:53 PM Heikki Krogerus
<heikki.krogerus@linux.intel.com> wrote:
>
> When the primary firmware node pointer is removed from a
> device (set to NULL) the secondary firmware node pointer,
> when it exists, is made the primary node for the device.
> However, the secondary firmware node pointer of the original
> primary firmware node is never cleared (set to NULL).
>
> To avoid situation where the secondary firmware node pointer
> is pointing to a non-existing object, clearing it properly
> when the primary node is removed from a device in
> set_primary_fwnode().
>
> Fixes: 97badf873ab6 ("device property: Make it possible to use secondary firmware nodes")
> Cc: stable@vger.kernel.org
> Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
> ---
>  drivers/base/core.c | 12 ++++++++----
>  1 file changed, 8 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/base/core.c b/drivers/base/core.c
> index ac1046a382bc0..f6f620aa94086 100644
> --- a/drivers/base/core.c
> +++ b/drivers/base/core.c
> @@ -4264,9 +4264,9 @@ static inline bool fwnode_is_primary(struct fwnode_handle *fwnode)
>   */
>  void set_primary_fwnode(struct device *dev, struct fwnode_handle *fwnode)
>  {
> -       if (fwnode) {
> -               struct fwnode_handle *fn = dev->fwnode;
> +       struct fwnode_handle *fn = dev->fwnode;
>
> +       if (fwnode) {
>                 if (fwnode_is_primary(fn))
>                         fn = fn->secondary;
>
> @@ -4276,8 +4276,12 @@ void set_primary_fwnode(struct device *dev, struct fwnode_handle *fwnode)
>                 }
>                 dev->fwnode = fwnode;
>         } else {
> -               dev->fwnode = fwnode_is_primary(dev->fwnode) ?
> -                       dev->fwnode->secondary : NULL;
> +               if (fwnode_is_primary(fn)) {
> +                       dev->fwnode = fn->secondary;
> +                       fn->secondary = NULL;
> +               } else {
> +                       dev->fwnode = NULL;
> +               }
>         }
>  }
>  EXPORT_SYMBOL_GPL(set_primary_fwnode);
> --

Applied as 5.9-rc material, thanks!

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2020-08-21 18:29 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-08-21 10:53 [PATCH] device property: Fix the secondary firmware node handling in set_primary_fwnode() Heikki Krogerus
2020-08-21 18:28 ` Rafael J. Wysocki

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.