diff options
author | Kent Overstreet <kent.overstreet@linux.dev> | 2022-12-24 22:44:56 -0500 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-10-22 17:08:19 -0400 |
commit | 3a0e06db71f65ae0e7a98a1db170339d40abacdc (patch) | |
tree | 00173c5968a68efb4fdf8204b79a0fbb54ebb19b /fs/bcachefs/buckets.c | |
parent | d5f70c1f2750f0917025ea6b1ee0591cd65a6097 (diff) | |
download | lwn-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.c | 13 |
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, |