Skip to content
/ linux Public
forked from torvalds/linux

Commit

Permalink
bootconfig: Change array value to use child node
Browse files Browse the repository at this point in the history
It is not possible to put an array value with subkeys under
a key node, because both of subkeys and the array elements
are using "next" field of the xbc_node.

Thus this changes the array values to use "child" field in
the array case. The reason why split this change is to
test it easily.

Link: https://lkml.kernel.org/r/162262193838.264090.16044473274501498656.stgit@devnote2

Signed-off-by: Masami Hiramatsu <[email protected]>
Signed-off-by: Steven Rostedt (VMware) <[email protected]>
  • Loading branch information
mhiramat authored and rostedt committed Jun 10, 2021
1 parent ee0a070 commit ca24306
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 9 deletions.
2 changes: 1 addition & 1 deletion fs/proc/bootconfig.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ static int __init copy_xbc_key_value_list(char *dst, size_t size)
else
q = '"';
ret = snprintf(dst, rest(dst, end), "%c%s%c%s",
q, val, q, vnode->next ? ", " : "\n");
q, val, q, xbc_node_is_array(vnode) ? ", " : "\n");
if (ret < 0)
goto out;
dst += ret;
Expand Down
6 changes: 3 additions & 3 deletions include/linux/bootconfig.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ static inline __init bool xbc_node_is_key(struct xbc_node *node)
*/
static inline __init bool xbc_node_is_array(struct xbc_node *node)
{
return xbc_node_is_value(node) && node->next != 0;
return xbc_node_is_value(node) && node->child != 0;
}

/**
Expand Down Expand Up @@ -140,7 +140,7 @@ static inline struct xbc_node * __init xbc_find_node(const char *key)
*/
#define xbc_array_for_each_value(anode, value) \
for (value = xbc_node_get_data(anode); anode != NULL ; \
anode = xbc_node_get_next(anode), \
anode = xbc_node_get_child(anode), \
value = anode ? xbc_node_get_data(anode) : NULL)

/**
Expand Down Expand Up @@ -171,7 +171,7 @@ static inline struct xbc_node * __init xbc_find_node(const char *key)
*/
#define xbc_node_for_each_array_value(node, key, anode, value) \
for (value = xbc_node_find_value(node, key, &anode); value != NULL; \
anode = xbc_node_get_next(anode), \
anode = xbc_node_get_child(anode), \
value = anode ? xbc_node_get_data(anode) : NULL)

/**
Expand Down
23 changes: 19 additions & 4 deletions lib/bootconfig.c
Original file line number Diff line number Diff line change
Expand Up @@ -367,6 +367,14 @@ static inline __init struct xbc_node *xbc_last_sibling(struct xbc_node *node)
return node;
}

static inline __init struct xbc_node *xbc_last_child(struct xbc_node *node)
{
while (node->child)
node = xbc_node_get_child(node);

return node;
}

static struct xbc_node * __init xbc_add_sibling(char *data, u32 flag)
{
struct xbc_node *sib, *node = xbc_add_node(data, flag);
Expand Down Expand Up @@ -517,17 +525,20 @@ static int __init xbc_parse_array(char **__v)
char *next;
int c = 0;

if (last_parent->child)
last_parent = xbc_node_get_child(last_parent);

do {
c = __xbc_parse_value(__v, &next);
if (c < 0)
return c;

node = xbc_add_sibling(*__v, XBC_VALUE);
node = xbc_add_child(*__v, XBC_VALUE);
if (!node)
return -ENOMEM;
*__v = next;
} while (c == ',');
node->next = 0;
node->child = 0;

return c;
}
Expand Down Expand Up @@ -615,8 +626,12 @@ static int __init xbc_parse_kv(char **k, char *v, int op)

if (op == ':' && child) {
xbc_init_node(child, v, XBC_VALUE);
} else if (!xbc_add_sibling(v, XBC_VALUE))
return -ENOMEM;
} else {
if (op == '+' && child)
last_parent = xbc_last_child(child);
if (!xbc_add_sibling(v, XBC_VALUE))
return -ENOMEM;
}

if (c == ',') { /* Array */
c = xbc_parse_array(&next);
Expand Down
2 changes: 1 addition & 1 deletion tools/bootconfig/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ static int xbc_show_value(struct xbc_node *node, bool semicolon)
q = '\'';
else
q = '"';
printf("%c%s%c%s", q, val, q, node->next ? ", " : eol);
printf("%c%s%c%s", q, val, q, xbc_node_is_array(node) ? ", " : eol);
i++;
}
return i;
Expand Down

0 comments on commit ca24306

Please sign in to comment.