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/hpfs | |
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/hpfs')
-rw-r--r-- | fs/hpfs/dentry.c | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/fs/hpfs/dentry.c b/fs/hpfs/dentry.c index 67d9d36b3d5f..dd9b1e74a734 100644 --- a/fs/hpfs/dentry.c +++ b/fs/hpfs/dentry.c | |||
@@ -34,19 +34,25 @@ static int hpfs_hash_dentry(struct dentry *dentry, struct qstr *qstr) | |||
34 | return 0; | 34 | return 0; |
35 | } | 35 | } |
36 | 36 | ||
37 | static int hpfs_compare_dentry(struct dentry *dentry, struct qstr *a, struct qstr *b) | 37 | static int hpfs_compare_dentry(const struct dentry *parent, |
38 | const struct inode *pinode, | ||
39 | const struct dentry *dentry, const struct inode *inode, | ||
40 | unsigned int len, const char *str, const struct qstr *name) | ||
38 | { | 41 | { |
39 | unsigned al=a->len; | 42 | unsigned al = len; |
40 | unsigned bl=b->len; | 43 | unsigned bl = name->len; |
41 | hpfs_adjust_length(a->name, &al); | 44 | |
45 | hpfs_adjust_length(str, &al); | ||
42 | /*hpfs_adjust_length(b->name, &bl);*/ | 46 | /*hpfs_adjust_length(b->name, &bl);*/ |
43 | /* 'a' is the qstr of an already existing dentry, so the name | 47 | |
44 | * must be valid. 'b' must be validated first. | 48 | /* |
49 | * 'str' is the nane of an already existing dentry, so the name | ||
50 | * must be valid. 'name' must be validated first. | ||
45 | */ | 51 | */ |
46 | 52 | ||
47 | if (hpfs_chk_name(b->name, &bl)) | 53 | if (hpfs_chk_name(name->name, &bl)) |
48 | return 1; | 54 | return 1; |
49 | if (hpfs_compare_names(dentry->d_sb, a->name, al, b->name, bl, 0)) | 55 | if (hpfs_compare_names(parent->d_sb, str, al, name->name, bl, 0)) |
50 | return 1; | 56 | return 1; |
51 | return 0; | 57 | return 0; |
52 | } | 58 | } |