|
@@ -1374,6 +1374,14 @@ static inline int can_lookup(struct inode *inode)
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
+unsigned int full_name_hash(const unsigned char *name, unsigned int len)
|
|
|
+{
|
|
|
+ unsigned long hash = init_name_hash();
|
|
|
+ while (len--)
|
|
|
+ hash = partial_name_hash(*name++, hash);
|
|
|
+ return end_name_hash(hash);
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Name resolution.
|
|
|
* This is the basic name resolution function, turning a pathname into
|
|
@@ -1775,24 +1783,21 @@ static struct dentry *lookup_hash(struct nameidata *nd)
|
|
|
struct dentry *lookup_one_len(const char *name, struct dentry *base, int len)
|
|
|
{
|
|
|
struct qstr this;
|
|
|
- unsigned long hash;
|
|
|
unsigned int c;
|
|
|
|
|
|
WARN_ON_ONCE(!mutex_is_locked(&base->d_inode->i_mutex));
|
|
|
|
|
|
this.name = name;
|
|
|
this.len = len;
|
|
|
+ this.hash = full_name_hash(name, len);
|
|
|
if (!len)
|
|
|
return ERR_PTR(-EACCES);
|
|
|
|
|
|
- hash = init_name_hash();
|
|
|
while (len--) {
|
|
|
c = *(const unsigned char *)name++;
|
|
|
if (c == '/' || c == '\0')
|
|
|
return ERR_PTR(-EACCES);
|
|
|
- hash = partial_name_hash(c, hash);
|
|
|
}
|
|
|
- this.hash = end_name_hash(hash);
|
|
|
/*
|
|
|
* See if the low-level filesystem might want
|
|
|
* to use its own hash..
|