From: Neil Brown and myself.
Don't do dput() inside read_lock(). It can sleep.
dget(dentry);
exp = exp_get_by_name(clp, mnt, dentry, reqp);
- while (exp == NULL && dentry != dentry->d_parent) {
+ while (exp == NULL && !IS_ROOT(dentry)) {
struct dentry *parent;
read_lock(&dparent_lock);
parent = dget(dentry->d_parent);
+ read_unlock(&dparent_lock);
dput(dentry);
dentry = parent;
- read_unlock(&dparent_lock);
exp = exp_get_by_name(clp, mnt, dentry, reqp);
}
dput(dentry);