]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bcachefs: Disk space accounting fix on brand-new fs
authorKent Overstreet <kent.overstreet@gmail.com>
Mon, 15 Nov 2021 20:02:13 +0000 (15:02 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:17 +0000 (17:09 -0400)
The filesystem initialization path first marks superblock and journal
buckets non transactionally, since the btree isn't functional yet. That
path was updating the per-journal-buf percpu counters via
bch2_dev_usage_update(), and updating the wrong set of counters so those
updates didn't get written out until journal entry 4.

The relevant code is going to get significantly rewritten in the future
as we transition away from the in memory bucket array, so this just
hacks around it for now.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
fs/bcachefs/bcachefs.h
fs/bcachefs/buckets.c
fs/bcachefs/super-io.c

index 966e185201d1fcc8ac60dfb12992fc6b40c3c748..077d366961ff5b6671ba241af684620b72ba944d 100644 (file)
@@ -495,6 +495,7 @@ struct bch_dev {
 
 enum {
        /* startup: */
+       BCH_FS_INITIALIZED,
        BCH_FS_ALLOC_READ_DONE,
        BCH_FS_ALLOC_CLEAN,
        BCH_FS_ALLOCATOR_RUNNING,
index d4d41646b2e66ca825a7c969e544271fa3ec8183..c3387689fbb6c1eb429d818bf303e51984f137d9 100644 (file)
@@ -117,6 +117,8 @@ static inline struct bch_dev_usage *dev_usage_ptr(struct bch_dev *ca,
                                                  unsigned journal_seq,
                                                  bool gc)
 {
+       BUG_ON(!gc && !journal_seq);
+
        return this_cpu_ptr(gc
                            ? ca->usage_gc
                            : ca->usage[journal_seq & JOURNAL_BUF_MASK]);
@@ -142,6 +144,8 @@ static inline struct bch_fs_usage *fs_usage_ptr(struct bch_fs *c,
                                                unsigned journal_seq,
                                                bool gc)
 {
+       BUG_ON(!gc && !journal_seq);
+
        return this_cpu_ptr(gc
                            ? c->usage_gc
                            : c->usage[journal_seq & JOURNAL_BUF_MASK]);
@@ -364,6 +368,13 @@ static void bch2_dev_usage_update(struct bch_fs *c, struct bch_dev *ca,
        struct bch_fs_usage *fs_usage;
        struct bch_dev_usage *u;
 
+       /*
+        * Hack for bch2_fs_initialize path, where we're first marking sb and
+        * journal non-transactionally:
+        */
+       if (!journal_seq && !test_bit(BCH_FS_INITIALIZED, &c->flags))
+               journal_seq = 1;
+
        percpu_rwsem_assert_held(&c->mark_lock);
 
        preempt_disable();
index 637408d76270913f2499f89755feec4e729a7b81..3cc5d8ea743fc5b8d7e390edbbd0e7bef5910262 100644 (file)
@@ -447,8 +447,16 @@ int bch2_sb_to_fs(struct bch_fs *c, struct bch_sb *src)
 
        if (BCH_SB_HAS_ERRORS(c->disk_sb.sb))
                set_bit(BCH_FS_ERROR, &c->flags);
+       else
+               clear_bit(BCH_FS_ERROR, &c->flags);
+
        if (BCH_SB_HAS_TOPOLOGY_ERRORS(c->disk_sb.sb))
                set_bit(BCH_FS_TOPOLOGY_ERROR, &c->flags);
+       else
+               clear_bit(BCH_FS_TOPOLOGY_ERROR, &c->flags);
+
+       if (BCH_SB_INITIALIZED(c->disk_sb.sb))
+               set_bit(BCH_FS_INITIALIZED, &c->flags);
 
        ret = bch2_sb_replicas_to_cpu_replicas(c);
        if (ret)