198 lines
7.3 KiB
Diff
198 lines
7.3 KiB
Diff
From bf924eff0e7b0dff40eee7d9237e382918022f6a Mon Sep 17 00:00:00 2001
|
|
From: Kent Overstreet <kent.overstreet@linux.dev>
|
|
Date: Thu, 31 Oct 2024 03:39:32 -0400
|
|
Subject: [PATCH 056/233] bcachefs: Kill BCH_TRANS_COMMIT_lazy_rw
|
|
Content-Type: text/plain; charset="utf-8"
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
We unconditionally go read-write, if we're going to do so, before
|
|
journal replay: lazy_rw is obsolete.
|
|
|
|
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
|
|
Signed-off-by: Alexander Miroshnichenko <alex@millerson.name>
|
|
---
|
|
fs/bcachefs/btree_gc.c | 2 +-
|
|
fs/bcachefs/btree_trans_commit.c | 31 +++++--------------------------
|
|
fs/bcachefs/btree_update.c | 3 +--
|
|
fs/bcachefs/btree_update.h | 1 -
|
|
fs/bcachefs/lru.c | 2 +-
|
|
fs/bcachefs/rebalance.c | 3 +--
|
|
fs/bcachefs/snapshot.c | 8 ++++++--
|
|
fs/bcachefs/subvolume.c | 2 +-
|
|
fs/bcachefs/super.h | 10 ----------
|
|
9 files changed, 16 insertions(+), 46 deletions(-)
|
|
|
|
diff --git a/fs/bcachefs/btree_gc.c b/fs/bcachefs/btree_gc.c
|
|
index 3c4e66da1ca4..833d743dee0c 100644
|
|
--- a/fs/bcachefs/btree_gc.c
|
|
+++ b/fs/bcachefs/btree_gc.c
|
|
@@ -908,7 +908,7 @@ static int bch2_gc_alloc_done(struct bch_fs *c)
|
|
POS(ca->dev_idx, ca->mi.first_bucket),
|
|
POS(ca->dev_idx, ca->mi.nbuckets - 1),
|
|
BTREE_ITER_slots|BTREE_ITER_prefetch, k,
|
|
- NULL, NULL, BCH_TRANS_COMMIT_lazy_rw,
|
|
+ NULL, NULL, BCH_TRANS_COMMIT_no_enospc,
|
|
bch2_alloc_write_key(trans, &iter, ca, k)));
|
|
if (ret) {
|
|
bch2_dev_put(ca);
|
|
diff --git a/fs/bcachefs/btree_trans_commit.c b/fs/bcachefs/btree_trans_commit.c
|
|
index 529a5a19ab8a..3aca746d08f6 100644
|
|
--- a/fs/bcachefs/btree_trans_commit.c
|
|
+++ b/fs/bcachefs/btree_trans_commit.c
|
|
@@ -971,24 +971,6 @@ int bch2_trans_commit_error(struct btree_trans *trans, unsigned flags,
|
|
return ret;
|
|
}
|
|
|
|
-static noinline int
|
|
-bch2_trans_commit_get_rw_cold(struct btree_trans *trans, unsigned flags)
|
|
-{
|
|
- struct bch_fs *c = trans->c;
|
|
- int ret;
|
|
-
|
|
- if (likely(!(flags & BCH_TRANS_COMMIT_lazy_rw)) ||
|
|
- test_bit(BCH_FS_started, &c->flags))
|
|
- return -BCH_ERR_erofs_trans_commit;
|
|
-
|
|
- ret = drop_locks_do(trans, bch2_fs_read_write_early(c));
|
|
- if (ret)
|
|
- return ret;
|
|
-
|
|
- bch2_write_ref_get(c, BCH_WRITE_REF_trans);
|
|
- return 0;
|
|
-}
|
|
-
|
|
/*
|
|
* This is for updates done in the early part of fsck - btree_gc - before we've
|
|
* gone RW. we only add the new key to the list of keys for journal replay to
|
|
@@ -1037,16 +1019,13 @@ int __bch2_trans_commit(struct btree_trans *trans, unsigned flags)
|
|
if (ret)
|
|
goto out_reset;
|
|
|
|
- if (unlikely(!test_bit(BCH_FS_may_go_rw, &c->flags))) {
|
|
- ret = do_bch2_trans_commit_to_journal_replay(trans);
|
|
- goto out_reset;
|
|
- }
|
|
-
|
|
if (!(flags & BCH_TRANS_COMMIT_no_check_rw) &&
|
|
unlikely(!bch2_write_ref_tryget(c, BCH_WRITE_REF_trans))) {
|
|
- ret = bch2_trans_commit_get_rw_cold(trans, flags);
|
|
- if (ret)
|
|
- goto out_reset;
|
|
+ if (unlikely(!test_bit(BCH_FS_may_go_rw, &c->flags)))
|
|
+ ret = do_bch2_trans_commit_to_journal_replay(trans);
|
|
+ else
|
|
+ ret = -BCH_ERR_erofs_trans_commit;
|
|
+ goto out_reset;
|
|
}
|
|
|
|
EBUG_ON(test_bit(BCH_FS_clean_shutdown, &c->flags));
|
|
diff --git a/fs/bcachefs/btree_update.c b/fs/bcachefs/btree_update.c
|
|
index 79a274dcd17b..a9a29fba4902 100644
|
|
--- a/fs/bcachefs/btree_update.c
|
|
+++ b/fs/bcachefs/btree_update.c
|
|
@@ -865,8 +865,7 @@ __bch2_fs_log_msg(struct bch_fs *c, unsigned commit_flags, const char *fmt,
|
|
memcpy(l->d, buf.buf, buf.pos);
|
|
c->journal.early_journal_entries.nr += jset_u64s(u64s);
|
|
} else {
|
|
- ret = bch2_trans_commit_do(c, NULL, NULL,
|
|
- BCH_TRANS_COMMIT_lazy_rw|commit_flags,
|
|
+ ret = bch2_trans_commit_do(c, NULL, NULL, commit_flags,
|
|
__bch2_trans_log_msg(trans, &buf, u64s));
|
|
}
|
|
err:
|
|
diff --git a/fs/bcachefs/btree_update.h b/fs/bcachefs/btree_update.h
|
|
index 7e71c4d1111d..3bc57d43aa83 100644
|
|
--- a/fs/bcachefs/btree_update.h
|
|
+++ b/fs/bcachefs/btree_update.h
|
|
@@ -24,7 +24,6 @@ void bch2_btree_insert_key_leaf(struct btree_trans *, struct btree_path *,
|
|
#define BCH_TRANS_COMMIT_FLAGS() \
|
|
x(no_enospc, "don't check for enospc") \
|
|
x(no_check_rw, "don't attempt to take a ref on c->writes") \
|
|
- x(lazy_rw, "go read-write if we haven't yet - only for use in recovery") \
|
|
x(no_journal_res, "don't take a journal reservation, instead " \
|
|
"pin journal entry referred to by trans->journal_res.seq") \
|
|
x(journal_reclaim, "operation required for journal reclaim; may return error" \
|
|
diff --git a/fs/bcachefs/lru.c b/fs/bcachefs/lru.c
|
|
index 10857eccdeaf..c18242748ca3 100644
|
|
--- a/fs/bcachefs/lru.c
|
|
+++ b/fs/bcachefs/lru.c
|
|
@@ -192,7 +192,7 @@ int bch2_check_lrus(struct bch_fs *c)
|
|
int ret = bch2_trans_run(c,
|
|
for_each_btree_key_commit(trans, iter,
|
|
BTREE_ID_lru, POS_MIN, BTREE_ITER_prefetch, k,
|
|
- NULL, NULL, BCH_TRANS_COMMIT_no_enospc|BCH_TRANS_COMMIT_lazy_rw,
|
|
+ NULL, NULL, BCH_TRANS_COMMIT_no_enospc,
|
|
bch2_check_lru_key(trans, &iter, k, &last_flushed)));
|
|
|
|
bch2_bkey_buf_exit(&last_flushed, c);
|
|
diff --git a/fs/bcachefs/rebalance.c b/fs/bcachefs/rebalance.c
|
|
index d1b580e76ba4..4adc74cd3f70 100644
|
|
--- a/fs/bcachefs/rebalance.c
|
|
+++ b/fs/bcachefs/rebalance.c
|
|
@@ -257,8 +257,7 @@ int bch2_set_rebalance_needs_scan_trans(struct btree_trans *trans, u64 inum)
|
|
int bch2_set_rebalance_needs_scan(struct bch_fs *c, u64 inum)
|
|
{
|
|
int ret = bch2_trans_commit_do(c, NULL, NULL,
|
|
- BCH_TRANS_COMMIT_no_enospc|
|
|
- BCH_TRANS_COMMIT_lazy_rw,
|
|
+ BCH_TRANS_COMMIT_no_enospc,
|
|
bch2_set_rebalance_needs_scan_trans(trans, inum));
|
|
rebalance_wakeup(c);
|
|
return ret;
|
|
diff --git a/fs/bcachefs/snapshot.c b/fs/bcachefs/snapshot.c
|
|
index 34e01bd8127f..6a52090485dc 100644
|
|
--- a/fs/bcachefs/snapshot.c
|
|
+++ b/fs/bcachefs/snapshot.c
|
|
@@ -1733,8 +1733,12 @@ void bch2_delete_dead_snapshots_work(struct work_struct *work)
|
|
|
|
void bch2_delete_dead_snapshots_async(struct bch_fs *c)
|
|
{
|
|
- if (bch2_write_ref_tryget(c, BCH_WRITE_REF_delete_dead_snapshots) &&
|
|
- !queue_work(c->write_ref_wq, &c->snapshot_delete_work))
|
|
+ if (!bch2_write_ref_tryget(c, BCH_WRITE_REF_delete_dead_snapshots))
|
|
+ return;
|
|
+
|
|
+ BUG_ON(!test_bit(BCH_FS_may_go_rw, &c->flags));
|
|
+
|
|
+ if (!queue_work(c->write_ref_wq, &c->snapshot_delete_work))
|
|
bch2_write_ref_put(c, BCH_WRITE_REF_delete_dead_snapshots);
|
|
}
|
|
|
|
diff --git a/fs/bcachefs/subvolume.c b/fs/bcachefs/subvolume.c
|
|
index 80e5efaff524..cb45ef769c54 100644
|
|
--- a/fs/bcachefs/subvolume.c
|
|
+++ b/fs/bcachefs/subvolume.c
|
|
@@ -675,7 +675,7 @@ static int __bch2_fs_upgrade_for_subvolumes(struct btree_trans *trans)
|
|
/* set bi_subvol on root inode */
|
|
int bch2_fs_upgrade_for_subvolumes(struct bch_fs *c)
|
|
{
|
|
- int ret = bch2_trans_commit_do(c, NULL, NULL, BCH_TRANS_COMMIT_lazy_rw,
|
|
+ int ret = bch2_trans_commit_do(c, NULL, NULL, BCH_TRANS_COMMIT_no_enospc,
|
|
__bch2_fs_upgrade_for_subvolumes(trans));
|
|
bch_err_fn(c, ret);
|
|
return ret;
|
|
diff --git a/fs/bcachefs/super.h b/fs/bcachefs/super.h
|
|
index dada09331d2e..fa6d52216510 100644
|
|
--- a/fs/bcachefs/super.h
|
|
+++ b/fs/bcachefs/super.h
|
|
@@ -34,16 +34,6 @@ void bch2_fs_read_only(struct bch_fs *);
|
|
int bch2_fs_read_write(struct bch_fs *);
|
|
int bch2_fs_read_write_early(struct bch_fs *);
|
|
|
|
-/*
|
|
- * Only for use in the recovery/fsck path:
|
|
- */
|
|
-static inline void bch2_fs_lazy_rw(struct bch_fs *c)
|
|
-{
|
|
- if (!test_bit(BCH_FS_rw, &c->flags) &&
|
|
- !test_bit(BCH_FS_was_rw, &c->flags))
|
|
- bch2_fs_read_write_early(c);
|
|
-}
|
|
-
|
|
void __bch2_fs_stop(struct bch_fs *);
|
|
void bch2_fs_free(struct bch_fs *);
|
|
void bch2_fs_stop(struct bch_fs *);
|
|
--
|
|
2.45.2
|
|
|