bcachefs: Drop some anonymous structs, unions
authorKent Overstreet <kent.overstreet@linux.dev>
Sun, 5 Mar 2023 04:05:55 +0000 (23:05 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:55 +0000 (17:09 -0400)
Rust bindgen doesn't cope well with anonymous structs and unions. This
patch drops the fancy anonymous structs & unions in bkey_i that let us
use the same helpers for bkey_i and bkey_packed; since bkey_packed is an
internal type that's never exposed to outside code, it's only a minor
inconvenienc.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
15 files changed:
fs/bcachefs/bcachefs_format.h
fs/bcachefs/bkey.h
fs/bcachefs/bkey_sort.c
fs/bcachefs/bset.c
fs/bcachefs/bset.h
fs/bcachefs/btree_io.c
fs/bcachefs/btree_key_cache.c
fs/bcachefs/btree_update_interior.c
fs/bcachefs/debug.c
fs/bcachefs/extents.h
fs/bcachefs/io.c
fs/bcachefs/journal_io.c
fs/bcachefs/journal_io.h
fs/bcachefs/recovery.c
fs/bcachefs/reflink.c

index f5587ed7dfd2c8e090f2cdfa3f83b2ddc43d5fc2..aae658d17797beb762d4df47d02fac444a67c620 100644 (file)
@@ -294,16 +294,8 @@ enum bch_bkey_fields {
 struct bkey_i {
        __u64                   _data[0];
 
-       union {
-       struct {
-               /* Size of combined key and value, in u64s */
-               __u8            u64s;
-       };
-       struct {
-               struct bkey     k;
-               struct bch_val  v;
-       };
-       };
+       struct bkey     k;
+       struct bch_val  v;
 };
 
 #define KEY(_inode, _offset, _size)                                    \
index 28a70ad5a25ddda58beea712405372516bb533db..dbe4873cad02036d1d0c84abd9ad35a44558d11a 100644 (file)
@@ -42,7 +42,12 @@ struct bkey_s {
        };
 };
 
-#define bkey_next(_k)          vstruct_next(_k)
+#define bkey_p_next(_k)                vstruct_next(_k)
+
+static inline struct bkey_i *bkey_next(struct bkey_i *k)
+{
+       return (struct bkey_i *) (k->_data + k->k.u64s);
+}
 
 #define bkey_val_u64s(_k)      ((_k)->u64s - BKEY_U64s)
 
index 557a79cad98670b5f753f6e7d71372b4418cf7a8..cdef41db76925c235e218974e0dba760da61e55c 100644 (file)
@@ -46,7 +46,7 @@ static inline void sort_iter_advance(struct sort_iter *iter, sort_cmp_fn cmp)
 
        BUG_ON(!iter->used);
 
-       i->k = bkey_next(i->k);
+       i->k = bkey_p_next(i->k);
 
        BUG_ON(i->k > i->end);
 
@@ -108,7 +108,7 @@ bch2_key_sort_fix_overlapping(struct bch_fs *c, struct bset *dst,
                    !should_drop_next_key(iter)) {
                        bkey_copy(out, k);
                        btree_keys_account_key_add(&nr, 0, out);
-                       out = bkey_next(out);
+                       out = bkey_p_next(out);
                }
 
                sort_iter_advance(iter, key_sort_fix_overlapping_cmp);
@@ -147,7 +147,7 @@ bch2_sort_repack(struct bset *dst, struct btree *src,
                out->needs_whiteout = false;
 
                btree_keys_account_key_add(&nr, 0, out);
-               out = bkey_next(out);
+               out = bkey_p_next(out);
        }
 
        dst->u64s = cpu_to_le16((u64 *) out - dst->_data);
@@ -194,7 +194,7 @@ unsigned bch2_sort_keys(struct bkey_packed *dst,
                        bkey_copy(out, in);
                }
                out->needs_whiteout |= needs_whiteout;
-               out = bkey_next(out);
+               out = bkey_p_next(out);
        }
 
        return (u64 *) out - (u64 *) dst;
index 50a1c9d8ebabae865a8fed0bc2681201b31af2f7..a7cb12ea2a04227e1920061123f8557e202af6b0 100644 (file)
@@ -66,7 +66,7 @@ void bch2_dump_bset(struct bch_fs *c, struct btree *b,
        for (_k = i->start;
             _k < vstruct_last(i);
             _k = _n) {
-               _n = bkey_next(_k);
+               _n = bkey_p_next(_k);
 
                k = bkey_disassemble(b, _k, &uk);
 
@@ -539,7 +539,7 @@ start:
                               rw_aux_tree(b, t)[j - 1].offset);
                }
 
