From mboxrd@z Thu Jan 1 00:00:00 1970 From: Rob Herring Subject: Re: [PATCH] dtc: fix for_each_*() to skip first object if deleted Date: Mon, 08 Oct 2012 22:13:23 -0500 Message-ID: <50739653.7060009@gmail.com> References: <1349734526-29792-1-git-send-email-swarren@wwwdotorg.org> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1349734526-29792-1-git-send-email-swarren-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: devicetree-discuss-bounces+gldd-devicetree-discuss=m.gmane.org-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org Sender: "devicetree-discuss" To: Stephen Warren Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org, Stephen Warren List-Id: devicetree@vger.kernel.org On 10/08/2012 05:15 PM, Stephen Warren wrote: > From: Stephen Warren > > The previous definition of for_each_*() would always include the very > first object within the list, irrespective of whether it was marked > deleted, since the deleted flag was not checked on the first object, > but only on any "next" object. > > Fix for_each_*() to check the deleted flag in the loop body every > iteration to correct this. > > (upstream dtc commit 1762ab42ef77db7ab2776d0d6cba3515150f518a) > > Signed-off-by: Stephen Warren Applied. Thanks for sending this before I got around to asking you to since a script to do this is not yet in place. :) Rob > --- > scripts/dtc/dtc.h | 44 ++++++++++---------------------------------- > 1 files changed, 10 insertions(+), 34 deletions(-) > > diff --git a/scripts/dtc/dtc.h b/scripts/dtc/dtc.h > index d501c86..3e42a07 100644 > --- a/scripts/dtc/dtc.h > +++ b/scripts/dtc/dtc.h > @@ -161,51 +161,27 @@ struct node { > struct label *labels; > }; > > -static inline struct label *for_each_label_next(struct label *l) > -{ > - do { > - l = l->next; > - } while (l && l->deleted); > - > - return l; > -} > - > -#define for_each_label(l0, l) \ > - for ((l) = (l0); (l); (l) = for_each_label_next(l)) > - > #define for_each_label_withdel(l0, l) \ > for ((l) = (l0); (l); (l) = (l)->next) > > -static inline struct property *for_each_property_next(struct property *p) > -{ > - do { > - p = p->next; > - } while (p && p->deleted); > - > - return p; > -} > - > -#define for_each_property(n, p) \ > - for ((p) = (n)->proplist; (p); (p) = for_each_property_next(p)) > +#define for_each_label(l0, l) \ > + for_each_label_withdel(l0, l) \ > + if (!(l)->deleted) > > #define for_each_property_withdel(n, p) \ > for ((p) = (n)->proplist; (p); (p) = (p)->next) > > -static inline struct node *for_each_child_next(struct node *c) > -{ > - do { > - c = c->next_sibling; > - } while (c && c->deleted); > - > - return c; > -} > - > -#define for_each_child(n, c) \ > - for ((c) = (n)->children; (c); (c) = for_each_child_next(c)) > +#define for_each_property(n, p) \ > + for_each_property_withdel(n, p) \ > + if (!(p)->deleted) > > #define for_each_child_withdel(n, c) \ > for ((c) = (n)->children; (c); (c) = (c)->next_sibling) > > +#define for_each_child(n, c) \ > + for_each_child_withdel(n, c) \ > + if (!(c)->deleted) > + > void add_label(struct label **labels, char *label); > void delete_labels(struct label **labels); > >