bcachefs: for_each_rw_member_rcu()
authorKent Overstreet <kent.overstreet@linux.dev>
Sat, 19 Apr 2025 23:13:40 +0000 (19:13 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Thu, 22 May 2025 00:14:27 +0000 (20:14 -0400)
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/alloc_background.c
fs/bcachefs/journal.c
fs/bcachefs/journal_io.c
fs/bcachefs/journal_reclaim.c
fs/bcachefs/movinggc.c
fs/bcachefs/sb-members.h

index 0494d188605f10134eec9a591a8ce41f0bcd9c4d..195d20220b7dd790038bcdb98af7c1072ed65a2a 100644 (file)
@@ -2575,8 +2575,10 @@ u64 bch2_min_rw_member_capacity(struct bch_fs *c)
 {
        u64 ret = U64_MAX;
 
-       for_each_rw_member(c, ca)
+       rcu_read_lock();
+       for_each_rw_member_rcu(c, ca)
                ret = min(ret, ca->mi.nbuckets * ca->mi.bucket_size);
+       rcu_read_unlock();
        return ret;
 }
 
@@ -2600,8 +2602,12 @@ static bool bch2_dev_has_open_write_point(struct bch_fs *c, struct bch_dev *ca)
 
 void bch2_dev_allocator_set_rw(struct bch_fs *c, struct bch_dev *ca, bool rw)
 {
+       /* BCH_DATA_free == all rw devs */
+
        for (unsigned i = 0; i < ARRAY_SIZE(c->rw_devs); i++)
-               if (rw && (ca->mi.data_allowed & BIT(i)))
+               if (rw &&
+                   (i == BCH_DATA_free ||
+                    (ca->mi.data_allowed & BIT(i))))
                        set_bit(ca->dev_idx, c->rw_devs[i].d);
                else
                        clear_bit(ca->dev_idx, c->rw_devs[i].d);
index 3694b83af8cc2a009596b8b37b4a79a4b4f27e31..e1cd6e8e37cf08b1fc88fe63a8927fc88482a990 100644 (file)
@@ -699,8 +699,10 @@ static unsigned max_dev_latency(struct bch_fs *c)
 {
        u64 nsecs = 0;
 
-       for_each_rw_member(c, ca)
+       rcu_read_lock();
+       for_each_rw_member_rcu(c, ca)
                nsecs = max(nsecs, ca->io_latency[WRITE].stats.max_duration);
+       rcu_read_unlock();
 
        return nsecs_to_jiffies(nsecs);
 }
index 28fa381cd58924274941c9228c3b3b4c912f2b25..438ad32ba242b4a4d9472273aa96f947245885d5 100644 (file)
@@ -2055,12 +2055,9 @@ CLOSURE_CALLBACK(bch2_journal_write)
        struct journal *j = container_of(w, struct journal, buf[w->idx]);
        struct bch_fs *c = container_of(j, struct bch_fs, journal);
        struct bch_replicas_padded replicas;
-       unsigned nr_rw_members = 0;
+       unsigned nr_rw_members = dev_mask_nr(&c->rw_devs[BCH_DATA_journal]);
        int ret;
 
-       for_each_rw_member(c, ca)
-               nr_rw_members++;
-
        BUG_ON(BCH_SB_CLEAN(c->disk_sb.sb));
        BUG_ON(!w->write_started);
        BUG_ON(w->write_allocated);
index fd7a140c9fd68294a090220b862c5aae916493fd..dc8169a970dd7da2b5a7fc3da34105c813110888 100644 (file)
@@ -627,7 +627,8 @@ static u64 journal_seq_to_flush(struct journal *j)
 
        spin_lock(&j->lock);
 
-       for_each_rw_member(c, ca) {
+       rcu_read_lock();
+       for_each_rw_member_rcu(c, ca) {
                struct journal_device *ja = &ca->journal;
                unsigned nr_buckets, bucket_to_flush;
 
@@ -641,6 +642,7 @@ static u64 journal_seq_to_flush(struct journal *j)
                seq_to_flush = max(seq_to_flush,
                                   ja->bucket_seq[bucket_to_flush]);
        }
+       rcu_read_unlock();
 
        /* Also flush if the pin fifo is more than half full */
        seq_to_flush = max_t(s64, seq_to_flush,
index 96873372b51600f367d5a1710b17abeef828eabb..e97e87ebe312bef0cd5f775c79b8108d49bc51e9 100644 (file)
@@ -279,7 +279,8 @@ unsigned long bch2_copygc_wait_amount(struct bch_fs *c)
 {
        s64 wait = S64_MAX, fragmented_allowed, fragmented;
 
-       for_each_rw_member(c, ca) {
+       rcu_read_lock();
+       for_each_rw_member_rcu(c, ca) {
                struct bch_dev_usage_full usage_full = bch2_dev_usage_full_read(ca);
                struct bch_dev_usage usage;
 
@@ -296,6 +297,7 @@ unsigned long bch2_copygc_wait_amount(struct bch_fs *c)
 
                wait = min(wait, max(0LL, fragmented_allowed - fragmented));
        }
+       rcu_read_unlock();
 
        return wait;
 }
index 28c6fc25c32cf4d5ad8dd0cab251696d8ea25a95..c71a1ba6152542343c21db8fbe6a8d076417d10b 100644 (file)
@@ -107,6 +107,9 @@ static inline struct bch_dev *__bch2_next_dev(struct bch_fs *c, struct bch_dev *
 #define for_each_online_member_rcu(_c, _ca)                            \
        for_each_member_device_rcu(_c, _ca, &(_c)->online_devs)
 
+#define for_each_rw_member_rcu(_c, _ca)                                        \
+       for_each_member_device_rcu(_c, _ca, &(_c)->rw_devs[BCH_DATA_free])
+
 static inline void bch2_dev_get(struct bch_dev *ca)
 {
 #ifdef CONFIG_BCACHEFS_DEBUG