Chris Worley
2008-Aug-01  03:03 UTC
[Lustre-discuss] __d_rehash and __d_move in ldiskfs in 1.6.5.1 w/ RHEL4 latest security-patch kernel rev 2.6.9-67.0.22
The 1.6.5.1 rhel5 patches patched w/o reject, but, when the ldiskfs
module loads, there are two undefined externls: __d_rehash, and
__d_move.  These are in fs/dcache.c in the kernel.
For __d_rehash their look to be two easy fixes:
1) expose the  static __d_rehash function, or
2) have ldiskfs call d_cond_refresh instead (ldiskfs always calls
__d_rehash with "0" as the second arg.
Which is correct?
The function definitions are:
static void __d_rehash(struct dentry * entry, struct hlist_head *list)
{
        entry->d_flags &= ~DCACHE_UNHASHED;
        entry->d_bucket = list;
        hlist_add_head_rcu(&entry->d_hash, list);
}
...and ...
void d_rehash_cond(struct dentry * entry, int lock)
{
        struct hlist_head *list = d_hash(entry->d_parent,
entry->d_name.hash);
        if (lock)
                spin_lock(&dcache_lock);
        spin_lock(&entry->d_lock);
        entry->d_flags &= ~DCACHE_UNHASHED;
        spin_unlock(&entry->d_lock);
        entry->d_bucket = list;
        hlist_add_head_rcu(&entry->d_hash, list);
        if (lock)
                spin_unlock(&dcache_lock);
}
The second issue is "__d_move".  The likely fix here is to have
ldiskfs call the already exposed "d_move" instead:
void d_move(struct dentry * dentry, struct dentry * target)
{
        spin_lock(&dcache_lock);
        d_move_locked(dentry, target);
        spin_unlock(&dcache_lock);
}
Would that be correct?
Thanks,
Chris