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