Re: [PATCH] fanotify: Drop use of flex array in fanotify_fh

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, May 13, 2025 at 3:18 PM Jan Kara <jack@xxxxxxx> wrote:
>
> We use flex array 'buf' in fanotify_fh to contain the file handle
> content. However the buffer is not a proper flex array. It has a
> preconfigured fixed size. Furthermore if fixed size is not big enough,
> we use external separately allocated buffer. Hence don't pretend buf is
> a flex array since we have to use special accessors anyway and instead
> just modify the accessors to do the pointer math without flex array.
> This fixes warnings that flex array is not the last struct member in
> fanotify_fid_event or fanotify_error_event.
>
> Signed-off-by: Jan Kara <jack@xxxxxxx>

Makes sense.

Reviewed-by: Amir Goldstein <amir73il@xxxxxxxxx>

> ---
>  fs/notify/fanotify/fanotify.c | 2 +-
>  fs/notify/fanotify/fanotify.h | 9 ++++-----
>  2 files changed, 5 insertions(+), 6 deletions(-)
>
> Amir, how about this solution for the flex array warnings?
>
> diff --git a/fs/notify/fanotify/fanotify.c b/fs/notify/fanotify/fanotify.c
> index 6d386080faf2..7bc5580a91dc 100644
> --- a/fs/notify/fanotify/fanotify.c
> +++ b/fs/notify/fanotify/fanotify.c
> @@ -415,7 +415,7 @@ static int fanotify_encode_fh(struct fanotify_fh *fh, struct inode *inode,
>  {
>         int dwords, type = 0;
>         char *ext_buf = NULL;
> -       void *buf = fh->buf;
> +       void *buf = fh + 1;
>         int err;
>
>         fh->type = FILEID_ROOT;
> diff --git a/fs/notify/fanotify/fanotify.h b/fs/notify/fanotify/fanotify.h
> index b44e70e44be6..b78308975082 100644
> --- a/fs/notify/fanotify/fanotify.h
> +++ b/fs/notify/fanotify/fanotify.h
> @@ -25,7 +25,7 @@ enum {
>   * stored in either the first or last 2 dwords.
>   */
>  #define FANOTIFY_INLINE_FH_LEN (3 << 2)
> -#define FANOTIFY_FH_HDR_LEN    offsetof(struct fanotify_fh, buf)
> +#define FANOTIFY_FH_HDR_LEN    sizeof(struct fanotify_fh)
>
>  /* Fixed size struct for file handle */
>  struct fanotify_fh {
> @@ -34,7 +34,6 @@ struct fanotify_fh {
>  #define FANOTIFY_FH_FLAG_EXT_BUF 1
>         u8 flags;
>         u8 pad;
> -       unsigned char buf[];
>  } __aligned(4);
>
>  /* Variable size struct for dir file handle + child file handle + name */
> @@ -92,7 +91,7 @@ static inline char **fanotify_fh_ext_buf_ptr(struct fanotify_fh *fh)
>         BUILD_BUG_ON(FANOTIFY_FH_HDR_LEN % 4);
>         BUILD_BUG_ON(__alignof__(char *) - 4 + sizeof(char *) >
>                      FANOTIFY_INLINE_FH_LEN);
> -       return (char **)ALIGN((unsigned long)(fh->buf), __alignof__(char *));
> +       return (char **)ALIGN((unsigned long)(fh + 1), __alignof__(char *));
>  }
>
>  static inline void *fanotify_fh_ext_buf(struct fanotify_fh *fh)
> @@ -102,7 +101,7 @@ static inline void *fanotify_fh_ext_buf(struct fanotify_fh *fh)
>
>  static inline void *fanotify_fh_buf(struct fanotify_fh *fh)
>  {
> -       return fanotify_fh_has_ext_buf(fh) ? fanotify_fh_ext_buf(fh) : fh->buf;
> +       return fanotify_fh_has_ext_buf(fh) ? fanotify_fh_ext_buf(fh) : fh + 1;
>  }
>
>  static inline int fanotify_info_dir_fh_len(struct fanotify_info *info)
> @@ -278,7 +277,7 @@ static inline void fanotify_init_event(struct fanotify_event *event,
>  #define FANOTIFY_INLINE_FH(name, size)                                 \
>  struct {                                                               \
>         struct fanotify_fh name;                                        \
> -       /* Space for object_fh.buf[] - access with fanotify_fh_buf() */ \
> +       /* Space for filehandle - access with fanotify_fh_buf() */      \
>         unsigned char _inline_fh_buf[size];                             \
>  }
>
> --
> 2.43.0
>





[Index of Archives]     [Linux Ext4 Filesystem]     [Union Filesystem]     [Filesystem Testing]     [Ceph Users]     [Ecryptfs]     [NTFS 3]     [AutoFS]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux Cachefs]     [Reiser Filesystem]     [Linux RAID]     [NTFS 3]     [Samba]     [Device Mapper]     [CEPH Development]

  Powered by Linux