On Tue, Sep 12, 2023 at 03:26:45PM +1000, Stephen Rothwell wrote: > New tree: bcachefs Thanks for going through and fixing all the fake flexible array members. It looks much nicer. :) I have some questions about the remaining "markers", for example: $ git grep -A8 '\bkey_start\b' -- fs/bcachefs fs/bcachefs/bcachefs_format.h: __u8 key_start[0]; ... fs/bcachefs/bcachefs_format.h- __u8 pad[sizeof(struct bkey) - 3]; -- fs/bcachefs/bkey.c: u8 *l = k->key_start; Why isn't this just: u8 *l = k->pad and you can drop the marker? And some seem entirely unused, like all of "struct bch_reflink_v". And some are going to fail at runtime, since they're still zero-sized and being used as an actual array: struct bch_sb_field_journal_seq_blacklist { struct bch_sb_field field; struct journal_seq_blacklist_entry start[0]; __u64 _data[]; }; ... memmove(&bl->start[i], &bl->start[i + 1], sizeof(bl->start[0]) * (nr - i)); It looks like you just want a type union for the flexible array. This can be done like this: struct bch_sb_field_journal_seq_blacklist { struct bch_sb_field field; union { DECLARE_FLEX_ARRAY(struct journal_seq_blacklist_entry, start); DECLARE_FLEX_ARRAY(__u64, _data); }; }; Hopefully that helps! -Kees -- Kees Cook