lkml.org 
[lkml]   [2018]   [Nov]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 078/222] UAPI: ndctl: Fix g++-unsupported initialisation in headers
    Date
    4.14-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: David Howells <dhowells@redhat.com>

    [ 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: David Howells <dhowells@redhat.com>
    Signed-off-by: Dan Williams <dan.j.williams@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    include/uapi/linux/ndctl.h | 48 +++++++++++++++++++--------------------------
    1 file changed, 21 insertions(+), 27 deletions(-)

    --- a/include/uapi/linux/ndctl.h
    +++ b/include/uapi/linux/ndctl.h
    @@ -176,37 +176,31 @@ enum {

    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";
    + switch (cmd) {
    + case ND_CMD_ARS_CAP: return "ars_cap";
    + case ND_CMD_ARS_START: return "ars_start";
    + case ND_CMD_ARS_STATUS: return "ars_status";
    + case ND_CMD_CLEAR_ERROR: return "clear_error";
    + case ND_CMD_CALL: return "cmd_call";
    + default: return "unknown";
    + }
    }

    static inline const char *nvdimm_cmd_name(unsigned cmd)
    {
    - static const char * const names[] = {
    - [ND_CMD_SMART] = "smart",
    - [ND_CMD_SMART_THRESHOLD] = "smart_thresh",
    - [ND_CMD_DIMM_FLAGS] = "flags",
    - [ND_CMD_GET_CONFIG_SIZE] = "get_size",
    - [ND_CMD_GET_CONFIG_DATA] = "get_data",
    - [ND_CMD_SET_CONFIG_DATA] = "set_data",
    - [ND_CMD_VENDOR_EFFECT_LOG_SIZE] = "effect_size",
    - [ND_CMD_VENDOR_EFFECT_LOG] = "effect_log",
    - [ND_CMD_VENDOR] = "vendor",
    - [ND_CMD_CALL] = "cmd_call",
    - };
    -
    - if (cmd < ARRAY_SIZE(names) && names[cmd])
    - return names[cmd];
    - return "unknown";
    + switch (cmd) {
    + case ND_CMD_SMART: return "smart";
    + case ND_CMD_SMART_THRESHOLD: return "smart_thresh";
    + case ND_CMD_DIMM_FLAGS: return "flags";
    + case ND_CMD_GET_CONFIG_SIZE: return "get_size";
    + case ND_CMD_GET_CONFIG_DATA: return "get_data";
    + case ND_CMD_SET_CONFIG_DATA: return "set_data";
    + case ND_CMD_VENDOR_EFFECT_LOG_SIZE: return "effect_size";
    + case ND_CMD_VENDOR_EFFECT_LOG: return "effect_log";
    + case ND_CMD_VENDOR: return "vendor";
    + case ND_CMD_CALL: return "cmd_call";
    + default: return "unknown";
    + }
    }

    #define ND_IOCTL 'N'

    \
     
     \ /
      Last update: 2018-11-12 00:04    [W:3.124 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site