]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
md/md-bitmap: add 'behind_writes' and 'behind_wait' into struct md_bitmap_stats
authorYu Kuai <yukuai3@huawei.com>
Mon, 26 Aug 2024 07:44:18 +0000 (15:44 +0800)
committerSong Liu <song@kernel.org>
Tue, 27 Aug 2024 17:14:15 +0000 (10:14 -0700)
There are no functional changes, avoid dereferencing bitmap directly to
prepare inventing a new bitmap.

Also fix following checkpatch warning by using wq_has_sleeper().

WARNING: waitqueue_active without comment

Signed-off-by: Yu Kuai <yukuai3@huawei.com>
Link: https://lore.kernel.org/r/20240826074452.1490072-9-yukuai1@huaweicloud.com
Signed-off-by: Song Liu <song@kernel.org>
drivers/md/md-bitmap.c
drivers/md/md-bitmap.h
drivers/md/raid1.c

index ba83b99d61857b96b368503b74936e09de4814a5..918510f36e33cb26e03d0721e4fdf9545d4be87a 100644 (file)
@@ -2115,6 +2115,8 @@ int md_bitmap_get_stats(struct bitmap *bitmap, struct md_bitmap_stats *stats)
        stats->file_pages = storage->file_pages;
        stats->file = storage->file;
 
+       stats->behind_writes = atomic_read(&bitmap->behind_writes);
+       stats->behind_wait = wq_has_sleeper(&bitmap->behind_wait);
        stats->events_cleared = bitmap->events_cleared;
        return 0;
 }
index 8701256700879bc95fe7630f576d89eb3f9ea550..909a661383c6950bc402482cc6535f1d6cd82185 100644 (file)
@@ -236,6 +236,9 @@ struct bitmap {
 
 struct md_bitmap_stats {
        u64             events_cleared;
+       int             behind_writes;
+       bool            behind_wait;
+
        unsigned long   missing_pages;
        unsigned long   file_pages;
        unsigned long   sync_size;
index 18aaa7247bba87ad29fd800035ace5c0598fba80..b6c4e44f9b4bae85beb6ef52e793fcafc13f386f 100644 (file)
@@ -1590,16 +1590,19 @@ static void raid1_write_request(struct mddev *mddev, struct bio *bio,
                        continue;
 
                if (first_clone) {
+                       unsigned long max_write_behind =
+                               mddev->bitmap_info.max_write_behind;
+                       struct md_bitmap_stats stats;
+                       int err;
+
                        /* do behind I/O ?
                         * Not if there are too many, or cannot
                         * allocate memory, or a reader on WriteMostly
                         * is waiting for behind writes to flush */
-                       if (bitmap && write_behind &&
-                           (atomic_read(&bitmap->behind_writes)
-                            < mddev->bitmap_info.max_write_behind) &&
-                           !waitqueue_active(&bitmap->behind_wait)) {
+                       err = md_bitmap_get_stats(bitmap, &stats);
+                       if (!err && write_behind && !stats.behind_wait &&
+                           stats.behind_writes < max_write_behind)
                                alloc_behind_master_bio(r1_bio, bio);
-                       }
 
                        md_bitmap_startwrite(bitmap, r1_bio->sector, r1_bio->sectors,
                                             test_bit(R1BIO_BehindIO, &r1_bio->state));