On Thu, Sep 15, 2016 at 10:13:36AM +0200, Sascha Hauer wrote: > On Thu, Sep 15, 2016 at 08:10:13AM +0200, Michael Olbrich wrote: > > Caching pointers to device tree nodes or names is not save. The barebox > > internal device tree may be changed by loading a new device tree or through > > fixup handlers. > > Use local copies of the full path instead and resolve the node as needed. > > > > This should be two patches, one for backend->of_path and one > state->root. When reviewing this I first had to understand that this > patch has two unrelated changes. Ok. > > Signed-off-by: Michael Olbrich <m.olbrich@xxxxxxxxxxxxxx> > > --- > > common/state/backend.c | 3 ++- > > common/state/state.c | 19 ++++++++++++------- > > common/state/state.h | 4 ++-- > > 3 files changed, 16 insertions(+), 10 deletions(-) > > > > diff --git a/common/state/backend.c b/common/state/backend.c > > index 2f2e6dfd32d1..5235bb0283dd 100644 > > --- a/common/state/backend.c > > +++ b/common/state/backend.c > > @@ -164,7 +164,7 @@ int state_backend_init(struct state_backend *backend, struct device_d *dev, > > if (ret) > > goto out_free_format; > > > > - backend->of_path = of_path; > > + backend->of_path = xstrdup(of_path); > > > > return 0; > > > > @@ -185,4 +185,5 @@ void state_backend_free(struct state_backend *backend) > > state_storage_free(&backend->storage); > > if (backend->format) > > state_format_free(backend->format); > > + free(backend->of_path); > > } > > diff --git a/common/state/state.c b/common/state/state.c > > index 9b1d4edef132..0c329cd67548 100644 > > --- a/common/state/state.c > > +++ b/common/state/state.c > > @@ -202,15 +202,19 @@ struct device_node *state_to_node(struct state *state, > > enum state_convert conv) > > { > > struct device_node *child; > > - struct device_node *root; > > + struct device_node *root, *state_root; > > int ret; > > > > - root = of_new_node(parent, state->root->name); > > + state_root = of_find_node_by_path(state->of_path); > > + if (!state_root) > > + return ERR_PTR(-ENODEV); > > Shouldn't you create the node if it's not there in the target device > tree? This looks for the node in the barebox internal device tree, not the target device tree. If this node is missing, then state does not work any more. Michael -- Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox