diff options
author | Kent Overstreet <kent.overstreet@linux.dev> | 2023-03-17 10:56:44 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-10-22 17:09:57 -0400 |
commit | abab7609de92c973bfa3ad069a622c0a107b6386 (patch) | |
tree | 699235cb3fa6e053a3b7fe6d47a833c228a9ce03 | |
parent | 711bf946d55d28336dcc4f87209c8b74e6279481 (diff) | |
download | lwn-abab7609de92c973bfa3ad069a622c0a107b6386.tar.gz lwn-abab7609de92c973bfa3ad069a622c0a107b6386.zip |
bcachefs: Fix bch2_extent_fallocate() in nocow mode
When we allocate disk space, we need to be incrementing the WRITE io
clock, which perhaps should be renamed to sectors allocated - copygc
uses this io clock to know when to run.
Also, we should be incrementing the same clock when allocating btree
nodes.
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
-rw-r--r-- | fs/bcachefs/btree_update_interior.c | 2 | ||||
-rw-r--r-- | fs/bcachefs/io.c | 7 |
2 files changed, 9 insertions, 0 deletions
diff --git a/fs/bcachefs/btree_update_interior.c b/fs/bcachefs/btree_update_interior.c index d64a86f39595..a58d2a142b67 100644 --- a/fs/bcachefs/btree_update_interior.c +++ b/fs/bcachefs/btree_update_interior.c @@ -11,6 +11,7 @@ #include "btree_iter.h" #include "btree_locking.h" #include "buckets.h" +#include "clock.h" #include "error.h" #include "extents.h" #include "journal.h" @@ -363,6 +364,7 @@ static struct btree *bch2_btree_node_alloc(struct btree_update *as, BUG_ON(ret); trace_and_count(c, btree_node_alloc, c, b); + bch2_increment_clock(c, btree_sectors(c), WRITE); return b; } diff --git a/fs/bcachefs/io.c b/fs/bcachefs/io.c index e82da496b3f8..0c2d42eaba56 100644 --- a/fs/bcachefs/io.c +++ b/fs/bcachefs/io.c @@ -384,6 +384,7 @@ int bch2_extent_fallocate(struct btree_trans *trans, struct open_buckets open_buckets; struct bkey_s_c k; struct bkey_buf old, new; + unsigned sectors_allocated; bool have_reservation = false; bool unwritten = opts.nocow && c->sb.version >= bcachefs_metadata_version_unwritten_extents; @@ -394,6 +395,8 @@ int bch2_extent_fallocate(struct btree_trans *trans, closure_init_stack(&cl); open_buckets.nr = 0; retry: + sectors_allocated = 0; + k = bch2_btree_iter_peek_slot(iter); ret = bkey_err(k); if (ret) @@ -459,6 +462,7 @@ retry: return ret; sectors = min(sectors, wp->sectors_free); + sectors_allocated = sectors; bch2_key_resize(&e->k, sectors); @@ -485,6 +489,9 @@ out: goto retry; } + if (!ret && sectors_allocated) + bch2_increment_clock(c, sectors_allocated, WRITE); + bch2_open_buckets_put(c, &open_buckets); bch2_disk_reservation_put(c, &disk_res); bch2_bkey_buf_exit(&new, c); |