bcachefs: Fix build errors with gcc 10
authorKent Overstreet <kent.overstreet@linux.dev>
Tue, 31 Oct 2023 22:05:22 +0000 (18:05 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sat, 4 Nov 2023 18:17:11 +0000 (14:17 -0400)
gcc 10 seems to complain about array bounds in situations where gcc 11
does not - curious.

This unfortunately requires adding some casts for now; we may
investigate getting rid of our __u64 _data[] VLA in a future patch so
that our start[0] members can be VLAs.

Reported-by: John Stoffel <john@stoffel.org>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/bcachefs_format.h
fs/bcachefs/btree_trans_commit.c
fs/bcachefs/btree_update_interior.c
fs/bcachefs/btree_update_interior.h
fs/bcachefs/recovery.c

index 29b000c6b7e1f49495e51b361ba0cdc66d81107e..5b44598b9df93af0f39688a49f1107b6e39aadbb 100644 (file)
@@ -1617,9 +1617,7 @@ struct journal_seq_blacklist_entry {
 
 struct bch_sb_field_journal_seq_blacklist {
        struct bch_sb_field     field;
-
-       struct journal_seq_blacklist_entry start[0];
-       __u64                   _data[];
+       struct journal_seq_blacklist_entry start[];
 };
 
 struct bch_sb_field_errors {
index 8140b6e6e9a65245615397dd60489feb57240da1..32693f7c6221043d0c28b07e57f1b396bd845582 100644 (file)
@@ -681,7 +681,7 @@ bch2_trans_commit_write_locked(struct btree_trans *trans, unsigned flags,
                                                       BCH_JSET_ENTRY_overwrite,
                                                       i->btree_id, i->level,
                                                       i->old_k.u64s);
-                               bkey_reassemble(&entry->start[0],
+                               bkey_reassemble((struct bkey_i *) entry->start,
                                                (struct bkey_s_c) { &i->old_k, i->old_v });
                        }
 
@@ -689,7 +689,7 @@ bch2_trans_commit_write_locked(struct btree_trans *trans, unsigned flags,
                                               BCH_JSET_ENTRY_btree_keys,
                                               i->btree_id, i->level,
                                               i->k->k.u64s);
-                       bkey_copy(&entry->start[0], i->k);
+                       bkey_copy((struct bkey_i *) entry->start, i->k);
                }
 
                trans_for_each_wb_update(trans, wb) {
@@ -697,7 +697,7 @@ bch2_trans_commit_write_locked(struct btree_trans *trans, unsigned flags,
                                               BCH_JSET_ENTRY_btree_keys,
                                               wb->btree, 0,
                                               wb->k.k.u64s);
-                       bkey_copy(&entry->start[0], &wb->k);
+                       bkey_copy((struct bkey_i *) entry->start, &wb->k);
                }
 
                if (trans->journal_seq)
index d029e0348c918a292d596af7ce520588235ccabd..89ada89eafe7b79096f806da7541b94939fd2da1 100644 (file)
@@ -2411,7 +2411,7 @@ void bch2_journal_entry_to_btree_root(struct bch_fs *c, struct jset_entry *entry
 
        r->level = entry->level;
        r->alive = true;
-       bkey_copy(&r->key, &entry->start[0]);
+       bkey_copy(&r->key, (struct bkey_i *) entry->start);
 
        mutex_unlock(&c->btree_root_lock);
 }
index 5e0a467fe9056acf25ce8c3d65a1d5ca6adfc216..d92b3cf5f5e0f26b823d32a8719bf0f879cf994b 100644 (file)
@@ -271,7 +271,7 @@ static inline struct btree_node_entry *want_new_bset(struct bch_fs *c,
        struct btree_node_entry *bne = max(write_block(b),
                        (void *) btree_bkey_last(b, bset_tree_last(b)));
        ssize_t remaining_space =
-               __bch_btree_u64s_remaining(c, b, &bne->keys.start[0]);
+               __bch_btree_u64s_remaining(c, b, bne->keys.start);
 
        if (unlikely(bset_written(b, bset(b, t)))) {
                if (remaining_space > (ssize_t) (block_bytes(c) >> 3))
index f73338f37bf1a800325f11665d378d4c95bcc88b..9600b808317534b317e5836802f483c67299c46a 100644 (file)
@@ -226,7 +226,7 @@ static int journal_replay_entry_early(struct bch_fs *c,
 
                if (entry->u64s) {
                        r->level = entry->level;
-                       bkey_copy(&r->key, &entry->start[0]);
+                       bkey_copy(&r->key, (struct bkey_i *) entry->start);
                        r->error = 0;
                } else {
                        r->error = -EIO;