bcachefs: Avoid -Wflex-array-member-not-at-end warnings
PATCH v2 1/1 bcachefs: Avoid -Wflex-array-member-not-at-end warnings
-Wflex-array-member-not-at-end was introduced in GCC-14, and we are getting ready to enable it, globally.
Refactor a couple of structs that contain flexible arrays in the middle by replacing them with unions.
So, with these changes, fix the following warnings:
fs/bcachefs/disk_accounting.c:429:51: warning: structure containing a flexible array member is not at the end of another structure [-Wflex-array-member-not-at-end] fs/bcachefs/ec_types.h:8:41: warning: structure containing a flexible array member is not at the end of another structure [-Wflex-array-member-not-at-end]
---
Changes in v2:
- Use a union instead of DEFINE_FLEX().
- Address an additional -Wflex-array-member-not-at-end warning.
v1:
- Link: https://lore.kernel.org/linux-hardening/aBF5udHEHwWvmWJw@kspp/
fs/bcachefs/disk_accounting.c | 12 +++++++----- fs/bcachefs/ec_types.h | 7 ++++--- fs/bcachefs/journal_io.c | 6 +++--- fs/bcachefs/journal_reclaim.c | 2 +- 4 files changed, 15 insertions(+), 12 deletions(-)
fs/bcachefs/disk_accounting.c +7 -5
@@ -287,7 +287,7 @@ static inline bool accounting_to_replicas(struct bch_replicas_entry_v1 *r, strucstatic int bch2_accounting_update_sb_one (struct bch_fs *c,struct bpos p) { -struct bch_replicas_padded r; +union bch_replicas_padded r;return accounting_to_replicas (&r.e, p) ?bch2_mark_replicas (c, &r.e) :0 ;
@@ -361,7 +361,7 @@ static int __bch2_accounting_mem_insert(struct bch_fs *c, struct bkey_s_c_accounint bch2_accounting_mem_insert (struct bch_fs *c,struct bkey_s_c_accounting a,enum bch_accounting_mode mode) { -struct bch_replicas_padded r; +union bch_replicas_padded r; if (mode != BCH_ACCOUNTING_read && accounting_to_replicas(&r.e, a.k->p) &&
@@ -425,10 +425,12 @@ int bch2_fs_replicas_usage_read(struct bch_fs *c, darray_char *usage)percpu_down_read (&c->mark_lock);darray_for_each (acc->k, i) { -struct { +union { + u8 bytes[struct_size_t(struct bch_replicas_usage, r.devs, +BCH_BKEY_PTRS_MAX )];struct bch_replicas_usage r; -u8 pad[BCH_BKEY_PTRS_MAX ]; } u; + u.r.r.nr_devs =BCH_BKEY_PTRS_MAX ;if (!accounting_to_replicas (&u.r.r, i->pos))continue ;
@@ -627,7 +629,7 @@ static int bch2_disk_accounting_validate_late(struct btree_trans *trans,switch (acc->type) {case BCH_DISK_ACCOUNTING_replicas: { -struct bch_replicas_padded r; +union bch_replicas_padded r;__accounting_to_replicas (&r.e, acc);for (unsigned i =0 ; i < r.e.nr_devs; i++)
fs/bcachefs/ec_types.h +4 -3
@@ -4,9 +4,10 @@#include "bcachefs_format.h" -struct bch_replicas_padded { +union bch_replicas_padded { + u8 bytes[struct_size_t(struct bch_replicas_entry_v1, + devs,BCH_BKEY_PTRS_MAX )];struct bch_replicas_entry_v1 e; -u8 pad[BCH_BKEY_PTRS_MAX ]; };struct stripe {
@@ -28,7 +29,7 @@ struct gc_stripe {u16 block_sectors[BCH_BKEY_PTRS_MAX ];struct bch_extent_ptr ptrs[BCH_BKEY_PTRS_MAX ]; - struct bch_replicas_padded r; + union bch_replicas_padded r; };#endif /* _BCACHEFS_EC_TYPES_H */
fs/bcachefs/journal_io.c +3 -3
@@ -1404,7 +1404,7 @@ int bch2_journal_read(struct bch_fs *c, }genradix_for_each (&c->journal_entries, radix_iter, _i) { -struct bch_replicas_padded replicas = { +union bch_replicas_padded replicas = { .e.data_type = BCH_DATA_journal, .e.nr_devs =0 , .e.nr_required =1 ,
@@ -1632,7 +1632,7 @@ static CLOSURE_CALLBACK(journal_write_done) closure_type(w, struct journal_buf, io); struct journal *j = container_of(w, struct journal, buf[w->idx]); struct bch_fs *c = container_of(j, struct bch_fs, journal); -struct bch_replicas_padded replicas; +union bch_replicas_padded replicas;u64 seq =le64_to_cpu (w->data->seq);int err =0 ;
@@ -2055,7 +2055,7 @@ CLOSURE_CALLBACK(bch2_journal_write) closure_type(w, struct journal_buf, io); struct journal *j = container_of(w, struct journal, buf[w->idx]); struct bch_fs *c = container_of(j, struct bch_fs, journal); -struct bch_replicas_padded replicas; +union bch_replicas_padded replicas;unsigned nr_rw_members =dev_mask_nr (&c->rw_devs[BCH_DATA_journal]);int ret;
fs/bcachefs/journal_reclaim.c +1 -1
@@ -953,7 +953,7 @@ int bch2_journal_flush_device_pins(struct journal *j, int dev_idx) seq =0 ;spin_lock (&j->lock);while (!ret) { -struct bch_replicas_padded replicas; +union bch_replicas_padded replicas; seq =max (seq,journal_last_seq (j));if (seq >= j->pin.back)
Signature · 1 line
2.43.0
Quoted 10 lines · Gustavo A. R. Silva
-Wflex-array-member-not-at-end was introduced in GCC-14, and we are getting ready to enable it, globally.
Refactor a couple of structs that contain flexible arrays in the middle by replacing them with unions.
So, with these changes, fix the following warnings:
fs/bcachefs/disk_accounting.c:429:51: warning: structure containing a flexible array member is not at the end of another structure [-Wflex-array-member-not-at-end]fs/bcachefs/ec_types.h:8:41: warning: structure containing a flexible array member is not at the end of another structure [-Wflex-array-member-not-at-end]
Applied. Presumably you only need this in 6.16?
Quoted 1 line
Applied. Presumably you only need this in 6.16?
Yes - there's no hurry.
Thanks
-Gustavo