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>
This commit is contained in:
@ -34,19 +34,25 @@ static int hpfs_hash_dentry(struct dentry *dentry, struct qstr *qstr)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int hpfs_compare_dentry(struct dentry *dentry, struct qstr *a, struct qstr *b)
|
||||
static int hpfs_compare_dentry(const struct dentry *parent,
|
||||
const struct inode *pinode,
|
||||
const struct dentry *dentry, const struct inode *inode,
|
||||
unsigned int len, const char *str, const struct qstr *name)
|
||||
{
|
||||
unsigned al=a->len;
|
||||
unsigned bl=b->len;
|
||||
hpfs_adjust_length(a->name, &al);
|
||||
unsigned al = len;
|
||||
unsigned bl = name->len;
|
||||
|
||||
hpfs_adjust_length(str, &al);
|
||||
/*hpfs_adjust_length(b->name, &bl);*/
|
||||
/* 'a' is the qstr of an already existing dentry, so the name
|
||||
* must be valid. 'b' must be validated first.
|
||||
|
||||
/*
|
||||
* 'str' is the nane of an already existing dentry, so the name
|
||||
* must be valid. 'name' must be validated first.
|
||||
*/
|
||||
|
||||
if (hpfs_chk_name(b->name, &bl))
|
||||
if (hpfs_chk_name(name->name, &bl))
|
||||
return 1;
|
||||
if (hpfs_compare_names(dentry->d_sb, a->name, al, b->name, bl, 0))
|
||||
if (hpfs_compare_names(parent->d_sb, str, al, name->name, bl, 0))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
Reference in New Issue
Block a user