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

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