[PATCH 2/4] badblocks: optimize _badblocks_check()

From: linan666
Date: Sat Dec 23 2023 - 01:39:56 EST


From: Li Nan <linan122@xxxxxxxxxx>

Check badblocks_empty earlier, and goto out if check range starts after
all badblocks or badblocks is empty since no badblocks intersect with
check range.

Clean up redundant check '(prev + 1) < bb->count'. If it is true, it
will enter the earlier branch.

Signed-off-by: Li Nan <linan122@xxxxxxxxxx>
---
block/badblocks.c | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/block/badblocks.c b/block/badblocks.c
index ebf17a54851a..054d05b93641 100644
--- a/block/badblocks.c
+++ b/block/badblocks.c
@@ -1296,6 +1296,11 @@ static int _badblocks_check(struct badblocks *bb, sector_t s, int sectors,
retry:
seq = read_seqbegin(&bb->lock);

+ if (badblocks_empty(bb)) {
+ len = sectors;
+ goto out;
+ }
+
p = bb->page;
acked_badblocks = 0;

@@ -1303,17 +1308,12 @@ static int _badblocks_check(struct badblocks *bb, sector_t s, int sectors,
bad.start = s;
bad.len = sectors;

- if (badblocks_empty(bb)) {
- len = sectors;
- goto update_sectors;
- }
-
prev = prev_badblocks(bb, &bad, hint);

/* start after all badblocks */
if ((prev + 1) >= bb->count && !overlap_front(bb, prev, &bad)) {
len = sectors;
- goto update_sectors;
+ goto out;
}

if (overlap_front(bb, prev, &bad)) {
@@ -1339,7 +1339,7 @@ static int _badblocks_check(struct badblocks *bb, sector_t s, int sectors,
}

/* Not front overlap, but behind overlap */
- if ((prev + 1) < bb->count && overlap_behind(bb, &bad, prev + 1)) {
+ if (overlap_behind(bb, &bad, prev + 1)) {
len = BB_OFFSET(p[prev + 1]) - bad.start;
hint = prev + 1;
goto update_sectors;
--
2.39.2