summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/bcachefs/disk_groups.h8
-rw-r--r--fs/bcachefs/rebalance.c3
2 files changed, 10 insertions, 1 deletions
diff --git a/fs/bcachefs/disk_groups.h b/fs/bcachefs/disk_groups.h
index bf39db3868bf..ec12584ceee7 100644
--- a/fs/bcachefs/disk_groups.h
+++ b/fs/bcachefs/disk_groups.h
@@ -68,6 +68,14 @@ static inline struct bch_devs_mask target_rw_devs(struct bch_fs *c,
return devs;
}
+static inline bool bch2_target_accepts_data(struct bch_fs *c,
+ enum bch_data_type data_type,
+ u16 target)
+{
+ struct bch_devs_mask rw_devs = target_rw_devs(c, data_type, target);
+ return !bitmap_empty(rw_devs.d, BCH_SB_MEMBERS_MAX);
+}
+
bool bch2_dev_in_target(struct bch_fs *, unsigned, unsigned);
int bch2_disk_path_find(struct bch_sb_handle *, const char *);
diff --git a/fs/bcachefs/rebalance.c b/fs/bcachefs/rebalance.c
index 66c40999163d..989f37a3b46a 100644
--- a/fs/bcachefs/rebalance.c
+++ b/fs/bcachefs/rebalance.c
@@ -57,7 +57,8 @@ static bool rebalance_pred(struct bch_fs *c, void *arg,
i = 0;
bkey_for_each_ptr(ptrs, ptr) {
if (!ptr->cached &&
- !bch2_dev_in_target(c, ptr->dev, io_opts->background_target))
+ !bch2_dev_in_target(c, ptr->dev, io_opts->background_target) &&
+ bch2_target_accepts_data(c, BCH_DATA_user, io_opts->background_target))
data_opts->rewrite_ptrs |= 1U << i;
i++;
}