From d488efb9d941eae90faf8172c08a8e22181b9b41 Mon Sep 17 00:00:00 2001 From: Kent Overstreet Date: Tue, 17 Mar 2020 12:45:17 -0400 Subject: [PATCH] Update bcachefs sources to b47904df3c bcachefs: Clear BCH_FEATURE_extents_above_btree_updates on clean shutdown --- .bcachefs_revision | 2 +- libbcachefs/btree_update.h | 2 -- libbcachefs/btree_update_leaf.c | 6 ++-- libbcachefs/buckets.c | 9 ++--- libbcachefs/extent_update.c | 6 ++-- libbcachefs/fs-io.c | 7 ++-- libbcachefs/io.c | 60 +++++++++++++++++++-------------- libbcachefs/recovery.c | 2 -- libbcachefs/super-io.c | 2 ++ 9 files changed, 48 insertions(+), 48 deletions(-) diff --git a/.bcachefs_revision b/.bcachefs_revision index cc27303..8a9d3c9 100644 --- a/.bcachefs_revision +++ b/.bcachefs_revision @@ -1 +1 @@ -d9bb516b2d79fd1ad412e2c8e828182fe6e851c1 +b47904df3c6249c30213854bdeab003e64a09877 diff --git a/libbcachefs/btree_update.h b/libbcachefs/btree_update.h index 12127a3..9f58d47 100644 --- a/libbcachefs/btree_update.h +++ b/libbcachefs/btree_update.h @@ -12,8 +12,6 @@ void bch2_btree_node_lock_for_insert(struct bch_fs *, struct btree *, struct btree_iter *); bool bch2_btree_bset_insert_key(struct btree_iter *, struct btree *, struct btree_node_iter *, struct bkey_i *); -void bch2_btree_journal_key(struct btree_trans *, struct btree_iter *, - struct bkey_i *); enum btree_insert_flags { __BTREE_INSERT_NOUNLOCK, diff --git a/libbcachefs/btree_update_leaf.c b/libbcachefs/btree_update_leaf.c index 389b5ee..7c2f72a 100644 --- a/libbcachefs/btree_update_leaf.c +++ b/libbcachefs/btree_update_leaf.c @@ -166,9 +166,9 @@ static inline void __btree_journal_key(struct btree_trans *trans, *trans->journal_seq = seq; } -void bch2_btree_journal_key(struct btree_trans *trans, - struct btree_iter *iter, - struct bkey_i *insert) +static void bch2_btree_journal_key(struct btree_trans *trans, + struct btree_iter *iter, + struct bkey_i *insert) { struct bch_fs *c = trans->c; struct journal *j = &c->journal; diff --git a/libbcachefs/buckets.c b/libbcachefs/buckets.c index 4497c98..2e1df04 100644 --- a/libbcachefs/buckets.c +++ b/libbcachefs/buckets.c @@ -1335,8 +1335,7 @@ int bch2_mark_update(struct btree_trans *trans, !bkey_deleted(&insert->k)) return 0; - while ((_k = bch2_btree_node_iter_peek_filter(&node_iter, b, - KEY_TYPE_discard))) { + while ((_k = bch2_btree_node_iter_peek(&node_iter, b))) { struct bkey unpacked; struct bkey_s_c k = bkey_disassemble(b, _k, &unpacked); @@ -1382,8 +1381,7 @@ void bch2_trans_fs_usage_apply(struct btree_trans *trans, pr_err("overlapping with"); node_iter = iter->l[0].iter; - while ((_k = bch2_btree_node_iter_peek_filter(&node_iter, b, - KEY_TYPE_discard))) { + while ((_k = bch2_btree_node_iter_peek(&node_iter, b))) { struct bkey unpacked; struct bkey_s_c k; @@ -1795,8 +1793,7 @@ int bch2_trans_mark_update(struct btree_trans *trans, if (unlikely(flags & BTREE_TRIGGER_NOOVERWRITES)) return 0; - while ((_k = bch2_btree_node_iter_peek_filter(&node_iter, b, - KEY_TYPE_discard))) { + while ((_k = bch2_btree_node_iter_peek(&node_iter, b))) { struct bkey unpacked; struct bkey_s_c k; unsigned offset = 0; diff --git a/libbcachefs/extent_update.c b/libbcachefs/extent_update.c index fa6c069..beb3b69 100644 --- a/libbcachefs/extent_update.c +++ b/libbcachefs/extent_update.c @@ -120,8 +120,7 @@ int bch2_extent_atomic_end(struct btree_iter *iter, if (ret < 0) return ret; - while ((_k = bch2_btree_node_iter_peek_filter(&node_iter, b, - KEY_TYPE_discard))) { + while ((_k = bch2_btree_node_iter_peek(&node_iter, b))) { struct bkey unpacked; struct bkey_s_c k = bkey_disassemble(b, _k, &unpacked); unsigned offset = 0; @@ -182,8 +181,7 @@ bch2_extent_can_insert(struct btree_trans *trans, struct bkey unpacked; int sectors; - _k = bch2_btree_node_iter_peek_filter(&node_iter, l->b, - KEY_TYPE_discard); + _k = bch2_btree_node_iter_peek(&node_iter, l->b); if (!_k) return BTREE_INSERT_OK; diff --git a/libbcachefs/fs-io.c b/libbcachefs/fs-io.c index 92fa72c..ec46be3 100644 --- a/libbcachefs/fs-io.c +++ b/libbcachefs/fs-io.c @@ -1807,7 +1807,7 @@ static long bch2_dio_write_loop(struct dio_write *dio) struct bio_vec *bv; unsigned unaligned; u64 new_i_size; - bool sync; + bool sync = dio->sync; long ret; if (dio->loop) @@ -1855,7 +1855,7 @@ static long bch2_dio_write_loop(struct dio_write *dio) iov = kmalloc(dio->iter.nr_segs * sizeof(*iov), GFP_KERNEL); if (unlikely(!iov)) { - dio->sync = true; + dio->sync = sync = true; goto do_io; } @@ -1869,7 +1869,7 @@ do_io: dio->loop = true; closure_call(&dio->op.cl, bch2_write, NULL, NULL); - if (dio->sync) + if (sync) wait_for_completion(&dio->done); else return -EIOCBQUEUED; @@ -1903,7 +1903,6 @@ err: if (dio->free_iov) kfree(dio->iter.iov); - sync = dio->sync; bio_put(bio); /* inode->i_dio_count is our ref on inode and thus bch_fs */ diff --git a/libbcachefs/io.c b/libbcachefs/io.c index 7312ab2..a8117c9 100644 --- a/libbcachefs/io.c +++ b/libbcachefs/io.c @@ -1700,33 +1700,39 @@ static void bch2_rbio_error(struct bch_read_bio *rbio, int retry, } } -static void bch2_rbio_narrow_crcs(struct bch_read_bio *rbio) +static int __bch2_rbio_narrow_crcs(struct btree_trans *trans, + struct bch_read_bio *rbio) { struct bch_fs *c = rbio->c; - struct btree_trans trans; - struct btree_iter *iter; - struct bkey_s_c k; - struct bkey_on_stack new; - struct bch_extent_crc_unpacked new_crc; u64 data_offset = rbio->pos.offset - rbio->pick.crc.offset; - int ret; + struct bch_extent_crc_unpacked new_crc; + struct btree_iter *iter = NULL; + struct bkey_i *new; + struct bkey_s_c k; + int ret = 0; if (crc_is_compressed(rbio->pick.crc)) - return; - - bkey_on_stack_init(&new); - bch2_trans_init(&trans, c, 0, 0); -retry: - bch2_trans_begin(&trans); + return 0; - iter = bch2_trans_get_iter(&trans, BTREE_ID_EXTENTS, rbio->pos, + iter = bch2_trans_get_iter(trans, BTREE_ID_EXTENTS, rbio->pos, BTREE_ITER_SLOTS|BTREE_ITER_INTENT); + if ((ret = PTR_ERR_OR_ZERO(iter))) + goto out; + k = bch2_btree_iter_peek_slot(iter); - if (IS_ERR_OR_NULL(k.k)) + if ((ret = bkey_err(k))) + goto out; + + /* + * going to be temporarily appending another checksum entry: + */ + new = bch2_trans_kmalloc(trans, bkey_bytes(k.k) + + BKEY_EXTENT_U64s_MAX * 8); + if ((ret = PTR_ERR_OR_ZERO(new))) goto out; - bkey_on_stack_reassemble(&new, c, k); - k = bkey_i_to_s_c(new.k); + bkey_reassemble(new, k); + k = bkey_i_to_s_c(new); if (bversion_cmp(k.k->version, rbio->version) || !bch2_bkey_matches_ptr(c, k, rbio->pick.ptr, data_offset)) @@ -1742,21 +1748,23 @@ retry: bkey_start_offset(k.k) - data_offset, k.k->size, rbio->pick.crc.csum_type)) { bch_err(c, "error verifying existing checksum while narrowing checksum (memory corruption?)"); + ret = 0; goto out; } - if (!bch2_bkey_narrow_crcs(new.k, new_crc)) + if (!bch2_bkey_narrow_crcs(new, new_crc)) goto out; - bch2_trans_update(&trans, iter, new.k, 0); - ret = bch2_trans_commit(&trans, NULL, NULL, - BTREE_INSERT_NOFAIL| - BTREE_INSERT_NOWAIT); - if (ret == -EINTR) - goto retry; + bch2_trans_update(trans, iter, new, 0); out: - bch2_trans_exit(&trans); - bkey_on_stack_exit(&new, c); + bch2_trans_iter_put(trans, iter); + return ret; +} + +static noinline void bch2_rbio_narrow_crcs(struct bch_read_bio *rbio) +{ + bch2_trans_do(rbio->c, NULL, NULL, BTREE_INSERT_NOFAIL, + __bch2_rbio_narrow_crcs(&trans, rbio)); } /* Inner part that may run in process context */ diff --git a/libbcachefs/recovery.c b/libbcachefs/recovery.c index 27378cc..02b381c 100644 --- a/libbcachefs/recovery.c +++ b/libbcachefs/recovery.c @@ -805,8 +805,6 @@ int bch2_fs_recovery(struct bch_fs *c) goto err; } - c->disk_sb.sb->features[0] |= 1ULL << BCH_FEATURE_extents_above_btree_updates; - ret = journal_replay_early(c, clean, &journal_entries); if (ret) goto err; diff --git a/libbcachefs/super-io.c b/libbcachefs/super-io.c index 4392785..56121e3 100644 --- a/libbcachefs/super-io.c +++ b/libbcachefs/super-io.c @@ -956,6 +956,7 @@ int bch2_fs_mark_dirty(struct bch_fs *c) mutex_lock(&c->sb_lock); SET_BCH_SB_CLEAN(c->disk_sb.sb, false); c->disk_sb.sb->compat[0] &= ~(1ULL << BCH_COMPAT_FEAT_ALLOC_METADATA); + c->disk_sb.sb->features[0] |= 1ULL << BCH_FEATURE_extents_above_btree_updates; ret = bch2_write_super(c); mutex_unlock(&c->sb_lock); @@ -1086,6 +1087,7 @@ void bch2_fs_mark_clean(struct bch_fs *c) c->disk_sb.sb->compat[0] |= 1ULL << BCH_COMPAT_FEAT_ALLOC_INFO; c->disk_sb.sb->compat[0] |= 1ULL << BCH_COMPAT_FEAT_ALLOC_METADATA; + c->disk_sb.sb->features[0] &= ~(1ULL << BCH_FEATURE_extents_above_btree_updates); u64s = sizeof(*sb_clean) / sizeof(u64) + c->journal.entry_u64s_reserved; -- 2.39.2