• D
    UAPI: ndctl: Fix g++-unsupported initialisation in headers · cd888e8a
    David Howells 提交于
    [ Upstream commit 9607871f37dc3e717639694b8d0dc738f2a68efc ]
    
    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: NDavid Howells <dhowells@redhat.com>
    Signed-off-by: NDan Williams <dan.j.williams@intel.com>
    Signed-off-by: NSasha Levin <sashal@kernel.org>
    Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    cd888e8a
ndctl.h 6.5 KB