md/raid5: Make is_inactive_blocked() helper
authorLogan Gunthorpe <logang@deltatee.com>
Wed, 27 Jul 2022 21:05:57 +0000 (15:05 -0600)
committerJens Axboe <axboe@kernel.dk>
Wed, 3 Aug 2022 03:08:53 +0000 (21:08 -0600)
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>
drivers/md/raid5.c

index 97e8d4b..33a364e 100644 (file)
@@ -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;