bcachefs: Fix bch2_extent_fallocate() in nocow mode
authorKent Overstreet <kent.overstreet@linux.dev>
Fri, 17 Mar 2023 14:56:44 +0000 (10:56 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:57 +0000 (17:09 -0400)
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>
fs/bcachefs/btree_update_interior.c
fs/bcachefs/io.c

index d64a86f3959529ebf76972185727264188f40918..a58d2a142b67106ff9e7bf0692dee4866bebbe95 100644 (file)
@@ -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;
 }
 
index e82da496b3f8ceb25c30efd1317d196a103cdd3d..0c2d42eaba56edb80517c7a77fda24cdf006b919 100644 (file)
@@ -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);