• Coly Li's avatar
    badblocks: improve badblocks_clear() for multiple ranges handling · db448eb6
    Coly Li authored
    With the fundamental ideas and helper routines from badblocks_set()
    improvement, clearing bad block for multiple ranges is much simpler.
    
    With a similar idea from badblocks_set() improvement, this patch
    simplifies bad block range clearing into 5 situations. No matter how
    complicated the clearing condition is, we just look at the head part
    of clearing range with relative already set bad block range from the
    bad block table. The rested part will be handled in next run of the
    while-loop.
    
    Based on existing helpers added from badblocks_set(), this patch adds
    two more helpers,
    - front_clear()
      Clear the bad block range from bad block table which is front
      overlapped with the clearing range.
    - front_splitting_clear()
      Handle the condition that the clearing range hits middle of an
      already set bad block range from bad block table.
    
    Similar as badblocks_set(), the first part of clearing range is handled
    with relative bad block range which is find by prev_badblocks(). In most
    cases a valid hint is provided to prev_badblocks() to avoid unnecessary
    bad block table iteration.
    
    This patch also explains the detail algorithm code comments at beginning
    of badblocks.c, including which five simplified situations are
    categrized and how all the bad block range clearing conditions are
    handled by these five situations.
    
    Again, in order to make the code review easier and avoid the code
    changes mixed together, this patch does not modify badblock_clear() and
    implement another routine called _badblock_clear() for the improvement.
    Later patch will delete current code of badblock_clear() and make it as
    a wrapper to _badblock_clear(), so the code change can be much clear for
    review.
    Signed-off-by: default avatarColy Li <colyli@suse.de>
    Cc: Dan Williams <dan.j.williams@intel.com>
    Cc: Geliang Tang <geliang.tang@suse.com>
    Cc: Hannes Reinecke <hare@suse.de>
    Cc: Jens Axboe <axboe@kernel.dk>
    Cc: NeilBrown <neilb@suse.de>
    Cc: Vishal L Verma <vishal.l.verma@intel.com>
    Cc: Xiao Ni <xni@redhat.com>
    Reviewed-by: default avatarXiao Ni <xni@redhat.com>
    Acked-by: default avatarGeliang Tang <geliang.tang@suse.com>
    Link: https://lore.kernel.org/r/20230811170513.2300-5-colyli@suse.deSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
    db448eb6
badblocks.c 54.3 KB