]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/super-io.c
Update bcachefs sources to 5241335413 bcachefs: Fix for spinning in journal reclaim...
[bcachefs-tools-debian] / libbcachefs / super-io.c
index daaeaf0446a3958153f2f8883499fc2cc9285c97..78835bd2d6bc4e0c95c96f68d9d318eef47652e6 100644 (file)
@@ -1,6 +1,7 @@
 // SPDX-License-Identifier: GPL-2.0
 
 #include "bcachefs.h"
+#include "btree_update_interior.h"
 #include "buckets.h"
 #include "checksum.h"
 #include "disk_groups.h"
@@ -51,7 +52,9 @@ static struct bch_sb_field *__bch2_sb_field_resize(struct bch_sb_handle *sb,
        BUG_ON(get_order(__vstruct_bytes(struct bch_sb, sb_u64s)) >
               sb->page_order);
 
-       if (!f) {
+       if (!f && !u64s) {
+               /* nothing to do: */
+       } else if (!f) {
                f = vstruct_last(sb->sb);
                memset(f, 0, sizeof(u64) * u64s);
                f->u64s = cpu_to_le32(u64s);
@@ -611,9 +614,6 @@ got_super:
            bdev_logical_block_size(sb->bdev))
                goto err;
 
-       if (sb->mode & FMODE_WRITE)
-               bdev_get_queue(sb->bdev)->backing_dev_info->capabilities
-                       |= BDI_CAP_STABLE_WRITES;
        ret = 0;
        sb->have_layout = true;
 out:
@@ -633,7 +633,8 @@ static void write_super_endio(struct bio *bio)
 
        /* XXX: return errors directly */
 
-       if (bch2_dev_io_err_on(bio->bi_status, ca, "superblock write"))
+       if (bch2_dev_io_err_on(bio->bi_status, ca, "superblock write error: %s",
+                              bch2_blk_status_to_str(bio->bi_status)))
                ca->sb_write_error = 1;
 
        closure_put(&ca->fs->sb_write);
@@ -653,7 +654,7 @@ static void read_back_super(struct bch_fs *c, struct bch_dev *ca)
        bio_set_op_attrs(bio, REQ_OP_READ, REQ_SYNC|REQ_META);
        bch2_bio_map(bio, ca->sb_read_scratch, PAGE_SIZE);
 
-       this_cpu_add(ca->io_done->sectors[READ][BCH_DATA_SB],
+       this_cpu_add(ca->io_done->sectors[READ][BCH_DATA_sb],
                     bio_sectors(bio));
 
        percpu_ref_get(&ca->io_ref);
@@ -681,7 +682,7 @@ static void write_one_super(struct bch_fs *c, struct bch_dev *ca, unsigned idx)
                     roundup((size_t) vstruct_bytes(sb),
                             bdev_logical_block_size(ca->disk_sb.bdev)));
 
-       this_cpu_add(ca->io_done->sectors[WRITE][BCH_DATA_SB],
+       this_cpu_add(ca->io_done->sectors[WRITE][BCH_DATA_sb],
                     bio_sectors(bio));
 
        percpu_ref_get(&ca->io_ref);
@@ -953,7 +954,9 @@ 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_new_extent_overwrite;
+       c->disk_sb.sb->features[0] |= 1ULL << BCH_FEATURE_extents_above_btree_updates;
+       c->disk_sb.sb->features[0] |= 1ULL << BCH_FEATURE_btree_updates_journalled;
        ret = bch2_write_super(c);
        mutex_unlock(&c->sb_lock);
 
@@ -984,34 +987,15 @@ bch2_journal_super_entries_add_common(struct bch_fs *c,
                                      struct jset_entry *entry,
                                      u64 journal_seq)
 {
-       struct btree_root *r;
        unsigned i;
 
-       mutex_lock(&c->btree_root_lock);
-
-       for (r = c->btree_roots;
-            r < c->btree_roots + BTREE_ID_NR;
-            r++)
-               if (r->alive) {
-                       entry_init_u64s(entry, r->key.u64s + 1);
-                       entry->btree_id = r - c->btree_roots;
-                       entry->level    = r->level;
-                       entry->type     = BCH_JSET_ENTRY_btree_root;
-                       bkey_copy(&entry->start[0], &r->key);
-
-                       entry = vstruct_next(entry);
-               }
-       c->btree_roots_dirty = false;
-
-       mutex_unlock(&c->btree_root_lock);
-
        percpu_down_write(&c->mark_lock);
 
        if (!journal_seq) {
-               bch2_fs_usage_acc_to_base(c, 0);
-               bch2_fs_usage_acc_to_base(c, 1);
+               for (i = 0; i < ARRAY_SIZE(c->usage); i++)
+                       bch2_fs_usage_acc_to_base(c, i);
        } else {
-               bch2_fs_usage_acc_to_base(c, journal_seq & 1);
+               bch2_fs_usage_acc_to_base(c, journal_seq & JOURNAL_BUF_MASK);
        }
 
        {
@@ -1084,6 +1068,8 @@ 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);
+       c->disk_sb.sb->features[0] &= ~(1ULL << BCH_FEATURE_btree_updates_journalled);
 
        u64s = sizeof(*sb_clean) / sizeof(u64) + c->journal.entry_u64s_reserved;
 
@@ -1103,6 +1089,7 @@ void bch2_fs_mark_clean(struct bch_fs *c)
 
        entry = sb_clean->start;
        entry = bch2_journal_super_entries_add_common(c, entry, 0);
+       entry = bch2_btree_roots_to_journal_entries(c, entry, entry);
        BUG_ON((void *) entry > vstruct_end(&sb_clean->field));
 
        memset(entry, 0,