]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
md/raid5-cache: clear MD_SB_CHANGE_PENDING before flushing stripes
authorSong Liu <songliubraving@fb.com>
Mon, 6 Jul 2020 21:57:32 +0000 (14:57 -0700)
committerSong Liu <songliubraving@fb.com>
Wed, 15 Jul 2020 06:01:31 +0000 (23:01 -0700)
In recovery, if we process too much data, raid5-cache may set
MD_SB_CHANGE_PENDING, which causes spinning in handle_stripe().
Fix this issue by clearing the bit before flushing data only
stripes. This issue was initially discussed in [1].

[1] https://www.spinics.net/lists/raid/msg64409.html

Signed-off-by: Song Liu <songliubraving@fb.com>
drivers/md/raid5-cache.c

index 9b6da759dca25a4fafaa5cee26497138a33fa613..0bea21d81697e210a48a8e1dcab1e26349c8b6cf 100644 (file)
@@ -2430,10 +2430,15 @@ static void r5c_recovery_flush_data_only_stripes(struct r5l_log *log,
        struct mddev *mddev = log->rdev->mddev;
        struct r5conf *conf = mddev->private;
        struct stripe_head *sh, *next;
+       bool cleared_pending = false;
 
        if (ctx->data_only_stripes == 0)
                return;
 
+       if (test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags)) {
+               cleared_pending = true;
+               clear_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags);
+       }
        log->r5c_journal_mode = R5C_JOURNAL_MODE_WRITE_BACK;
 
        list_for_each_entry_safe(sh, next, &ctx->cached_list, lru) {
@@ -2448,6 +2453,8 @@ static void r5c_recovery_flush_data_only_stripes(struct r5l_log *log,
                   atomic_read(&conf->active_stripes) == 0);
 
        log->r5c_journal_mode = R5C_JOURNAL_MODE_WRITE_THROUGH;
+       if (cleared_pending)
+               set_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags);
 }
 
 static int r5l_recovery_log(struct r5l_log *log)