summaryrefslogtreecommitdiff
path: root/fs/bcachefs/buckets.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@linux.dev>2022-12-24 22:44:56 -0500
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-22 17:08:19 -0400
commit3a0e06db71f65ae0e7a98a1db170339d40abacdc (patch)
tree00173c5968a68efb4fdf8204b79a0fbb54ebb19b /fs/bcachefs/buckets.c
parentd5f70c1f2750f0917025ea6b1ee0591cd65a6097 (diff)
downloadlwn-3a0e06db71f65ae0e7a98a1db170339d40abacdc.tar.gz
lwn-3a0e06db71f65ae0e7a98a1db170339d40abacdc.zip
bcachefs: Assorted preemption fixes
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs/bcachefs/buckets.c')
-rw-r--r--fs/bcachefs/buckets.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/fs/bcachefs/buckets.c b/fs/bcachefs/buckets.c
index 2fbcd85d9e75..ecb0ca3f3a8f 100644
--- a/fs/bcachefs/buckets.c
+++ b/fs/bcachefs/buckets.c
@@ -393,14 +393,19 @@ void bch2_dev_usage_from_buckets(struct bch_fs *c, struct bch_dev *ca)
struct bucket_array *buckets;
struct bucket *g;
- percpu_down_read(&c->mark_lock);
+ /*
+ * This is only called during startup, before there's any multithreaded
+ * access to c->usage:
+ */
+ preempt_disable();
fs_usage = this_cpu_ptr(c->usage[0]);
+ preempt_enable();
+
buckets = bucket_array(ca);
for_each_bucket(g, buckets)
if (g->mark.data_type)
bch2_dev_usage_update(c, ca, fs_usage, old, g->mark, false);
- percpu_up_read(&c->mark_lock);
}
#define bucket_data_cmpxchg(c, ca, fs_usage, g, new, expr) \
@@ -513,8 +518,12 @@ void bch2_mark_alloc_bucket(struct bch_fs *c, struct bch_dev *ca,
size_t b, bool owned_by_allocator,
struct gc_pos pos, unsigned flags)
{
+ preempt_disable();
+
do_mark_fn(__bch2_mark_alloc_bucket, c, pos, flags,
ca, b, owned_by_allocator);
+
+ preempt_enable();
}
static int bch2_mark_alloc(struct bch_fs *c, struct bkey_s_c k,