diff options
author | Nick Piggin <npiggin@kernel.dk> | 2011-01-07 01:49:27 -0500 |
---|---|---|
committer | Nick Piggin <npiggin@kernel.dk> | 2011-01-07 01:50:19 -0500 |
commit | 621e155a3591962420eacdd39f6f0aa29ceb221e (patch) | |
tree | 387a9fb396f1bf24514b712c294182e36ba51076 /fs/hfs | |
parent | fb2d5b86aff355a27ebfc132d3c99f4a940cc3fe (diff) |
fs: change d_compare for rcu-walk
Change d_compare so it may be called from lock-free RCU lookups. This
does put significant restrictions on what may be done from the callback,
however there don't seem to have been any problems with in-tree fses.
If some strange use case pops up that _really_ cannot cope with the
rcu-walk rules, we can just add new rcu-unaware callbacks, which would
cause name lookup to drop out of rcu-walk mode.
For in-tree filesystems, this is just a mechanical change.
Signed-off-by: Nick Piggin <npiggin@kernel.dk>
Diffstat (limited to 'fs/hfs')
-rw-r--r-- | fs/hfs/hfs_fs.h | 5 | ||||
-rw-r--r-- | fs/hfs/string.c | 14 |
2 files changed, 11 insertions, 8 deletions
diff --git a/fs/hfs/hfs_fs.h b/fs/hfs/hfs_fs.h index c8cffb81e849..8cd876f0e961 100644 --- a/fs/hfs/hfs_fs.h +++ b/fs/hfs/hfs_fs.h | |||
@@ -216,7 +216,10 @@ extern const struct dentry_operations hfs_dentry_operations; | |||
216 | extern int hfs_hash_dentry(struct dentry *, struct qstr *); | 216 | extern int hfs_hash_dentry(struct dentry *, struct qstr *); |
217 | extern int hfs_strcmp(const unsigned char *, unsigned int, | 217 | extern int hfs_strcmp(const unsigned char *, unsigned int, |
218 | const unsigned char *, unsigned int); | 218 | const unsigned char *, unsigned int); |
219 | extern int hfs_compare_dentry(struct dentry *, struct qstr *, struct qstr *); | 219 | extern int hfs_compare_dentry(const struct dentry *parent, |
220 | const struct inode *pinode, | ||
221 | const struct dentry *dentry, const struct inode *inode, | ||
222 | unsigned int len, const char *str, const struct qstr *name); | ||
220 | 223 | ||
221 | /* trans.c */ | 224 | /* trans.c */ |
222 | extern void hfs_asc2mac(struct super_block *, struct hfs_name *, struct qstr *); | 225 | extern void hfs_asc2mac(struct super_block *, struct hfs_name *, struct qstr *); |
diff --git a/fs/hfs/string.c b/fs/hfs/string.c index 927a5af79428..aaf90d0d6940 100644 --- a/fs/hfs/string.c +++ b/fs/hfs/string.c | |||
@@ -92,21 +92,21 @@ int hfs_strcmp(const unsigned char *s1, unsigned int len1, | |||
92 | * Test for equality of two strings in the HFS filename character ordering. | 92 | * Test for equality of two strings in the HFS filename character ordering. |
93 | * return 1 on failure and 0 on success | 93 | * return 1 on failure and 0 on success |
94 | */ | 94 | */ |
95 | int hfs_compare_dentry(struct dentry *dentry, struct qstr *s1, struct qstr *s2) | 95 | int hfs_compare_dentry(const struct dentry *parent, const struct inode *pinode, |
96 | const struct dentry *dentry, const struct inode *inode, | ||
97 | unsigned int len, const char *str, const struct qstr *name) | ||
96 | { | 98 | { |
97 | const unsigned char *n1, *n2; | 99 | const unsigned char *n1, *n2; |
98 | int len; | ||
99 | 100 | ||
100 | len = s1->len; | ||
101 | if (len >= HFS_NAMELEN) { | 101 | if (len >= HFS_NAMELEN) { |
102 | if (s2->len < HFS_NAMELEN) | 102 | if (name->len < HFS_NAMELEN) |
103 | return 1; | 103 | return 1; |
104 | len = HFS_NAMELEN; | 104 | len = HFS_NAMELEN; |
105 | } else if (len != s2->len) | 105 | } else if (len != name->len) |
106 | return 1; | 106 | return 1; |
107 | 107 | ||
108 | n1 = s1->name; | 108 | n1 = str; |
109 | n2 = s2->name; | 109 | n2 = name->name; |
110 | while (len--) { | 110 | while (len--) { |
111 | if (caseorder[*n1++] != caseorder[*n2++]) | 111 | if (caseorder[*n1++] != caseorder[*n2++]) |
112 | return 1; | 112 | return 1; |