]> git.sesse.net Git - bcachefs-tools-debian/commitdiff
Update bcachefs sources to b47904df3c bcachefs: Clear BCH_FEATURE_extents_above_btree...
authorKent Overstreet <kent.overstreet@gmail.com>
Tue, 17 Mar 2020 16:45:17 +0000 (12:45 -0400)
committerKent Overstreet <kent.overstreet@gmail.com>
Tue, 17 Mar 2020 16:45:17 +0000 (12:45 -0400)
.bcachefs_revision
libbcachefs/btree_update.h
libbcachefs/btree_update_leaf.c
libbcachefs/buckets.c
libbcachefs/extent_update.c
libbcachefs/fs-io.c
libbcachefs/io.c
libbcachefs/recovery.c
libbcachefs/super-io.c

index cc273031d5036a4de565fc2e998640cfa5a522ed..8a9d3c96b6fbc2ca5d82881b23273380726e500b 100644 (file)
@@ -1 +1 @@
-d9bb516b2d79fd1ad412e2c8e828182fe6e851c1
+b47904df3c6249c30213854bdeab003e64a09877
index 12127a33906b0137f644cd6803f8861f46fc3a88..9f58d47ef5d6abbecfaa703a9fc4e351ea298a86 100644 (file)
@@ -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,
index 389b5ee203c4e8fe334f9e00b6bbc08b15d4773f..7c2f72a3a725821226d59fcec7ee3e4d7cb5a1f1 100644 (file)
@@ -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;
index 4497c9840865f3a0b88422cdbb2eb25935badf16..2e1df04c760d931d840174fce1f7405226b1485c 100644 (file)
@@ -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;
index fa6c0698f38526606eca2930669e84482dda019c..beb3b694e33c2cabb79feffc8a501711d15cf841 100644 (file)
@@ -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;
 
index 92fa72cb32161d0754c723274dc90fc22c85eab8..ec46be3b646b7f153176d7660da679c427277bd9 100644 (file)
@@ -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 */
index 7312ab2a143588b6f9f72c05ce94b23aec55ff91..a8117c968878de22aef50370b78d5e87fc255e9f 100644 (file)
@@ -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 */
index 27378cc9cdd5e72db1b998e0607183c7862135ff..02b381cb567b38e484d4c6c6a3256371e576842e 100644 (file)
@@ -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;
index 43927853210a14a22899daf7710c659a6791dab7..56121e30f28d2fb897a8cca97c33465defa1a733 100644 (file)
@@ -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;