|
@@ -141,18 +141,29 @@ int proc_nr_dentry(ctl_table *table, int write, void __user *buffer,
|
|
|
* Compare 2 name strings, return 0 if they match, otherwise non-zero.
|
|
|
* The strings are both count bytes long, and count is non-zero.
|
|
|
*/
|
|
|
+#ifdef CONFIG_DCACHE_WORD_ACCESS
|
|
|
+
|
|
|
+#include <asm/word-at-a-time.h>
|
|
|
+/*
|
|
|
+ * NOTE! 'cs' and 'scount' come from a dentry, so it has a
|
|
|
+ * aligned allocation for this particular component. We don't
|
|
|
+ * strictly need the load_unaligned_zeropad() safety, but it
|
|
|
+ * doesn't hurt either.
|
|
|
+ *
|
|
|
+ * In contrast, 'ct' and 'tcount' can be from a pathname, and do
|
|
|
+ * need the careful unaligned handling.
|
|
|
+ */
|
|
|
static inline int dentry_cmp(const unsigned char *cs, size_t scount,
|
|
|
const unsigned char *ct, size_t tcount)
|
|
|
{
|
|
|
-#ifdef CONFIG_DCACHE_WORD_ACCESS
|
|
|
unsigned long a,b,mask;
|
|
|
|
|
|
if (unlikely(scount != tcount))
|
|
|
return 1;
|
|
|
|
|
|
for (;;) {
|
|
|
- a = *(unsigned long *)cs;
|
|
|
- b = *(unsigned long *)ct;
|
|
|
+ a = load_unaligned_zeropad(cs);
|
|
|
+ b = load_unaligned_zeropad(ct);
|
|
|
if (tcount < sizeof(unsigned long))
|
|
|
break;
|
|
|
if (unlikely(a != b))
|
|
@@ -165,7 +176,13 @@ static inline int dentry_cmp(const unsigned char *cs, size_t scount,
|
|
|
}
|
|
|
mask = ~(~0ul << tcount*8);
|
|
|
return unlikely(!!((a ^ b) & mask));
|
|
|
+}
|
|
|
+
|
|
|
#else
|
|
|
+
|
|
|
+static inline int dentry_cmp(const unsigned char *cs, size_t scount,
|
|
|
+ const unsigned char *ct, size_t tcount)
|
|
|
+{
|
|
|
if (scount != tcount)
|
|
|
return 1;
|
|
|
|
|
@@ -177,9 +194,10 @@ static inline int dentry_cmp(const unsigned char *cs, size_t scount,
|
|
|
tcount--;
|
|
|
} while (tcount);
|
|
|
return 0;
|
|
|
-#endif
|
|
|
}
|
|
|
|
|
|
+#endif
|
|
|
+
|
|
|
static void __d_free(struct rcu_head *head)
|
|
|
{
|
|
|
struct dentry *dentry = container_of(head, struct dentry, d_u.d_rcu);
|