diff options
Diffstat (limited to 'fs/bcachefs/super.c')
-rw-r--r-- | fs/bcachefs/super.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/fs/bcachefs/super.c b/fs/bcachefs/super.c index b94bbca42446..f8e838196c29 100644 --- a/fs/bcachefs/super.c +++ b/fs/bcachefs/super.c @@ -165,6 +165,44 @@ static void bch2_dev_usage_journal_reserve(struct bch_fs *c) &c->dev_usage_journal_res, u64s * nr); } +int bch2_congested(void *data, int bdi_bits) +{ + struct bch_fs *c = data; + struct backing_dev_info *bdi; + struct bch_dev *ca; + unsigned i; + int ret = 0; + + rcu_read_lock(); + if (bdi_bits & (1 << WB_sync_congested)) { + /* Reads - check all devices: */ + for_each_readable_member(ca, c, i) { + bdi = ca->disk_sb.bdev->bd_bdi; + + if (bdi_congested(bdi, bdi_bits)) { + ret = 1; + break; + } + } + } else { + const struct bch_devs_mask *devs = + bch2_target_to_mask(c, c->opts.foreground_target) ?: + &c->rw_devs[BCH_DATA_user]; + + for_each_member_device_rcu(ca, c, i, devs) { + bdi = ca->disk_sb.bdev->bd_bdi; + + if (bdi_congested(bdi, bdi_bits)) { + ret = 1; + break; + } + } + } + rcu_read_unlock(); + + return ret; +} + /* Filesystem RO/RW: */ /* |