Commit 0145acc202ca613b23b5383e55df3c32a92ad1bf
1 parent
8966be9030
Exists in
smarc-l5.0.0_1.0.0-ga
and in
5 other branches
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>
Showing 2 changed files with 10 additions and 12 deletions Side-by-side Diff
fs/namei.c
... | ... | @@ -1374,6 +1374,14 @@ |
1374 | 1374 | return 1; |
1375 | 1375 | } |
1376 | 1376 | |
1377 | +unsigned 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 | 1386 | * Name resolution. |
1379 | 1387 | * This is the basic name resolution function, turning a pathname into |
1380 | 1388 | |
1381 | 1389 | |
1382 | 1390 | |
1383 | 1391 | |
... | ... | @@ -1775,24 +1783,21 @@ |
1775 | 1783 | struct dentry *lookup_one_len(const char *name, struct dentry *base, int len) |
1776 | 1784 | { |
1777 | 1785 | struct qstr this; |
1778 | - unsigned long hash; | |
1779 | 1786 | unsigned int c; |
1780 | 1787 | |
1781 | 1788 | WARN_ON_ONCE(!mutex_is_locked(&base->d_inode->i_mutex)); |
1782 | 1789 | |
1783 | 1790 | this.name = name; |
1784 | 1791 | this.len = len; |
1792 | + this.hash = full_name_hash(name, len); | |
1785 | 1793 | if (!len) |
1786 | 1794 | return ERR_PTR(-EACCES); |
1787 | 1795 | |
1788 | - hash = init_name_hash(); | |
1789 | 1796 | while (len--) { |
1790 | 1797 | c = *(const unsigned char *)name++; |
1791 | 1798 | if (c == '/' || c == '\0') |
1792 | 1799 | return ERR_PTR(-EACCES); |
1793 | - hash = partial_name_hash(c, hash); | |
1794 | 1800 | } |
1795 | - this.hash = end_name_hash(hash); | |
1796 | 1801 | /* |
1797 | 1802 | * See if the low-level filesystem might want |
1798 | 1803 | * to use its own hash.. |
include/linux/dcache.h
... | ... | @@ -89,14 +89,7 @@ |
89 | 89 | } |
90 | 90 | |
91 | 91 | /* Compute the hash for a name string. */ |
92 | -static inline unsigned int | |
93 | -full_name_hash(const unsigned char *name, unsigned int len) | |
94 | -{ | |
95 | - unsigned long hash = init_name_hash(); | |
96 | - while (len--) | |
97 | - hash = partial_name_hash(*name++, hash); | |
98 | - return end_name_hash(hash); | |
99 | -} | |
92 | +extern unsigned int full_name_hash(const unsigned char *, unsigned int); | |
100 | 93 | |
101 | 94 | /* |
102 | 95 | * Try to keep struct dentry aligned on 64 byte cachelines (this will |