-               k = bkey_next(k);
+               k = bkey_p_next(k);
                BUG_ON(k >= btree_bkey_last(b, t));
        }
 }
@@ -730,7 +730,7 @@ retry:
        /* First we figure out where the first key in each cacheline is */
        eytzinger1_for_each(j, t->size - 1) {
                while (bkey_to_cacheline(b, t, k) < cacheline)
-                       prev = k, k = bkey_next(k);
+                       prev = k, k = bkey_p_next(k);
 
                if (k >= btree_bkey_last(b, t)) {
                        /* XXX: this path sucks */
@@ -747,7 +747,7 @@ retry:
        }
 
        while (k != btree_bkey_last(b, t))
-               prev = k, k = bkey_next(k);
+               prev = k, k = bkey_p_next(k);
 
        if (!bkey_pack_pos(bkey_to_packed(&min_key), b->data->min_key, b)) {
                bkey_init(&min_key.k);
@@ -885,7 +885,7 @@ struct bkey_packed *bch2_bkey_prev_filter(struct btree *b,
        struct bkey_packed *p, *i, *ret = NULL, *orig_k = k;
 
        while ((p = __bkey_prev(b, t, k)) && !ret) {
-               for (i = p; i != k; i = bkey_next(i))
+               for (i = p; i != k; i = bkey_p_next(i))
                        if (i->type >= min_key_type)
                                ret = i;
 
@@ -896,10 +896,10 @@ struct bkey_packed *bch2_bkey_prev_filter(struct btree *b,
                BUG_ON(ret >= orig_k);
 
                for (i = ret
-                       ? bkey_next(ret)
+                       ? bkey_p_next(ret)
                        : btree_bkey_first(b, t);
                     i != orig_k;
-                    i = bkey_next(i))
+                    i = bkey_p_next(i))
                        BUG_ON(i->type >= min_key_type);
        }
 
@@ -971,7 +971,7 @@ static void bch2_bset_fix_lookup_table(struct btree *b,
                struct bkey_packed *k = start;
 
                while (1) {
-                       k = bkey_next(k);
+                       k = bkey_p_next(k);
                        if (k == end)
                                break;
 
@@ -1205,12 +1205,12 @@ struct bkey_packed *bch2_bset_search_linear(struct btree *b,
                while (m != btree_bkey_last(b, t) &&
                       bkey_iter_cmp_p_or_unp(b, m,
                                        lossy_packed_search, search) < 0)
-                       m = bkey_next(m);
+                       m = bkey_p_next(m);
 
        if (!packed_search)
                while (m != btree_bkey_last(b, t) &&
                       bkey_iter_pos_cmp(b, m, search) < 0)
-                       m = bkey_next(m);
+                       m = bkey_p_next(m);
 
        if (bch2_expensive_debug_checks) {
                struct bkey_packed *prev = bch2_bkey_prev_all(b, t, m);
index fd2915a150708f9b9e5203d761c2ea2342e872ef..2105e7836557c854c12070f309f5116b8562eaf7 100644 (file)
@@ -211,7 +211,7 @@ static inline size_t btree_aux_data_u64s(const struct btree *b)
 #define bset_tree_for_each_key(_b, _t, _k)                             \
        for (_k = btree_bkey_first(_b, _t);                             \
             _k != btree_bkey_last(_b, _t);                             \
-            _k = bkey_next(_k))
+            _k = bkey_p_next(_k))
 
 static inline bool bset_has_ro_aux_tree(struct bset_tree *t)
 {
index 159a97596052a3b967c27f603049a94c9a3312f8..5dc2b3ecb3190e94a8a52cd532d8959f0d9f4e0b 100644 (file)
@@ -77,9 +77,9 @@ static void verify_no_dups(struct btree *b,
        if (start == end)
                return;
 
-       for (p = start, k = bkey_next(start);
+       for (p = start, k = bkey_p_next(start);
             k != end;
-            p = k, k = bkey_next(k)) {
+            p = k, k = bkey_p_next(k)) {
                struct bkey l = bkey_unpack_key(b, p);
                struct bkey r = bkey_unpack_key(b, k);
 
@@ -92,7 +92,7 @@ static void set_needs_whiteout(struct bset *i, int v)
 {
        struct bkey_packed *k;
 
-       for (k = i->start; k != vstruct_last(i); k = bkey_next(k))
+       for (k = i->start; k != vstruct_last(i); k = bkey_p_next(k))
                k->needs_whiteout = v;
 }
 
@@ -175,7 +175,7 @@ static void bch2_sort_whiteouts(struct bch_fs *c, struct btree *b)
 
        for (k = unwritten_whiteouts_start(c, b);
             k != unwritten_whiteouts_end(c, b);
-            k = bkey_next(k))
+            k = bkey_p_next(k))
                *--ptrs = k;
 
        sort_bkey_ptrs(b, ptrs, ptrs_end - ptrs);
@@ -184,7 +184,7 @@ static void bch2_sort_whiteouts(struct bch_fs *c, struct btree *b)
 
        while (ptrs != ptrs_end) {
                bkey_copy(k, *ptrs);
-               k = bkey_next(k);
+               k = bkey_p_next(k);
                ptrs++;
        }
 
@@ -256,11 +256,11 @@ static bool bch2_drop_whiteouts(struct btree *b, enum compact_mode mode)
                out = i->start;
 
                for (k = start; k != end; k = n) {
-                       n = bkey_next(k);
+                       n = bkey_p_next(k);
 
                        if (!bkey_deleted(k)) {
                                bkey_copy(out, k);
-                               out = bkey_next(out);
+                               out = bkey_p_next(out);
                        } else {
                                BUG_ON(k->needs_whiteout);
                        }
@@ -652,7 +652,7 @@ void bch2_btree_node_drop_keys_outside_node(struct btree *b)
                struct bset *i = bset(b, t);
                struct bkey_packed *k;
 
-               for (k = i->start; k != vstruct_last(i); k = bkey_next(k))
+               for (k = i->start; k != vstruct_last(i); k = bkey_p_next(k))
                        if (bkey_cmp_left_packed(b, k, &b->data->min_key) >= 0)
                                break;
 
@@ -665,7 +665,7 @@ void bch2_btree_node_drop_keys_outside_node(struct btree *b)
                        set_btree_bset_end(b, t);
                }
 
-               for (k = i->start; k != vstruct_last(i); k = bkey_next(k))
+               for (k = i->start; k != vstruct_last(i); k = bkey_p_next(k))
                        if (bkey_cmp_left_packed(b, k, &b->data->max_key) > 0)
                                break;
 
@@ -843,7 +843,7 @@ static int validate_bset_keys(struct bch_fs *c, struct btree *b,
                struct bkey_s u;
                struct bkey tmp;
 
-               if (btree_err_on(bkey_next(k) > vstruct_last(i),
+               if (btree_err_on(bkey_p_next(k) > vstruct_last(i),
                                 BTREE_ERR_FIXABLE, c, NULL, b, i,
                                 "key extends past end of bset")) {
                        i->u64s = cpu_to_le16((u64 *) k - i->_data);
@@ -854,7 +854,7 @@ static int validate_bset_keys(struct bch_fs *c, struct btree *b,
                                 BTREE_ERR_FIXABLE, c, NULL, b, i,
                                 "invalid bkey format %u", k->format)) {
                        i->u64s = cpu_to_le16(le16_to_cpu(i->u64s) - k->u64s);
-                       memmove_u64s_down(k, bkey_next(k),
+                       memmove_u64s_down(k, bkey_p_next(k),
                                          (u64 *) vstruct_end(i) - (u64 *) k);
                        continue;
                }
@@ -878,7 +878,7 @@ static int validate_bset_keys(struct bch_fs *c, struct btree *b,
                        btree_err(BTREE_ERR_FIXABLE, c, NULL, b, i, "%s", buf.buf);
 
                        i->u64s = cpu_to_le16(le16_to_cpu(i->u64s) - k->u64s);
-                       memmove_u64s_down(k, bkey_next(k),
+                       memmove_u64s_down(k, bkey_p_next(k),
                                          (u64 *) vstruct_end(i) - (u64 *) k);
                        continue;
                }
@@ -901,14 +901,14 @@ static int validate_bset_keys(struct bch_fs *c, struct btree *b,
 
                        if (btree_err(BTREE_ERR_FIXABLE, c, NULL, b, i, "%s", buf.buf)) {
                                i->u64s = cpu_to_le16(le16_to_cpu(i->u64s) - k->u64s);
-                               memmove_u64s_down(k, bkey_next(k),
+                               memmove_u64s_down(k, bkey_p_next(k),
                                                  (u64 *) vstruct_end(i) - (u64 *) k);
                                continue;
                        }
                }
 
                prev = k;
-               k = bkey_next(k);
+               k = bkey_p_next(k);
        }
 fsck_err:
        printbuf_exit(&buf);
@@ -1139,7 +1139,7 @@ int bch2_btree_node_read_done(struct bch_fs *c, struct bch_dev *ca,
                        btree_keys_account_key_drop(&b->nr, 0, k);
 
                        i->u64s = cpu_to_le16(le16_to_cpu(i->u64s) - k->u64s);
-                       memmove_u64s_down(k, bkey_next(k),
+                       memmove_u64s_down(k, bkey_p_next(k),
                                          (u64 *) vstruct_end(i) - (u64 *) k);
                        set_btree_bset_end(b, b->set);
                        continue;
@@ -1151,7 +1151,7 @@ int bch2_btree_node_read_done(struct bch_fs *c, struct bch_dev *ca,
                        bp.v->mem_ptr = 0;
                }
 
-               k = bkey_next(k);
+               k = bkey_p_next(k);
        }
 
        bch2_bset_build_aux_tree(b, b->set, false);
index 1e692c0a2f3ade5058fcf46df9db4f862b0bb849..074c61f271d356982b0f37c930e468aca24f6942 100644 (file)
@@ -776,14 +776,14 @@ bool bch2_btree_insert_key_cached(struct btree_trans *trans,
        struct bkey_cached *ck = (void *) path->l[0].b;
        bool kick_reclaim = false;
 
-       BUG_ON(insert->u64s > ck->u64s);
+       BUG_ON(insert->k.u64s > ck->u64s);
 
        if (likely(!(flags & BTREE_INSERT_JOURNAL_REPLAY))) {
                int difference;
 
-               BUG_ON(jset_u64s(insert->u64s) > trans->journal_preres.u64s);
+               BUG_ON(jset_u64s(insert->k.u64s) > trans->journal_preres.u64s);
 
-               difference = jset_u64s(insert->u64s) - ck->res.u64s;
+               difference = jset_u64s(insert->k.u64s) - ck->res.u64s;
                if (difference > 0) {
                        trans->journal_preres.u64s      -= difference;
                        ck->res.u64s                    += difference;
index 9e77d2e3b421aebbc769b083aa2d32218f6f4c33..1db5ef4f2257a49ad8475a47993e43582114f332 100644 (file)
@@ -1413,7 +1413,7 @@ static void __btree_split_node(struct btree_update *as,
                out[i]->needs_whiteout = false;
 
                btree_keys_account_key_add(&n[i]->nr, 0, out[i]);
-               out[i] = bkey_next(out[i]);
+               out[i] = bkey_p_next(out[i]);
        }
 
        for (i = 0; i < 2; i++) {
@@ -2445,7 +2445,7 @@ bch2_btree_roots_to_journal_entries(struct bch_fs *c,
                                          BCH_JSET_ENTRY_btree_root,
                                          i, c->btree_roots[i].level,
                                          &c->btree_roots[i].key,
-                                         c->btree_roots[i].key.u64s);
+                                         c->btree_roots[i].key.k.u64s);
                        end = vstruct_next(end);
                }
 
index 8f43581f3972d283f847723459981ca7068d58fd..0035fe875a478d8b14a1c6ea0472083f22c5725a 100644 (file)
@@ -153,7 +153,7 @@ void __bch2_btree_verify(struct bch_fs *c, struct btree *b)
 
        BUG_ON(b->nsets != 1);
 
-       for (k = inmemory->start; k != vstruct_last(inmemory); k = bkey_next(k))
+       for (k = inmemory->start; k != vstruct_last(inmemory); k = bkey_p_next(k))
                if (k->type == KEY_TYPE_btree_ptr_v2) {
                        struct bch_btree_ptr_v2 *v = (void *) bkeyp_val(&b->format, k);
                        v->mem_ptr = 0;
index 2e37543a62291a8335106abefed72da047e57753..bac6a1ed2c599a945e915c23b0772c2221887012 100644 (file)
@@ -633,7 +633,7 @@ static inline void bch2_bkey_append_ptr(struct bkey_i *k, struct bch_extent_ptr
                memcpy((void *) &k->v + bkey_val_bytes(&k->k),
                       &ptr,
                       sizeof(ptr));
-               k->u64s++;
+               k->k.u64s++;
                break;
        default:
                BUG();
index dac0dad16f0ac50790af244cfd5458408d5c1d47..a7e09772895e8f9e8d2200fe3383f6cd717ae871 100644 (file)
@@ -733,7 +733,7 @@ static noinline int bch2_write_drop_io_error_ptrs(struct bch_write_op *op)
                }
 
                if (dst != src)
-                       memmove_u64s_down(dst, src, src->u64s);
+                       memmove_u64s_down(dst, src, src->k.u64s);
                dst = bkey_next(dst);
        }
 
index 377c071251833869c96c34f3aac80fdd3a6e85ff..51c26f9857d9d55f7ceae9118be0668e19c86ae7 100644 (file)
@@ -356,7 +356,7 @@ static void journal_entry_btree_keys_to_text(struct printbuf *out, struct bch_fs
        struct bkey_i *k;
        bool first = true;
 
-       vstruct_for_each(entry, k) {
+       jset_entry_for_each_key(entry, k) {
                if (!first) {
                        prt_newline(out);
                        prt_printf(out, "%s: ", bch2_jset_entry_types[entry->type]);
index a32c2876f2a65075e5803ce01c18aa9f29793aec..8801e98104bd8aaa9671b41f89ee4e904169388d 100644 (file)
@@ -40,9 +40,14 @@ static inline struct jset_entry *__jset_entry_type_next(struct jset *jset,
             (entry = __jset_entry_type_next(jset, entry, type));       \
             entry = vstruct_next(entry))
 
-#define for_each_jset_key(k, _n, entry, jset)                          \
-       for_each_jset_entry_type(entry, jset, BCH_JSET_ENTRY_btree_keys)        \
-               vstruct_for_each_safe(entry, k, _n)
+#define jset_entry_for_each_key(_e, _k)                                        \
+       for (_k = (_e)->start;                                          \
+            _k < vstruct_last(_e);                                     \
+            _k = bkey_next(_k))
+
+#define for_each_jset_key(k, entry, jset)                              \
+       for_each_jset_entry_type(entry, jset, BCH_JSET_ENTRY_btree_keys)\
+               jset_entry_for_each_key(entry, k)
 
 int bch2_journal_entry_validate(struct bch_fs *, struct jset *,
                                struct jset_entry *, unsigned, int, int);
index f5946b4dbce2b847dde77a1bb769d00957e3b1e5..aafe4054d25def18426fa42126bc13c902d8ebd8 100644 (file)
@@ -481,7 +481,7 @@ static int journal_keys_sort(struct bch_fs *c)
        struct genradix_iter iter;
        struct journal_replay *i, **_i;
        struct jset_entry *entry;
-       struct bkey_i *k, *_n;
+       struct bkey_i *k;
        struct journal_keys *keys = &c->journal_keys;
        struct journal_key *src, *dst;
        size_t nr_keys = 0;
@@ -492,7 +492,7 @@ static int journal_keys_sort(struct bch_fs *c)
                if (!i || i->ignore)
                        continue;
 
-               for_each_jset_key(k, _n, entry, &i->j)
+               for_each_jset_key(k, entry, &i->j)
                        nr_keys++;
        }
 
@@ -511,7 +511,7 @@ static int journal_keys_sort(struct bch_fs *c)
                if (!i || i->ignore)
                        continue;
 
-               for_each_jset_key(k, _n, entry, &i->j)
+               for_each_jset_key(k, entry, &i->j)
                        keys->d[keys->nr++] = (struct journal_key) {
                                .btree_id       = entry->btree_id,
                                .level          = entry->level,
@@ -871,7 +871,7 @@ static int verify_superblock_clean(struct bch_fs *c,
                                    IS_ERR(k1) ||
                                    IS_ERR(k2) ||
                                    k1->k.u64s != k2->k.u64s ||
-                                   memcmp(k1, k2, bkey_bytes(k1)) ||
+                                   memcmp(k1, k2, bkey_bytes(&k1->k)) ||
                                    l1 != l2, c,
                        "superblock btree root %u doesn't match journal after clean shutdown\n"
                        "sb:      l=%u %s\n"
index 87446f7bad4f81d2b0a71c60e32e20bf35dfb4a6..d2e6adc13fb17c519162cd55ddcd3e7c64e046c8 100644 (file)
@@ -233,7 +233,13 @@ static int bch2_make_extent_indirect(struct btree_trans *trans,
        orig->k.type = KEY_TYPE_reflink_p;
        r_p = bkey_i_to_reflink_p(orig);
        set_bkey_val_bytes(&r_p->k, sizeof(r_p->v));
+
+       /* FORTIFY_SOURCE is broken here, and doesn't provide unsafe_memset() */
+#if !defined(__NO_FORTIFY) && defined(__OPTIMIZE__) && defined(CONFIG_FORTIFY_SOURCE)
+       __underlying_memset(&r_p->v, 0, sizeof(r_p->v));
+#else
        memset(&r_p->v, 0, sizeof(r_p->v));
+#endif
 
        r_p->v.idx = cpu_to_le64(bkey_start_offset(&r_v->k));