From: Simon Glass <s...@chromium.org>

Allow enabling FDT_ASSUME_NO_ROLLBACK to disable rolling back after a
failed operation.

Signed-off-by: Simon Glass <s...@chromium.org>
Reviewed-by: David Gibson <da...@gibson.dropbear.id.au>
Message-Id: <20200220214557.176528-6-...@chromium.org>
Signed-off-by: David Gibson <da...@gibson.dropbear.id.au>
---
 cpukit/dtc/libfdt/fdt_rw.c | 18 +++++++++++++++---
 1 file changed, 15 insertions(+), 3 deletions(-)

diff --git a/cpukit/dtc/libfdt/fdt_rw.c b/cpukit/dtc/libfdt/fdt_rw.c
index 707c00aabd..4a95ce2dea 100644
--- a/cpukit/dtc/libfdt/fdt_rw.c
+++ b/cpukit/dtc/libfdt/fdt_rw.c
@@ -114,6 +114,15 @@ static int fdt_splice_string_(void *fdt, int newlen)
        return 0;
 }
 
+/**
+ * fdt_find_add_string_() - Find or allocate a string
+ *
+ * @fdt: pointer to the device tree to check/adjust
+ * @s: string to find/add
+ * @allocated: Set to 0 if the string was found, 1 if not found and so
+ *     allocated. Ignored if can_assume(NO_ROLLBACK)
+ * @return offset of string in the string table (whether found or added)
+ */
 static int fdt_find_add_string_(void *fdt, const char *s, int *allocated)
 {
        char *strtab = (char *)fdt + fdt_off_dt_strings(fdt);
@@ -122,7 +131,8 @@ static int fdt_find_add_string_(void *fdt, const char *s, 
int *allocated)
        int len = strlen(s) + 1;
        int err;
 
-       *allocated = 0;
+       if (!can_assume(NO_ROLLBACK))
+               *allocated = 0;
 
        p = fdt_find_string_(strtab, fdt_size_dt_strings(fdt), s);
        if (p)
@@ -134,7 +144,8 @@ static int fdt_find_add_string_(void *fdt, const char *s, 
int *allocated)
        if (err)
                return err;
 
-       *allocated = 1;
+       if (!can_assume(NO_ROLLBACK))
+               *allocated = 1;
 
        memcpy(new, s, len);
        return (new - strtab);
@@ -208,7 +219,8 @@ static int fdt_add_property_(void *fdt, int nodeoffset, 
const char *name,
 
        err = fdt_splice_struct_(fdt, *prop, 0, proplen);
        if (err) {
-               if (allocated)
+               /* Delete the string if we failed to add it */
+               if (!can_assume(NO_ROLLBACK) && allocated)
                        fdt_del_last_string_(fdt, name);
                return err;
        }
-- 
2.16.4

_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel

Reply via email to