aboutsummaryrefslogtreecommitdiffstats
path: root/fs/namei.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2012-03-02 17:32:59 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2012-03-02 17:32:59 -0500
commit0145acc202ca613b23b5383e55df3c32a92ad1bf (patch)
tree779292f953fb9845252295679fb712faf7f52624 /fs/namei.c
parent8966be90304b394fd6a2c5af7b6b3abe2df3889c (diff)
vfs: uninline full_name_hash()
.. and also use it in lookup_one_len() rather than open-coding it. There aren't any performance-critical users, so inlining it is silly. But it wouldn't matter if it wasn't for the fact that the word-at-a-time dentry name patches want to conditionally replace the function, and uninlining it sets the stage for that. So again, this is a preparatory patch that doesn't change any semantics, and only prepares for a much cleaner and testable word-at-a-time dentry name accessor patch. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/namei.c')
-rw-r--r--fs/namei.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/fs/namei.c b/fs/namei.c
index a780ea515c47..ec72fa1acb14 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -1374,6 +1374,14 @@ static inline int can_lookup(struct inode *inode)
1374 return 1; 1374 return 1;
1375} 1375}
1376 1376
1377unsigned int full_name_hash(const unsigned char *name, unsigned int len)
1378{
1379 unsigned long hash = init_name_hash();
1380 while (len--)
1381 hash = partial_name_hash(*name++, hash);
1382 return end_name_hash(hash);
1383}
1384
1377/* 1385/*
1378 * Name resolution. 1386 * Name resolution.
1379 * This is the basic name resolution function, turning a pathname into 1387 * This is the basic name resolution function, turning a pathname into
@@ -1775,24 +1783,21 @@ static struct dentry *lookup_hash(struct nameidata *nd)
1775struct dentry *lookup_one_len(const char *name, struct dentry *base, int len) 1783struct dentry *lookup_one_len(const char *name, struct dentry *base, int len)
1776{ 1784{
1777 struct qstr this; 1785 struct qstr this;
1778 unsigned long hash;
1779 unsigned int c; 1786 unsigned int c;
1780 1787
1781 WARN_ON_ONCE(!mutex_is_locked(&base->d_inode->i_mutex)); 1788 WARN_ON_ONCE(!mutex_is_locked(&base->d_inode->i_mutex));
1782 1789
1783 this.name = name; 1790 this.name = name;
1784 this.len = len; 1791 this.len = len;
1792 this.hash = full_name_hash(name, len);
1785 if (!len) 1793 if (!len)
1786 return ERR_PTR(-EACCES); 1794 return ERR_PTR(-EACCES);
1787 1795
1788 hash = init_name_hash();
1789 while (len--) { 1796 while (len--) {
1790 c = *(const unsigned char *)name++; 1797 c = *(const unsigned char *)name++;
1791 if (c == '/' || c == '\0') 1798 if (c == '/' || c == '\0')
1792 return ERR_PTR(-EACCES); 1799 return ERR_PTR(-EACCES);
1793 hash = partial_name_hash(c, hash);
1794 } 1800 }
1795 this.hash = end_name_hash(hash);
1796 /* 1801 /*
1797 * See if the low-level filesystem might want 1802 * See if the low-level filesystem might want
1798 * to use its own hash.. 1803 * to use its own hash..