Commit c714614b authored by Kent Overstreet's avatar Kent Overstreet Committed by Kent Overstreet
Browse files

bcachefs: Disk space accounting fix on brand-new fs



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: default avatarKent Overstreet <kent.overstreet@gmail.com>
parent 0a84a066
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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,
+11 −0
Original line number Diff line number Diff line
@@ -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();
+8 −0
Original line number Diff line number Diff line
@@ -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)