From: Johannes Berg
Sent: 05 May 2022 21:13 On Thu, 2022-05-05 at 13:08 -0700, Keith Packard wrote:
I bet you've already considered the simpler form:
struct something *instance = mem_to_flex_dup(byte_array, count, GFP_KERNEL); if (IS_ERR(instance)) return PTR_ERR(instance);
Sadly, this doesn't work in any way because mem_to_flex_dup() needs to know at least the type, hence passing 'instance', which is simpler than passing 'struct something'.
You can use: struct something *instance; mem_to_flex_dup(instance, byte_array, count, GFP_KERNEL); if (IS_ERR(instance)) return PTR_ERR(instance); and have mem_to_flex_dup() (which must be a #define) update 'instance'. (You can require &instance - and just precede all the uses with an extra '*' to make it more obvious the variable is updated. But there is little point requiring it be NULL.)
If you really want to define the variable mid-block you can use: mem_to_flex_dup(struct something *, instance, byte_array, count, GFP_KERNEL);
but I really hate having declarations anywhere other than the top of a function because it makes them hard for the 'mk1 eyeball' to spot.
David
- Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales)