• Hou Tao's avatar
    md: don't update recovery_cp when curr_resync is ACTIVE · 1d1f25bf
    Hou Tao authored
    Don't update recovery_cp when curr_resync is MD_RESYNC_ACTIVE, otherwise
    md may skip the resync of the first 3 sectors if the resync procedure is
    interrupted before the first calling of ->sync_request() as shown below:
    
    md_do_sync thread          control thread
      // setup resync
      mddev->recovery_cp = 0
      j = 0
      mddev->curr_resync = MD_RESYNC_ACTIVE
    
                                 // e.g., set array as idle
                                 set_bit(MD_RECOVERY_INTR, &&mddev_recovery)
      // resync loop
      // check INTR before calling sync_request
      !test_bit(MD_RECOVERY_INTR, &mddev->recovery
    
      // resync interrupted
      // update recovery_cp from 0 to 3
      // the resync of three 3 sectors will be skipped
      mddev->recovery_cp = 3
    
    Fixes: eac58d08 ("md: Use enum for overloaded magic numbers used by mddev->curr_resync")
    Cc: stable@vger.kernel.org # 6.0+
    Signed-off-by: default avatarHou Tao <houtao1@huawei.com>
    Reviewed-by: default avatarLogan Gunthorpe <logang@deltatee.com>
    Signed-off-by: default avatarSong Liu <song@kernel.org>
    1d1f25bf
md.c 260 KB