summaryrefslogtreecommitdiff
path: root/libbcachefs/extents.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2020-12-19 18:05:09 -0500
committerKent Overstreet <kent.overstreet@gmail.com>2020-12-19 18:05:09 -0500
commit80846e9c28e76774daf7d2d46115d73f108b98db (patch)
tree625f8757948c81571e6678279ddedc3c392862a2 /libbcachefs/extents.c
parentdb931a4571817d7d61be6bce306f1d42f7cd3398 (diff)
Update bcachefs sources to 5241335413 bcachefs: Fix for spinning in journal reclaim on startup
Diffstat (limited to 'libbcachefs/extents.c')
-rw-r--r--libbcachefs/extents.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/libbcachefs/extents.c b/libbcachefs/extents.c
index 7fae6a4b..828ccf07 100644
--- a/libbcachefs/extents.c
+++ b/libbcachefs/extents.c
@@ -1046,11 +1046,13 @@ static const char *extent_ptr_invalid(const struct bch_fs *c,
const char *bch2_bkey_ptrs_invalid(const struct bch_fs *c, struct bkey_s_c k)
{
struct bkey_ptrs_c ptrs = bch2_bkey_ptrs_c(k);
+ struct bch_devs_list devs;
const union bch_extent_entry *entry;
struct bch_extent_crc_unpacked crc;
unsigned size_ondisk = k.k->size;
const char *reason;
unsigned nonce = UINT_MAX;
+ unsigned i;
if (k.k->type == KEY_TYPE_btree_ptr)
size_ondisk = c->opts.btree_node_size;
@@ -1101,6 +1103,12 @@ const char *bch2_bkey_ptrs_invalid(const struct bch_fs *c, struct bkey_s_c k)
}
}
+ devs = bch2_bkey_devs(k);
+ bubble_sort(devs.devs, devs.nr, u8_cmp);
+ for (i = 0; i + 1 < devs.nr; i++)
+ if (devs.devs[i] == devs.devs[i + 1])
+ return "multiple ptrs to same device";
+
return NULL;
}