• Yu Kuai's avatar
    md/raid1: fix choose next idle in read_balance() · 257ac239
    Yu Kuai authored
    Commit 12cee5a8 ("md/raid1: prevent merging too large request") add
    the case choose next idle in read_balance():
    
    read_balance:
     for_each_rdev
      if(next_seq_sect == this_sector || dist == 0)
      -> sequential reads
       best_disk = disk;
       if (...)
        choose_next_idle = 1
        continue;
    
     for_each_rdev
     -> iterate next rdev
      if (pending == 0)
       best_disk = disk;
       -> choose the next idle disk
       break;
    
      if (choose_next_idle)
       -> keep using this rdev if there are no other idle disk
       contine
    
    However, commit 2e52d449 ("md/raid1: add failfast handling for reads.")
    remove the code:
    
    -               /* If device is idle, use it */
    -               if (pending == 0) {
    -                       best_disk = disk;
    -                       break;
    -               }
    
    Hence choose next idle will never work now, fix this problem by
    following:
    
    1) don't set best_disk in this case, read_balance() will choose the best
       disk after iterating all the disks;
    2) add 'pending' so that other idle disk will be chosen;
    3) add a new local variable 'sequential_disk' to record the disk, and if
       there is no other idle disk, 'sequential_disk' will be chosen;
    
    Fixes: 2e52d449 ("md/raid1: add failfast handling for reads.")
    Co-developed-by: default avatarPaul Luse <paul.e.luse@linux.intel.com>
    Signed-off-by: default avatarPaul Luse <paul.e.luse@linux.intel.com>
    Signed-off-by: default avatarYu Kuai <yukuai3@huawei.com>
    Reviewed-by: default avatarXiao Ni <xni@redhat.com>
    Signed-off-by: default avatarSong Liu <song@kernel.org>
    Link: https://lore.kernel.org/r/20240229095714.926789-5-yukuai1@huaweicloud.com
    257ac239
raid1.c 92.3 KB