]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commit
md: don't update recovery_cp when curr_resync is ACTIVE
authorHou Tao <houtao1@huawei.com>
Tue, 31 Jan 2023 07:07:19 +0000 (15:07 +0800)
committerAndrea Righi <andrea.righi@canonical.com>
Tue, 14 Mar 2023 15:47:24 +0000 (16:47 +0100)
commit7eccf53482147d1287e09022710f3b8f55f6f43b
treecce56e578e314048b696c9b7546353f1d4e93bec
parent5aab330d9345360caaa78103ad7eacdba7eef3c1
md: don't update recovery_cp when curr_resync is ACTIVE

BugLink: https://bugs.launchpad.net/bugs/2011425
commit 1d1f25bfda432a6b61bd0205d426226bbbd73504 upstream.

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: eac58d08d493 ("md: Use enum for overloaded magic numbers used by mddev->curr_resync")
Cc: stable@vger.kernel.org # 6.0+
Signed-off-by: Hou Tao <houtao1@huawei.com>
Reviewed-by: Logan Gunthorpe <logang@deltatee.com>
Signed-off-by: Song Liu <song@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Andrea Righi <andrea.righi@canonical.com>
drivers/md/md.c