• Gustavo A. R. Silva's avatar
    UAPI: nfsfh.h: Replace one-element array with flexible-array member · c0a744dc
    Gustavo A. R. Silva authored
    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 */
    };
    
    Also, this helps with the ongoing efforts to enable -Warray-bounds by
    fixing the following warnings:
    
    fs/nfsd/nfsfh.c: In function ‘nfsd_set_fh_dentry’:
    fs/nfsd/nfsfh.c:191:41: warning: array subscript 1 is above array bounds of ‘__u32[1]’ {aka ‘unsigned int[1]’} [-Warray-bounds]
      191 |        ntohl((__force __be32)fh->fh_fsid[1])));
          |                              ~~~~~~~~~~~^~~
    ./include/linux/kdev_t.h:12:46: note: in definition of macro ‘MKDEV’
       12 | #define MKDEV(ma,mi) (((ma) << MINORBITS) | (mi))
          |                                              ^~
    ./include/uapi/linux/byteorder/little_endian.h:40:26: note: in expansion of macro ‘__swab32’
       40 | #define __be32_to_cpu(x) __swab32((__force __u32)(__be32)(x))
          |                          ^~~~~~~~
    ./include/linux/byteorder/generic.h:136:21: note: in expansion of macro ‘__be32_to_cpu’
      136 | #define ___ntohl(x) __be32_to_cpu(x)
          |                     ^~~~~~~~~~~~~
    ./include/linux/byteorder/generic.h:140:18: note: in expansion of macro ‘___ntohl’
      140 | #define ntohl(x) ___ntohl(x)
          |                  ^~~~~~~~
    fs/nfsd/nfsfh.c:191:8: note: in expansion of macro ‘ntohl’
      191 |        ntohl((__force __be32)fh->fh_fsid[1])));
          |        ^~~~~
    fs/nfsd/nfsfh.c:192:32: warning: array subscript 2 is above array bounds of ‘__u32[1]’ {aka ‘unsigned int[1]’} [-Warray-bounds]
      192 |    fh->fh_fsid[1] = fh->fh_fsid[2];
          |                     ~~~~~~~~~~~^~~
    fs/nfsd/nfsfh.c:192:15: warning: array subscript 1 is above array bounds of ‘__u32[1]’ {aka ‘unsigned int[1]’} [-Warray-bounds]
      192 |    fh->fh_fsid[1] = fh->fh_fsid[2];
          |    ~~~~~~~~~~~^~~
    
    [1] https://en.wikipedia.org/wiki/Flexible_array_member
    [2] https://www.kernel.org/doc/html/v5.10/process/deprecated.html#zero-length-and-one-element-arrays
    
    Link: https://github.com/KSPP/linux/issues/79
    Link: https://github.com/KSPP/linux/issues/109Signed-off-by: default avatarGustavo A. R. Silva <gustavoars@kernel.org>
    Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
    c0a744dc
nfsfh.h 3.71 KB