diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2017-05-12 18:45:15 -0800 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2017-05-12 23:14:24 -0800 |
commit | 565b4a74d6c25c78b0d2b82d9529595fc6269308 (patch) | |
tree | 3e4440a60c5f8519352ce5b6c587a7d1a79c4655 /libbcachefs/extents.c | |
parent | a588eb0d9e30dffa4b319a4715c1454ee1d911f1 (diff) |
Update bcachefs sources to 14e9ac5016 bcachefs: btree_iter fastpath
Diffstat (limited to 'libbcachefs/extents.c')
-rw-r--r-- | libbcachefs/extents.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/libbcachefs/extents.c b/libbcachefs/extents.c index 74d54ab1..1b0e3da1 100644 --- a/libbcachefs/extents.c +++ b/libbcachefs/extents.c @@ -153,6 +153,37 @@ unsigned bch2_extent_nr_dirty_ptrs(struct bkey_s_c k) return nr_ptrs; } +/* Doesn't cleanup redundant crcs */ +void __bch2_extent_drop_ptr(struct bkey_s_extent e, struct bch_extent_ptr *ptr) +{ + EBUG_ON(ptr < &e.v->start->ptr || + ptr >= &extent_entry_last(e)->ptr); + EBUG_ON(ptr->type != 1 << BCH_EXTENT_ENTRY_ptr); + memmove_u64s_down(ptr, ptr + 1, + (u64 *) extent_entry_last(e) - (u64 *) (ptr + 1)); + e.k->u64s -= sizeof(*ptr) / sizeof(u64); +} + +void bch2_extent_drop_ptr(struct bkey_s_extent e, struct bch_extent_ptr *ptr) +{ + __bch2_extent_drop_ptr(e, ptr); + bch2_extent_drop_redundant_crcs(e); +} + +void bch2_extent_drop_ptr_idx(struct bkey_s_extent e, unsigned idx) +{ + struct bch_extent_ptr *ptr; + unsigned i = 0; + + extent_for_each_ptr(e, ptr) + if (i++ == idx) + goto found; + + BUG(); +found: + bch2_extent_drop_ptr(e, ptr); +} + /* returns true if equal */ static bool crc_cmp(union bch_extent_crc *l, union bch_extent_crc *r) { |