From c8322ce68cf5e435f0a3b12569e89c77e7089eb6 Mon Sep 17 00:00:00 2001 From: Kent Overstreet Date: Tue, 27 Aug 2019 17:46:09 -0400 Subject: [PATCH] Update bcachefs sources to 4ed63a3241 bcachefs: Trust in memory bucket mark --- .bcachefs_revision | 2 +- libbcachefs/alloc_background.c | 14 -------------- libbcachefs/alloc_background.h | 14 ++++++++++++++ libbcachefs/buckets.c | 26 ++++++++++++++------------ 4 files changed, 29 insertions(+), 27 deletions(-) diff --git a/.bcachefs_revision b/.bcachefs_revision index 85472818..d90017fa 100644 --- a/.bcachefs_revision +++ b/.bcachefs_revision @@ -1 +1 @@ -14f68409bec43faff9d7480632488def385e0638 +4ed63a3241fa1e6d7610607be033ef08bef1a43e diff --git a/libbcachefs/alloc_background.c b/libbcachefs/alloc_background.c index 4cf728ce..8b06f51d 100644 --- a/libbcachefs/alloc_background.c +++ b/libbcachefs/alloc_background.c @@ -205,20 +205,6 @@ void bch2_alloc_to_text(struct printbuf *out, struct bch_fs *c, get_alloc_field(a.v, &d, i)); } -static inline struct bkey_alloc_unpacked -alloc_mem_to_key(struct bucket *g, struct bucket_mark m) -{ - return (struct bkey_alloc_unpacked) { - .gen = m.gen, - .oldest_gen = g->oldest_gen, - .data_type = m.data_type, - .dirty_sectors = m.dirty_sectors, - .cached_sectors = m.cached_sectors, - .read_time = g->io_time[READ], - .write_time = g->io_time[WRITE], - }; -} - int bch2_alloc_read(struct bch_fs *c, struct journal_keys *journal_keys) { struct btree_trans trans; diff --git a/libbcachefs/alloc_background.h b/libbcachefs/alloc_background.h index 0c1a0f0d..134c6d81 100644 --- a/libbcachefs/alloc_background.h +++ b/libbcachefs/alloc_background.h @@ -17,6 +17,20 @@ struct bkey_alloc_unpacked bch2_alloc_unpack(struct bkey_s_c); void bch2_alloc_pack(struct bkey_i_alloc *, const struct bkey_alloc_unpacked); +static inline struct bkey_alloc_unpacked +alloc_mem_to_key(struct bucket *g, struct bucket_mark m) +{ + return (struct bkey_alloc_unpacked) { + .gen = m.gen, + .oldest_gen = g->oldest_gen, + .data_type = m.data_type, + .dirty_sectors = m.dirty_sectors, + .cached_sectors = m.cached_sectors, + .read_time = g->io_time[READ], + .write_time = g->io_time[WRITE], + }; +} + #define ALLOC_SCAN_BATCH(ca) max_t(size_t, 1, (ca)->mi.nbuckets >> 9) const char *bch2_alloc_invalid(const struct bch_fs *, struct bkey_s_c); diff --git a/libbcachefs/buckets.c b/libbcachefs/buckets.c index 2bcf929a..fc3519bc 100644 --- a/libbcachefs/buckets.c +++ b/libbcachefs/buckets.c @@ -1361,7 +1361,7 @@ static int trans_get_key(struct btree_trans *trans, : !bkey_cmp(pos, i->iter->pos))) { *iter = i->iter; *k = bkey_i_to_s_c(i->k); - return 0; + return 1; } *iter = __bch2_trans_get_iter(trans, btree_id, pos, @@ -1416,6 +1416,8 @@ static int bch2_trans_mark_pointer(struct btree_trans *trans, struct bch_dev *ca = bch_dev_bkey_exists(c, p.ptr.dev); struct btree_iter *iter; struct bkey_s_c k; + struct bucket *g; + struct bucket_mark m; struct bkey_alloc_unpacked u; struct bkey_i_alloc *a; bool overflow; @@ -1424,19 +1426,19 @@ static int bch2_trans_mark_pointer(struct btree_trans *trans, ret = trans_get_key(trans, BTREE_ID_ALLOC, POS(p.ptr.dev, PTR_BUCKET_NR(ca, &p.ptr)), &iter, &k); - if (ret) + if (ret < 0) return ret; - if (k.k->type != KEY_TYPE_alloc) { - bch_err_ratelimited(c, "pointer to nonexistent bucket %u:%zu", - p.ptr.dev, - PTR_BUCKET_NR(ca, &p.ptr)); - ret = -1; - goto out; + if (!ret) { + percpu_down_read(&c->mark_lock); + g = bucket(ca, iter->pos.offset); + m = READ_ONCE(g->mark); + u = alloc_mem_to_key(g, m); + percpu_up_read(&c->mark_lock); + } else { + u = bch2_alloc_unpack(k); } - u = bch2_alloc_unpack(k); - if (gen_after(u.gen, p.ptr.gen)) { ret = 1; goto out; @@ -1484,7 +1486,7 @@ static int bch2_trans_mark_stripe_ptr(struct btree_trans *trans, int ret = 0; ret = trans_get_key(trans, BTREE_ID_EC, POS(0, p.idx), &iter, &k); - if (ret) + if (ret < 0) return ret; if (k.k->type != KEY_TYPE_stripe) { @@ -1599,7 +1601,7 @@ static int __bch2_trans_mark_reflink_p(struct btree_trans *trans, ret = trans_get_key(trans, BTREE_ID_REFLINK, POS(0, idx), &iter, &k); - if (ret) + if (ret < 0) return ret; if (k.k->type != KEY_TYPE_reflink_v) {