On Thu, Sep 6, 2018 at 2:19 AM David Howells <dhowells@xxxxxxxxxx> wrote: > > The following code in the linux/ndctl header file: > > static inline const char *nvdimm_bus_cmd_name(unsigned cmd) > { > static const char * const names[] = { > [ND_CMD_ARS_CAP] = "ars_cap", > [ND_CMD_ARS_START] = "ars_start", > [ND_CMD_ARS_STATUS] = "ars_status", > [ND_CMD_CLEAR_ERROR] = "clear_error", > [ND_CMD_CALL] = "cmd_call", > }; > > if (cmd < ARRAY_SIZE(names) && names[cmd]) > return names[cmd]; > return "unknown"; > } > > is broken in a number of ways: > > (1) ARRAY_SIZE() is not generally defined. > > (2) g++ does not support "non-trivial" array initialisers fully yet. > > (3) Every file that calls this function will acquire a copy of names[]. > > The same goes for nvdimm_cmd_name(). > > Fix all three by converting to a switch statement where each case returns a > string. That way if cmd is a constant, the compiler can trivially reduce it > and, if not, the compiler can use a shared lookup table if it thinks that is > more efficient. > > A better way would be to remove these functions and their arrays from the > header entirely. > > Signed-off-by: David Howells <dhowells@xxxxxxxxxx> > cc: Dan Williams <dan.j.williams@xxxxxxxxx> Acked-by: Dan Williams <dan.j.williams@xxxxxxxxx> ...again let me know if you'll take this with g++ series or want me to carry it directly.