{
struct dentry *dentry, *tmp_alias, *tmp_subdir;
+ spin_lock(&ll_lookup_lock);
spin_lock(&dcache_lock);
restart:
list_for_each_entry_safe(dentry, tmp_alias,
}
}
spin_unlock(&dcache_lock);
+ spin_unlock(&ll_lookup_lock);
}
int ll_mdc_blocking_ast(struct ldlm_lock *lock, struct ldlm_lock_desc *desc,
struct dentry *dentry;
struct dentry *last_discon = NULL;
+ spin_lock(&ll_lookup_lock);
spin_lock(&dcache_lock);
list_for_each(tmp, &inode->i_dentry) {
dentry = list_entry(tmp, struct dentry, d_alias);
unlock_dentry(dentry);
d_rehash_cond(dentry, 0); /* avoid taking dcache_lock inside */
spin_unlock(&dcache_lock);
+ spin_unlock(&ll_lookup_lock);
iput(inode);
CDEBUG(D_DENTRY, "alias dentry %.*s (%p) parent %p inode %p "
"refc %d\n", de->d_name.len, de->d_name.name, de,
spin_unlock(&dcache_lock);
d_rehash(de);
d_move(last_discon, de);
+ spin_unlock(&ll_lookup_lock);
+
iput(inode);
return last_discon;
}
ll_d_add(de, inode);
spin_unlock(&dcache_lock);
+ spin_unlock(&ll_lookup_lock);
return de;
}