Blame SOURCES/0054-fs-ntfs3-Always-use-binary-search-with-entry-search.patch

Kmods SIG 63c143
From 8e69212253d320d4768071086b1111e6ab91d9bd Mon Sep 17 00:00:00 2001
Kmods SIG 63c143
From: Kari Argillander <kari.argillander@gmail.com>
Kmods SIG 63c143
Date: Thu, 2 Sep 2021 18:40:50 +0300
Kmods SIG 63c143
Subject: [Backport 8e69212253d3] src: Always use binary search with entry
Kmods SIG 63c143
 search
Kmods SIG 63c143
Kmods SIG 63c143
We do not have any reason to keep old linear search in. Before this was
Kmods SIG 63c143
used for error path or if table was so big that it cannot be allocated.
Kmods SIG 63c143
Current binary search implementation won't need error path. Remove old
Kmods SIG 63c143
references to linear entry search.
Kmods SIG 63c143
Kmods SIG 63c143
Signed-off-by: Kari Argillander <kari.argillander@gmail.com>
Kmods SIG 63c143
Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
Kmods SIG 63c143
---
Kmods SIG 63c143
 src/index.c | 50 ++++++------------------------------------------
Kmods SIG 63c143
 src/ntfs.h  |  3 ---
Kmods SIG 63c143
 2 files changed, 6 insertions(+), 47 deletions(-)
Kmods SIG 63c143
Kmods SIG 63c143
diff --git a/src/index.c b/src/index.c
Kmods SIG 63c143
index 3ad1ee608e531ea7c7793e691fe706ee0a6c33a4..4f71a91f07d9fc56efe6a80ebf52995e2e9a65de 100644
Kmods SIG 63c143
--- a/src/index.c
Kmods SIG 63c143
+++ b/src/index.c
Kmods SIG 63c143
@@ -671,22 +671,16 @@ static struct NTFS_DE *hdr_find_e(const struct ntfs_index *indx,
Kmods SIG 63c143
 				  const struct INDEX_HDR *hdr, const void *key,
Kmods SIG 63c143
 				  size_t key_len, const void *ctx, int *diff)
