[syslinux:master] ntfs: make ntfs_match_longname() faster

syslinux-bot for Paulo Alcantara pcacjr at gmail.com
Sat Dec 17 21:19:25 PST 2011


Commit-ID:  85b5eb13e626715361cb5835b5f1f9a58c4a44d6
Gitweb:     http://www.syslinux.org/commit/85b5eb13e626715361cb5835b5f1f9a58c4a44d6
Author:     Paulo Alcantara <pcacjr at gmail.com>
AuthorDate: Thu, 28 Jul 2011 21:35:07 +0000
Committer:  Paulo Alcantara <pcacjr at gmail.com>
CommitDate: Sun, 11 Sep 2011 04:09:58 +0000

ntfs: make ntfs_match_longname() faster

Signed-off-by: Paulo Alcantara <pcacjr at gmail.com>

---
 core/fs/ntfs/ntfs.c |   35 +++++------------------------------
 1 files changed, 5 insertions(+), 30 deletions(-)

diff --git a/core/fs/ntfs/ntfs.c b/core/fs/ntfs/ntfs.c
index dd11198..2a06053 100644
--- a/core/fs/ntfs/ntfs.c
+++ b/core/fs/ntfs/ntfs.c
@@ -155,40 +155,13 @@ static ATTR_RECORD *attr_lookup(uint32_t type, const MFT_RECORD *mrec)
     return attr;
 }
 
-static bool ntfs_match_longname(const char *str, unsigned long mft_no,
-                                    struct fs_info *fs)
+static bool ntfs_match_longname(const char *str, const uint16_t *match, int len)
 {
-    uint8_t data[BLOCK_SIZE(fs)];
-    int64_t offset;
-    MFT_RECORD *mrec;
-    block_t block = 0;
-    ATTR_RECORD *attr;
-    FILE_NAME_ATTR *fn;
-    uint8_t len;
     unsigned char c = -1;	/* Nonzero: we have not yet seen NULL */
     uint16_t cp;
-    const uint16_t *match;
 
     dprintf("Matching: %s\n", str);
 
-    offset = mft_record_lookup(mft_no, fs, &block, &data);
-    if (offset < 0) {
-        printf("No MFT record found.\n");
-        goto out;
-    }
-
-    mrec = (MFT_RECORD *)&data[offset];
-
-    attr = attr_lookup(NTFS_AT_FILENAME, mrec);
-    if (!attr) {
-        printf("No attribute found.\n");
-        goto out;
-    }
-
-    fn = (FILE_NAME_ATTR *)((uint8_t *)attr + attr->data.resident.value_offset);
-    len = fn->file_name_len;
-    match = fn->file_name;
-
     while (len) {
         cp = *match++;
         len--;
@@ -526,7 +499,8 @@ static struct inode *index_lookup(const char *dname, struct inode *dir)
         if (ie->flags & INDEX_ENTRY_END)
             break;
 
-        if (ntfs_match_longname(dname, ie->data.dir.indexed_file, fs)) {
+        if (ntfs_match_longname(dname, ie->key.file_name.file_name,
+                                strlen(dname))) {
             dprintf("Filename matches up!\n");
             dprintf("MFT record number = %d\n", ie->data.dir.indexed_file);
             goto found;
@@ -638,7 +612,8 @@ static struct inode *index_lookup(const char *dname, struct inode *dir)
                 if (ie->flags & INDEX_ENTRY_END)
                     break;
 
-                if (ntfs_match_longname(dname, ie->data.dir.indexed_file, fs)) {
+                if (ntfs_match_longname(dname, ie->key.file_name.file_name,
+                                        strlen(dname))) {
                     dprintf("Filename matches up!\n");
                     goto found;
                 }


More information about the Syslinux-commits mailing list