Re: [PATCH v3 2/6] badblocks: add helper routines for badblock ranges handling

From: Coly Li
Date: Mon Sep 27 2021 - 04:17:58 EST


On 9/27/21 3:25 PM, Geliang Tang wrote:
On 9/14/21 00:36, Coly Li wrote:
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 maniplating range and other bad block range in the
   bad block table.
   - behind_merge()
     Merge the maniplating range with the bad block range behind its
     range, and return the number of merged length in unit of sector.
   - front_merge()
     Merge the maniplating 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: Coly Li <colyli@xxxxxxx>
Cc: Dan Williams <dan.j.williams@xxxxxxxxx>
Cc: Hannes Reinecke <hare@xxxxxxx>
Cc: Jens Axboe <axboe@xxxxxxxxx>
Cc: NeilBrown <neilb@xxxxxxx>
Cc: Richard Fan <richard.fan@xxxxxxxx>
Cc: Vishal L Verma <vishal.l.verma@xxxxxxxxx>
---
  block/badblocks.c | 374 ++++++++++++++++++++++++++++++++++++++++++++++
  1 file changed, 374 insertions(+)

diff --git a/block/badblocks.c b/block/badblocks.c
index d39056630d9c..efe316181e05 100644
--- a/block/badblocks.c
+++ b/block/badblocks.c
@@ -16,6 +16,380 @@
  #include <linux/types.h>
  #include <linux/slab.h>
  +/*
+ * Find the range starts at-or-before 's' from bad table. The search
+ * starts from index 'hint' and stops at index 'hint_end' from the bad
+ * table.
+ */
+static int prev_by_hint(struct badblocks *bb, sector_t s, int hint)
+{
+    u64 *p = bb->page;
+    int ret = -1;
+    int hint_end = hint + 2;

How about declaring these variables following the "reverse Xmas tree" order.


It makes sense. I will do this in whole set for next version.

Thanks for your review.

Coly Li