From: Gustavo A. R. Silva > Sent: 23 March 2021 22:49 > > There is a regular need in the kernel to provide a way to declare having > a dynamically sized set of trailing elements in a structure. Kernel code > should always use “flexible array members”[1] for these cases. The older > style of one-element or zero-length arrays should no longer be used[2]. > > Use an anonymous union with a couple of anonymous structs in order to > keep userspace unchanged: > > $ pahole -C nfs_fhbase_new fs/nfsd/nfsfh.o > struct nfs_fhbase_new { > union { > struct { > __u8 fb_version_aux; /* 0 1 */ > __u8 fb_auth_type_aux; /* 1 1 */ > __u8 fb_fsid_type_aux; /* 2 1 */ > __u8 fb_fileid_type_aux; /* 3 1 */ > __u32 fb_auth[1]; /* 4 4 */ > }; /* 0 8 */ > struct { > __u8 fb_version; /* 0 1 */ > __u8 fb_auth_type; /* 1 1 */ > __u8 fb_fsid_type; /* 2 1 */ > __u8 fb_fileid_type; /* 3 1 */ > __u32 fb_auth_flex[0]; /* 4 0 */ > }; /* 0 4 */ > }; /* 0 8 */ > > /* size: 8, cachelines: 1, members: 1 */ > /* last cacheline: 8 bytes */ > }; Could you use the simpler: > struct nfs_fhbase_new { > __u8 fb_version; > __u8 fb_auth_type; > __u8 fb_fsid_type; > __u8 fb_fileid_type; > union { > __u32 fb_auth[1]; > __u32 fb_auth_flex[0]; > }; > }; Although I'm not certain flexible arrays are supported as the last element of a union. You might need to use a named anonymous structure for the four __u8 fields and create two different structures that include the extra field on the end. David - Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales)