lkml.org 
[lkml]   [2018]   [Sep]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 4.9 14/57] md-cluster: clear another node's suspend_area after the copy is finished
    Date
    From: Guoqing Jiang <gqjiang@suse.com>

    [ Upstream commit 010228e4a932ca1e8365e3b58c8e1e44c16ff793 ]

    When one node leaves cluster or stops the resyncing
    (resync or recovery) array, then other nodes need to
    call recover_bitmaps to continue the unfinished task.

    But we need to clear suspend_area later after other
    nodes copy the resync information to their bitmap
    (by call bitmap_copy_from_slot). Otherwise, all nodes
    could write to the suspend_area even the suspend_area
    is not handled by any node, because area_resyncing
    returns 0 at the beginning of raid1_write_request.
    Which means one node could write suspend_area while
    another node is resyncing the same area, then data
    could be inconsistent.

    So let's clear suspend_area later to avoid above issue
    with the protection of bm lock. Also it is straightforward
    to clear suspend_area after nodes have copied the resync
    info to bitmap.

    Signed-off-by: Guoqing Jiang <gqjiang@suse.com>
    Reviewed-by: NeilBrown <neilb@suse.com>
    Signed-off-by: Shaohua Li <shli@fb.com>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    ---
    drivers/md/md-cluster.c | 19 ++++++++++---------
    1 file changed, 10 insertions(+), 9 deletions(-)

    diff --git a/drivers/md/md-cluster.c b/drivers/md/md-cluster.c
    index fcc2b5746a9f..e870b09b2c84 100644
    --- a/drivers/md/md-cluster.c
    +++ b/drivers/md/md-cluster.c
    @@ -302,15 +302,6 @@ static void recover_bitmaps(struct md_thread *thread)
    while (cinfo->recovery_map) {
    slot = fls64((u64)cinfo->recovery_map) - 1;

    - /* Clear suspend_area associated with the bitmap */
    - spin_lock_irq(&cinfo->suspend_lock);
    - list_for_each_entry_safe(s, tmp, &cinfo->suspend_list, list)
    - if (slot == s->slot) {
    - list_del(&s->list);
    - kfree(s);
    - }
    - spin_unlock_irq(&cinfo->suspend_lock);
    -
    snprintf(str, 64, "bitmap%04d", slot);
    bm_lockres = lockres_init(mddev, str, NULL, 1);
    if (!bm_lockres) {
    @@ -329,6 +320,16 @@ static void recover_bitmaps(struct md_thread *thread)
    pr_err("md-cluster: Could not copy data from bitmap %d\n", slot);
    goto clear_bit;
    }
    +
    + /* Clear suspend_area associated with the bitmap */
    + spin_lock_irq(&cinfo->suspend_lock);
    + list_for_each_entry_safe(s, tmp, &cinfo->suspend_list, list)
    + if (slot == s->slot) {
    + list_del(&s->list);
    + kfree(s);
    + }
    + spin_unlock_irq(&cinfo->suspend_lock);
    +
    if (hi > 0) {
    if (lo < mddev->recovery_cp)
    mddev->recovery_cp = lo;
    --
    2.17.1
    \
     
     \ /
      Last update: 2018-09-17 05:17    [W:2.585 / U:0.472 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site