Kmods SIG 63c143
 {
Kmods SIG 63c143
-	struct NTFS_DE *e;
Kmods SIG 63c143
+	struct NTFS_DE *e, *found = NULL;
Kmods SIG 63c143
 	NTFS_CMP_FUNC cmp = indx->cmp;
Kmods SIG 63c143
+	int min_idx = 0, mid_idx, max_idx = 0;
Kmods SIG 63c143
+	int diff2;
Kmods SIG 63c143
+	int table_size = 8;
Kmods SIG 63c143
 	u32 e_size, e_key_len;
Kmods SIG 63c143
 	u32 end = le32_to_cpu(hdr->used);
Kmods SIG 63c143
 	u32 off = le32_to_cpu(hdr->de_off);
Kmods SIG 63c143
-
Kmods SIG 63c143
-#ifdef NTFS3_INDEX_BINARY_SEARCH
Kmods SIG 63c143
-	struct NTFS_DE *found = NULL;
Kmods SIG 63c143
-	int min_idx = 0, mid_idx, max_idx = 0;
Kmods SIG 63c143
-	int table_size = 8;
Kmods SIG 63c143
-	int diff2;
Kmods SIG 63c143
 	u16 offs[128];
Kmods SIG 63c143
 
Kmods SIG 63c143
-	if (end > 0x10000)
Kmods SIG 63c143
-		goto next;
Kmods SIG 63c143
-
Kmods SIG 63c143
 fill_table:
Kmods SIG 63c143
 	if (off + sizeof(struct NTFS_DE) > end)
Kmods SIG 63c143
 		return NULL;
Kmods SIG 63c143
@@ -720,7 +714,8 @@ static struct NTFS_DE *hdr_find_e(const struct ntfs_index *indx,
Kmods SIG 63c143
 				return NULL;
Kmods SIG 63c143
 
Kmods SIG 63c143
 			max_idx = 0;
Kmods SIG 63c143
-			table_size = min(table_size * 2, 128);
Kmods SIG 63c143
+			table_size = min(table_size * 2,
Kmods SIG 63c143
+					 (int)ARRAY_SIZE(offs));
Kmods SIG 63c143
 			goto fill_table;
Kmods SIG 63c143
 		}
Kmods SIG 63c143
 	} else if (diff2 < 0) {
Kmods SIG 63c143
@@ -744,39 +739,6 @@ static struct NTFS_DE *hdr_find_e(const struct ntfs_index *indx,
Kmods SIG 63c143
 	e = Add2Ptr(hdr, offs[mid_idx]);
Kmods SIG 63c143
 
Kmods SIG 63c143
 	goto binary_search;
Kmods SIG 63c143
-#endif
Kmods SIG 63c143
-
Kmods SIG 63c143
-next:
Kmods SIG 63c143
-	/*
Kmods SIG 63c143
-	 * Entries index are sorted.
Kmods SIG 63c143
-	 * Enumerate all entries until we find entry
Kmods SIG 63c143
-	 * that is <= to the search value.
Kmods SIG 63c143
-	 */
Kmods SIG 63c143
-	if (off + sizeof(struct NTFS_DE) > end)
Kmods SIG 63c143
-		return NULL;
Kmods SIG 63c143
-
Kmods SIG 63c143
-	e = Add2Ptr(hdr, off);
Kmods SIG 63c143
-	e_size = le16_to_cpu(e->size);
Kmods SIG 63c143
-
Kmods SIG 63c143
-	if (e_size < sizeof(struct NTFS_DE) || off + e_size > end)
Kmods SIG 63c143
-		return NULL;
Kmods SIG 63c143
-
Kmods SIG 63c143
-	off += e_size;
Kmods SIG 63c143
-
Kmods SIG 63c143
-	e_key_len = le16_to_cpu(e->key_size);
Kmods SIG 63c143
-
Kmods SIG 63c143
-	*diff = (*cmp)(key, key_len, e + 1, e_key_len, ctx);
Kmods SIG 63c143
-	if (!*diff)
Kmods SIG 63c143
-		return e;
Kmods SIG 63c143
-
Kmods SIG 63c143
-	if (*diff <= 0)
Kmods SIG 63c143
-		return e;
Kmods SIG 63c143
-
Kmods SIG 63c143
-	if (de_is_last(e)) {
Kmods SIG 63c143
-		*diff = 1;
Kmods SIG 63c143
-		return e;
Kmods SIG 63c143
-	}
Kmods SIG 63c143
-	goto next;
Kmods SIG 63c143
 }
Kmods SIG 63c143
 
Kmods SIG 63c143
 /*
Kmods SIG 63c143
diff --git a/src/ntfs.h b/src/ntfs.h
Kmods SIG 63c143
index 695b684bce20dd4f274884ba9a1022555b47823a..303a162c31587475adb8c3190b16fa451e9616a7 100644
Kmods SIG 63c143
--- a/src/ntfs.h
Kmods SIG 63c143
+++ b/src/ntfs.h
Kmods SIG 63c143
@@ -21,9 +21,6 @@
Kmods SIG 63c143
 
Kmods SIG 63c143
 /* TODO: Check 4K MFT record and 512 bytes cluster. */
Kmods SIG 63c143
 
Kmods SIG 63c143
-/* Activate this define to use binary search in indexes. */
Kmods SIG 63c143
-#define NTFS3_INDEX_BINARY_SEARCH
Kmods SIG 63c143
-
Kmods SIG 63c143
 /* Check each run for marked clusters. */
Kmods SIG 63c143
 #define NTFS3_CHECK_FREE_CLST
Kmods SIG 63c143
 
Kmods SIG 63c143
-- 
Kmods SIG 63c143
2.31.1
Kmods SIG 63c143