fs/ntfs3: Make binary search to search smaller chunks in beginning
authorKari Argillander <kari.argillander@gmail.com>
Thu, 2 Sep 2021 15:40:49 +0000 (18:40 +0300)
committerKonstantin Komarov <almaz.alexandrovich@paragon-software.com>
Mon, 13 Sep 2021 16:41:46 +0000 (19:41 +0300)
We could try to optimize algorithm to first fill just small table and
after that use bigger table all the way up to ARRAY_SIZE(offs). This
way we can use bigger search array, but not lose benefits with entry
count smaller < ARRAY_SIZE(offs).

Signed-off-by: Kari Argillander <kari.argillander@gmail.com>
Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
fs/ntfs3/index.c

index a16256ab3e9ffd5bcc660c602194c9bd2de7cfc9..3ad1ee608e531ea7c7793e691fe706ee0a6c33a4 100644 (file)
@@ -8,6 +8,7 @@
 #include <linux/blkdev.h>
 #include <linux/buffer_head.h>
 #include <linux/fs.h>
+#include <linux/kernel.h>
 
 #include "debug.h"
 #include "ntfs.h"
@@ -679,8 +680,9 @@ static struct NTFS_DE *hdr_find_e(const struct ntfs_index *indx,
 #ifdef NTFS3_INDEX_BINARY_SEARCH
        struct NTFS_DE *found = NULL;
        int min_idx = 0, mid_idx, max_idx = 0;
+       int table_size = 8;
        int diff2;
-       u16 offs[64];
+       u16 offs[128];
 
        if (end > 0x10000)
                goto next;
@@ -700,7 +702,7 @@ fill_table:
                off += e_size;
 
                max_idx++;
-               if (max_idx < ARRAY_SIZE(offs))
+               if (max_idx < table_size)
                        goto fill_table;
 
                max_idx--;
@@ -718,6 +720,7 @@ binary_search:
                                return NULL;
 
                        max_idx = 0;
+                       table_size = min(table_size * 2, 128);
                        goto fill_table;
                }
        } else if (diff2 < 0) {