• Coly Li's avatar
    badblocks: add helper routines for badblock ranges handling · c3c6a86e
    Coly Li authored
    This patch adds several helper routines to improve badblock ranges
    handling. These helper routines will be used later in the improved
    version of badblocks_set()/badblocks_clear()/badblocks_check().
    
    - Helpers prev_by_hint() and prev_badblocks() are used to find the bad
      range from bad table which the searching range starts at or after.
    
    - The following helpers are to decide the relative layout between the
      manipulating range and existing bad block range from bad table.
      - can_merge_behind()
        Return 'true' if the manipulating range can backward merge with the
        bad block range.
      - can_merge_front()
        Return 'true' if the manipulating range can forward merge with the
        bad block range.
      - can_combine_front()
        Return 'true' if two adjacent bad block ranges before the
        manipulating range can be merged.
      - overlap_front()
        Return 'true' if the manipulating range exactly overlaps with the
        bad block range in front of its range.
      - overlap_behind()
        Return 'true' if the manipulating range exactly overlaps with the
        bad block range behind its range.
      - can_front_overwrite()
        Return 'true' if the manipulating range can forward overwrite the
        bad block range in front of its range.
    
    - The following helpers are to add the manipulating range into the bad
      block table. Different routine is called with the specific relative
      layout between the manipulating range and other bad block range in the
      bad block table.
      - behind_merge()
        Merge the manipulating range with the bad block range behind its
        range, and return the number of merged length in unit of sector.
      - front_merge()
        Merge the manipulating range with the bad block range in front of
        its range, and return the number of merged length in unit of sector.
      - front_combine()
        Combine the two adjacent bad block ranges before the manipulating
        range into a larger one.
      - front_overwrite()
        Overwrite partial of whole bad block range which is in front of the
        manipulating range. The overwrite may split existing bad block range
        and generate more bad block ranges into the bad block table.
      - insert_at()
        Insert the manipulating range at a specific location in the bad
        block table.
    
    All the above helpers are used in later patches to improve the bad block
    ranges handling for badblocks_set()/badblocks_clear()/badblocks_check().
    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-3-colyli@suse.deSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
    c3c6a86e
badblocks.c 24.2 KB