aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/dcache.c12
-rw-r--r--include/linux/dcache.h21
2 files changed, 24 insertions, 9 deletions
diff --git a/fs/dcache.c b/fs/dcache.c
index 2a4ce7d..5699d4c 100644
--- a/fs/dcache.c
+++ b/fs/dcache.c
@@ -1454,9 +1454,7 @@ static struct dentry *__d_instantiate_unique(struct dentry *entry,
continue;
if (alias->d_parent != entry->d_parent)
continue;
- if (qstr->len != len)
- continue;
- if (memcmp(qstr->name, name, len))
+ if (dentry_cmp(qstr->name, qstr->len, name, len))
continue;
__dget(alias);
return alias;
@@ -1810,9 +1808,7 @@ seqretry:
tlen, tname, name))
continue;
} else {
- if (tlen != len)
- continue;
- if (memcmp(tname, str, tlen))
+ if (dentry_cmp(tname, tlen, str, len))
continue;
}
/*
@@ -1925,9 +1921,7 @@ struct dentry *__d_lookup(struct dentry *parent, struct qstr *name)
tlen, tname, name))
goto next;
} else {
- if (tlen != len)
- goto next;
- if (memcmp(tname, str, tlen))
+ if (dentry_cmp(tname, tlen, str, len))
goto next;
}
diff --git a/include/linux/dcache.h b/include/linux/dcache.h
index c0a2ca9..bd07758 100644
--- a/include/linux/dcache.h
+++ b/include/linux/dcache.h
@@ -47,6 +47,27 @@ struct dentry_stat_t {
};
extern struct dentry_stat_t dentry_stat;
+/*
+ * Compare 2 name strings, return 0 if they match, otherwise non-zero.
+ * The strings are both count bytes long, and count is non-zero.
+ */
+static inline int dentry_cmp(const unsigned char *cs, size_t scount,
+ const unsigned char *ct, size_t tcount)
+{
+ int ret;
+ if (scount != tcount)
+ return 1;
+ do {
+ ret = (*cs != *ct);
+ if (ret)
+ break;
+ cs++;
+ ct++;
+ tcount--;
+ } while (tcount);
+ return ret;
+}
+
/* Name hashing routines. Initial hash value */
/* Hash courtesy of the R5 hash in reiserfs modulo sign bits */
#define init_name_hash() 0