summaryrefslogtreecommitdiff
path: root/libbcachefs/extents.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2017-05-12 18:45:15 -0800
committerKent Overstreet <kent.overstreet@gmail.com>2017-05-12 23:14:24 -0800
commit565b4a74d6c25c78b0d2b82d9529595fc6269308 (patch)
tree3e4440a60c5f8519352ce5b6c587a7d1a79c4655 /libbcachefs/extents.c
parenta588eb0d9e30dffa4b319a4715c1454ee1d911f1 (diff)
Update bcachefs sources to 14e9ac5016 bcachefs: btree_iter fastpath
Diffstat (limited to 'libbcachefs/extents.c')
-rw-r--r--libbcachefs/extents.c31
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)
{