diff options
-rw-r--r-- | fs/dcache.c | 12 | ||||
-rw-r--r-- | include/linux/dcache.h | 21 |
2 files changed, 24 insertions, 9 deletions
diff --git a/fs/dcache.c b/fs/dcache.c index 2a4ce7dc2306..5699d4c027cb 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 c0a2ca97c72f..bd07758943e0 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 |