ext4: avoid -Wflex-array-member-not-at-end warning
authorGustavo A. R. Silva <gustavoars@kernel.org>
Wed, 26 Mar 2025 22:55:51 +0000 (16:55 -0600)
committerTheodore Ts'o <tytso@mit.edu>
Sun, 13 Apr 2025 02:01:29 +0000 (22:01 -0400)
-Wflex-array-member-not-at-end was introduced in GCC-14, and we are
getting ready to enable it, globally.

Use the `DEFINE_RAW_FLEX()` helper for an on-stack definition of
a flexible structure where the size of the flexible-array member
is known at compile-time, and refactor the rest of the code,
accordingly.

So, with these changes, fix the following warning:

fs/ext4/mballoc.c:3041:40: warning: structure containing a flexible array member is not at the end of another structure [-Wflex-array-member-not-at-end]

Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org>
Reviewed-by: Kees Cook <kees@kernel.org>
Link: https://patch.msgid.link/Z-SF97N3AxcIMlSi@kspp
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
fs/ext4/mballoc.c

index 0d523e9fb3d52952d896e1b0f685928540aceb50..f88424c281943f4fa6a5a3619640913c1fa9b1ff 100644 (file)
@@ -3037,10 +3037,8 @@ static int ext4_mb_seq_groups_show(struct seq_file *seq, void *v)
        unsigned char blocksize_bits = min_t(unsigned char,
                                             sb->s_blocksize_bits,
                                             EXT4_MAX_BLOCK_LOG_SIZE);
-       struct sg {
-               struct ext4_group_info info;
-               ext4_grpblk_t counters[EXT4_MAX_BLOCK_LOG_SIZE + 2];
-       } sg;
+       DEFINE_RAW_FLEX(struct ext4_group_info, sg, bb_counters,
+                       EXT4_MAX_BLOCK_LOG_SIZE + 2);
 
        group--;
        if (group == 0)
@@ -3048,7 +3046,7 @@ static int ext4_mb_seq_groups_show(struct seq_file *seq, void *v)
                              " 2^0   2^1   2^2   2^3   2^4   2^5   2^6  "
                              " 2^7   2^8   2^9   2^10  2^11  2^12  2^13  ]\n");
 
-       i = (blocksize_bits + 2) * sizeof(sg.info.bb_counters[0]) +
+       i = (blocksize_bits + 2) * sizeof(sg->bb_counters[0]) +
                sizeof(struct ext4_group_info);
 
        grinfo = ext4_get_group_info(sb, group);
@@ -3068,14 +3066,14 @@ static int ext4_mb_seq_groups_show(struct seq_file *seq, void *v)
         * We care only about free space counters in the group info and
         * these are safe to access even after the buddy has been unloaded
         */
-       memcpy(&sg, grinfo, i);
-       seq_printf(seq, "#%-5u: %-5u %-5u %-5u [", group, sg.info.bb_free,
-                       sg.info.bb_fragments, sg.info.bb_first_free);
+       memcpy(sg, grinfo, i);
+       seq_printf(seq, "#%-5u: %-5u %-5u %-5u [", group, sg->bb_free,
+                       sg->bb_fragments, sg->bb_first_free);
        for (i = 0; i <= 13; i++)
                seq_printf(seq, " %-5u", i <= blocksize_bits + 1 ?
-                               sg.info.bb_counters[i] : 0);
+                               sg->bb_counters[i] : 0);
        seq_puts(seq, " ]");
-       if (EXT4_MB_GRP_BBITMAP_CORRUPT(&sg.info))
+       if (EXT4_MB_GRP_BBITMAP_CORRUPT(sg))
                seq_puts(seq, " Block bitmap corrupted!");
        seq_putc(seq, '\n');
        return 0;