mirror of
https://github.com/koverstreet/bcachefs-tools.git
synced 2025-02-23 00:00:02 +03:00
Update bcachefs sources to b47904df3c bcachefs: Clear BCH_FEATURE_extents_above_btree_updates on clean shutdown
This commit is contained in:
parent
2286a79ccb
commit
d488efb9d9
@ -1 +1 @@
|
||||
d9bb516b2d79fd1ad412e2c8e828182fe6e851c1
|
||||
b47904df3c6249c30213854bdeab003e64a09877
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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 */
|
||||
|
@ -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;
|
||||
return 0;
|
||||
|
||||
bkey_on_stack_init(&new);
|
||||
bch2_trans_init(&trans, c, 0, 0);
|
||||
retry:
|
||||
bch2_trans_begin(&trans);
|
||||
|
||||
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);
|
||||
k = bch2_btree_iter_peek_slot(iter);
|
||||
if (IS_ERR_OR_NULL(k.k))
|
||||
if ((ret = PTR_ERR_OR_ZERO(iter)))
|
||||
goto out;
|
||||
|
||||
bkey_on_stack_reassemble(&new, c, k);
|
||||
k = bkey_i_to_s_c(new.k);
|
||||
k = bch2_btree_iter_peek_slot(iter);
|
||||
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_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 */
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user