diff options
author | Logan Gunthorpe <logang@deltatee.com> | 2022-07-27 15:05:57 -0600 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2022-08-02 21:08:53 -0600 |
commit | 3514da58be9c40b4e377d73a21a56e89145f2843 (patch) | |
tree | 2df3e6869aa35681993d66bbde7999c7394d96a8 /drivers/md | |
parent | 5165ed40a1f0a3bf03526aad96df736556fbe64f (diff) |
md/raid5: Make is_inactive_blocked() helper
The logic to wait_for_stripe is difficult to parse being on so many
lines and with confusing operator precedence. Move it to a helper
function to make it easier to read.
No functional changes intended.
Signed-off-by: Logan Gunthorpe <logang@deltatee.com>
Signed-off-by: Song Liu <song@kernel.org>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'drivers/md')
-rw-r--r-- | drivers/md/raid5.c | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 97e8d4baf3fc..33a364ee6b20 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -755,6 +755,24 @@ static bool has_failed(struct r5conf *conf) return degraded > conf->max_degraded; } +/* + * Block until another thread clears R5_INACTIVE_BLOCKED or + * there are fewer than 3/4 the maximum number of active stripes + * and there is an inactive stripe available. + */ +static bool is_inactive_blocked(struct r5conf *conf, int hash) +{ + int active = atomic_read(&conf->active_stripes); + + if (list_empty(conf->inactive_list + hash)) + return false; + + if (!test_bit(R5_INACTIVE_BLOCKED, &conf->cache_state)) + return true; + + return active < (conf->max_nr_stripes * 3 / 4); +} + struct stripe_head * raid5_get_active_stripe(struct r5conf *conf, sector_t sector, int previous, int noblock, int noquiesce) @@ -796,11 +814,7 @@ wait_for_stripe: set_bit(R5_INACTIVE_BLOCKED, &conf->cache_state); r5l_wake_reclaim(conf->log, 0); wait_event_lock_irq(conf->wait_for_stripe, - !list_empty(conf->inactive_list + hash) && - (atomic_read(&conf->active_stripes) - < (conf->max_nr_stripes * 3 / 4) - || !test_bit(R5_INACTIVE_BLOCKED, - &conf->cache_state)), + is_inactive_blocked(conf, hash), *(conf->hash_locks + hash)); clear_bit(R5_INACTIVE_BLOCKED, &conf->cache_state); goto retry; |