Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

xdrgen: handle _XdrString in union encoder/decoder

Running xdrgen on xdrgen/tests/test.x fails when
generating encoder or decoder functions for union
members of type _XdrString. It was because _XdrString
does not have a spec attribute like _XdrBasic,
leading to AttributeError.

This patch updates emit_union_case_spec_definition
and emit_union_case_spec_decoder/encoder to handle
_XdrString by assigning type_name = "char *" and
avoiding referencing to spec.

Testing: Fixed xdrgen tool was run on originally failing
test file (tools/net/sunrpc/xdrgen/tests/test.x) and now
completes without AttributeError. Modified xdrgen tool was
also run against nfs4_1.x (Documentation/sunrpc/xdr/nfs4_1.x).
The output header file matches with nfs4_1.h
(include/linux/sunrpc/xdrgen/nfs4_1.h).
This validates the patch for all XDR input files currently
within the kernel.

Changes since v2:
- Moved the shebang to the first line
- Removed SPDX header to match style of current xdrgen files

Changes since v1:
- Corrected email address in Signed-off-by.
- Wrapped patch description lines to 72 characters.

Signed-off-by: Khushal Chitturi <kc9282016@gmail.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>

authored by

Khushal Chitturi and committed by
Chuck Lever
b0f8e1f1 42ba5bd2

+31 -9
+25 -9
tools/net/sunrpc/xdrgen/generators/union.py
··· 8 8 from generators import SourceGenerator 9 9 from generators import create_jinja2_environment, get_jinja2_template 10 10 11 - from xdr_ast import _XdrBasic, _XdrUnion, _XdrVoid, get_header_name 11 + from xdr_ast import _XdrBasic, _XdrUnion, _XdrVoid, _XdrString, get_header_name 12 12 from xdr_ast import _XdrDeclaration, _XdrCaseSpec, public_apis, big_endian 13 13 14 14 ··· 40 40 """Emit a definition for an XDR union's case arm""" 41 41 if isinstance(node.arm, _XdrVoid): 42 42 return 43 - assert isinstance(node.arm, _XdrBasic) 43 + if isinstance(node.arm, _XdrString): 44 + type_name = "char *" 45 + classifier = "" 46 + else: 47 + type_name = node.arm.spec.type_name 48 + classifier = node.arm.spec.c_classifier 49 + 50 + assert isinstance(node.arm, (_XdrBasic, _XdrString)) 44 51 template = get_jinja2_template(environment, "definition", "case_spec") 45 52 print( 46 53 template.render( 47 54 name=node.arm.name, 48 - type=node.arm.spec.type_name, 49 - classifier=node.arm.spec.c_classifier, 55 + type=type_name, 56 + classifier=classifier, 50 57 ) 51 58 ) 52 59 ··· 91 84 92 85 if isinstance(node.arm, _XdrVoid): 93 86 return 87 + if isinstance(node.arm, _XdrString): 88 + type_name = "char *" 89 + classifier = "" 90 + else: 91 + type_name = node.arm.spec.type_name 92 + classifier = node.arm.spec.c_classifier 94 93 95 94 if big_endian_discriminant: 96 95 template = get_jinja2_template(environment, "decoder", "case_spec_be") ··· 105 92 for case in node.values: 106 93 print(template.render(case=case)) 107 94 108 - assert isinstance(node.arm, _XdrBasic) 95 + assert isinstance(node.arm, (_XdrBasic, _XdrString)) 109 96 template = get_jinja2_template(environment, "decoder", node.arm.template) 110 97 print( 111 98 template.render( 112 99 name=node.arm.name, 113 - type=node.arm.spec.type_name, 114 - classifier=node.arm.spec.c_classifier, 100 + type=type_name, 101 + classifier=classifier, 115 102 ) 116 103 ) 117 104 ··· 182 169 183 170 if isinstance(node.arm, _XdrVoid): 184 171 return 185 - 172 + if isinstance(node.arm, _XdrString): 173 + type_name = "char *" 174 + else: 175 + type_name = node.arm.spec.type_name 186 176 if big_endian_discriminant: 187 177 template = get_jinja2_template(environment, "encoder", "case_spec_be") 188 178 else: ··· 197 181 print( 198 182 template.render( 199 183 name=node.arm.name, 200 - type=node.arm.spec.type_name, 184 + type=type_name, 201 185 ) 202 186 ) 203 187
+6
tools/net/sunrpc/xdrgen/templates/C/union/encoder/string.j2
··· 1 + {# SPDX-License-Identifier: GPL-2.0 #} 2 + {% if annotate %} 3 + /* member {{ name }} (variable-length string) */ 4 + {% endif %} 5 + if (!xdrgen_encode_string(xdr, ptr->u.{{ name }}, {{ maxsize }})) 6 + return false;