diff options
| -rw-r--r-- | fs/dcache.c | 13 | ||||
| -rw-r--r-- | include/linux/dcache.h | 3 |
2 files changed, 10 insertions, 6 deletions
diff --git a/fs/dcache.c b/fs/dcache.c index fe19ac13f75f..138be96e25b6 100644 --- a/fs/dcache.c +++ b/fs/dcache.c | |||
| @@ -104,7 +104,7 @@ static unsigned int d_hash_shift __read_mostly; | |||
| 104 | 104 | ||
| 105 | static struct hlist_bl_head *dentry_hashtable __read_mostly; | 105 | static struct hlist_bl_head *dentry_hashtable __read_mostly; |
| 106 | 106 | ||
| 107 | static inline struct hlist_bl_head *d_hash(struct dentry *parent, | 107 | static inline struct hlist_bl_head *d_hash(const struct dentry *parent, |
| 108 | unsigned long hash) | 108 | unsigned long hash) |
| 109 | { | 109 | { |
| 110 | hash += ((unsigned long) parent ^ GOLDEN_RATIO_PRIME) / L1_CACHE_BYTES; | 110 | hash += ((unsigned long) parent ^ GOLDEN_RATIO_PRIME) / L1_CACHE_BYTES; |
| @@ -1717,8 +1717,9 @@ EXPORT_SYMBOL(d_add_ci); | |||
| 1717 | * child is looked up. Thus, an interlocking stepping of sequence lock checks | 1717 | * child is looked up. Thus, an interlocking stepping of sequence lock checks |
| 1718 | * is formed, giving integrity down the path walk. | 1718 | * is formed, giving integrity down the path walk. |
| 1719 | */ | 1719 | */ |
| 1720 | struct dentry *__d_lookup_rcu(struct dentry *parent, struct qstr *name, | 1720 | struct dentry *__d_lookup_rcu(const struct dentry *parent, |
| 1721 | unsigned *seq, struct inode **inode) | 1721 | const struct qstr *name, |
| 1722 | unsigned *seqp, struct inode **inode) | ||
| 1722 | { | 1723 | { |
| 1723 | unsigned int len = name->len; | 1724 | unsigned int len = name->len; |
| 1724 | unsigned int hash = name->hash; | 1725 | unsigned int hash = name->hash; |
| @@ -1748,6 +1749,7 @@ struct dentry *__d_lookup_rcu(struct dentry *parent, struct qstr *name, | |||
| 1748 | * See Documentation/filesystems/path-lookup.txt for more details. | 1749 | * See Documentation/filesystems/path-lookup.txt for more details. |
| 1749 | */ | 1750 | */ |
| 1750 | hlist_bl_for_each_entry_rcu(dentry, node, b, d_hash) { | 1751 | hlist_bl_for_each_entry_rcu(dentry, node, b, d_hash) { |
| 1752 | unsigned seq; | ||
| 1751 | struct inode *i; | 1753 | struct inode *i; |
| 1752 | const char *tname; | 1754 | const char *tname; |
| 1753 | int tlen; | 1755 | int tlen; |
| @@ -1756,7 +1758,7 @@ struct dentry *__d_lookup_rcu(struct dentry *parent, struct qstr *name, | |||
| 1756 | continue; | 1758 | continue; |
| 1757 | 1759 | ||
| 1758 | seqretry: | 1760 | seqretry: |
| 1759 | *seq = read_seqcount_begin(&dentry->d_seq); | 1761 | seq = read_seqcount_begin(&dentry->d_seq); |
| 1760 | if (dentry->d_parent != parent) | 1762 | if (dentry->d_parent != parent) |
| 1761 | continue; | 1763 | continue; |
| 1762 | if (d_unhashed(dentry)) | 1764 | if (d_unhashed(dentry)) |
| @@ -1771,7 +1773,7 @@ seqretry: | |||
| 1771 | * edge of memory when walking. If we could load this | 1773 | * edge of memory when walking. If we could load this |
| 1772 | * atomically some other way, we could drop this check. | 1774 | * atomically some other way, we could drop this check. |
| 1773 | */ | 1775 | */ |
| 1774 | if (read_seqcount_retry(&dentry->d_seq, *seq)) | 1776 | if (read_seqcount_retry(&dentry->d_seq, seq)) |
| 1775 | goto seqretry; | 1777 | goto seqretry; |
| 1776 | if (unlikely(parent->d_flags & DCACHE_OP_COMPARE)) { | 1778 | if (unlikely(parent->d_flags & DCACHE_OP_COMPARE)) { |
| 1777 | if (parent->d_op->d_compare(parent, *inode, | 1779 | if (parent->d_op->d_compare(parent, *inode, |
| @@ -1788,6 +1790,7 @@ seqretry: | |||
| 1788 | * order to do anything useful with the returned dentry | 1790 | * order to do anything useful with the returned dentry |
| 1789 | * anyway. | 1791 | * anyway. |
| 1790 | */ | 1792 | */ |
| 1793 | *seqp = seq; | ||
| 1791 | *inode = i; | 1794 | *inode = i; |
| 1792 | return dentry; | 1795 | return dentry; |
| 1793 | } | 1796 | } |
diff --git a/include/linux/dcache.h b/include/linux/dcache.h index d64a55b23afd..61b24261e07a 100644 --- a/include/linux/dcache.h +++ b/include/linux/dcache.h | |||
| @@ -309,7 +309,8 @@ extern struct dentry *d_ancestor(struct dentry *, struct dentry *); | |||
| 309 | extern struct dentry *d_lookup(struct dentry *, struct qstr *); | 309 | extern struct dentry *d_lookup(struct dentry *, struct qstr *); |
| 310 | extern struct dentry *d_hash_and_lookup(struct dentry *, struct qstr *); | 310 | extern struct dentry *d_hash_and_lookup(struct dentry *, struct qstr *); |
| 311 | extern struct dentry *__d_lookup(struct dentry *, struct qstr *); | 311 | extern struct dentry *__d_lookup(struct dentry *, struct qstr *); |
| 312 | extern struct dentry *__d_lookup_rcu(struct dentry *parent, struct qstr *name, | 312 | extern struct dentry *__d_lookup_rcu(const struct dentry *parent, |
| 313 | const struct qstr *name, | ||
| 313 | unsigned *seq, struct inode **inode); | 314 | unsigned *seq, struct inode **inode); |
| 314 | 315 | ||
| 315 | /** | 316 | /** |
