All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Gustavo A. R. Silva" <gustavoars@kernel.org>
To: Jan Kara <jack@suse.cz>, Amir Goldstein <amir73il@gmail.com>,
	Matthew Bobrowski <repnop@google.com>
Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org,
	"Gustavo A. R. Silva" <gustavoars@kernel.org>,
	linux-hardening@vger.kernel.org
Subject: [PATCH][next] fanotify: Avoid a couple of -Wflex-array-member-not-at-end warnings
Date: Tue, 6 May 2025 17:39:03 -0600	[thread overview]
Message-ID: <aBqdlxlBtb9s7ydc@kspp> (raw)

-Wflex-array-member-not-at-end was introduced in GCC-14, and we are
getting ready to enable it, globally.

Modify FANOTIFY_INLINE_FH() macro, which defines a struct containing a
flexible-array member in the middle (struct fanotify_fh::buf), to use
struct_size_t() to pre-allocate space for both struct fanotify_fh and
its flexible-array member. Replace the struct with a union and relocate
the flexible structure (struct fanotify_fh) to the end.

See the memory layout of struct fanotify_fid_event before and after
changes below.

pahole -C fanotify_fid_event fs/notify/fanotify/fanotify.o

BEFORE:
struct fanotify_fid_event {
        struct fanotify_event      fae;                  /*     0    48 */
        __kernel_fsid_t            fsid;                 /*    48     8 */
        struct {
                struct fanotify_fh object_fh;            /*    56     4 */
                unsigned char      _inline_fh_buf[12];   /*    60    12 */
        };                                               /*    56    16 */

        /* size: 72, cachelines: 2, members: 3 */
        /* last cacheline: 8 bytes */
};

AFTER:
struct fanotify_fid_event {
        struct fanotify_event      fae;                  /*     0    48 */
        __kernel_fsid_t            fsid;                 /*    48     8 */
        union {
                unsigned char      _inline_fh_buf[16];   /*    56    16 */
                struct fanotify_fh object_fh __attribute__((__aligned__(1))); /*    56     4 */
        } __attribute__((__aligned__(1)));               /*    56    16 */

        /* size: 72, cachelines: 2, members: 3 */
        /* forced alignments: 1 */
        /* last cacheline: 8 bytes */
} __attribute__((__aligned__(8)));

So, with these changes, fix the following warnings:

fs/notify/fanotify/fanotify.h:317:28: warning: structure containing a flexible array member is not at the end of another structure [-Wflex-array-member-not-at-end]
fs/notify/fanotify/fanotify.h:289:28: 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>
---
 fs/notify/fanotify/fanotify.h | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/fs/notify/fanotify/fanotify.h b/fs/notify/fanotify/fanotify.h
index b44e70e44be6..91c26b1c1d32 100644
--- a/fs/notify/fanotify/fanotify.h
+++ b/fs/notify/fanotify/fanotify.h
@@ -275,12 +275,12 @@ static inline void fanotify_init_event(struct fanotify_event *event,
 	event->pid = NULL;
 }
 
-#define FANOTIFY_INLINE_FH(name, size)					\
-struct {								\
-	struct fanotify_fh name;					\
-	/* Space for object_fh.buf[] - access with fanotify_fh_buf() */	\
-	unsigned char _inline_fh_buf[size];				\
-}
+#define FANOTIFY_INLINE_FH(name, size)						      \
+union {										      \
+	/* Space for object_fh and object_fh.buf[] - access with fanotify_fh_buf() */ \
+	unsigned char _inline_fh_buf[struct_size_t(struct fanotify_fh, buf, size)];   \
+	struct fanotify_fh name;						      \
+} __packed
 
 struct fanotify_fid_event {
 	struct fanotify_event fae;
-- 
2.43.0


             reply	other threads:[~2025-05-06 23:39 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-05-06 23:39 Gustavo A. R. Silva [this message]
2025-05-07  5:56 ` [PATCH][next] fanotify: Avoid a couple of -Wflex-array-member-not-at-end warnings Amir Goldstein
2025-05-07 11:08   ` Jan Kara
2025-05-07 17:41     ` Gustavo A. R. Silva
2025-05-08  4:30 ` kernel test robot

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=aBqdlxlBtb9s7ydc@kspp \
    --to=gustavoars@kernel.org \
    --cc=amir73il@gmail.com \
    --cc=jack@suse.cz \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-hardening@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=repnop@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.