diff --git a/drivers/staging/lustre/lustre/llite/dcache.c b/drivers/staging/lustre/lustre/llite/dcache.c index e048538d45e6..7d6abfff9740 100644 --- a/drivers/staging/lustre/lustre/llite/dcache.c +++ b/drivers/staging/lustre/lustre/llite/dcache.c @@ -303,7 +303,7 @@ void ll_invalidate_aliases(struct inode *inode) libcfs_debug_dumpstack(NULL); } - d_lustre_invalidate(dentry); + d_lustre_invalidate(dentry, 0); } ll_unlock_dcache(inode); diff --git a/drivers/staging/lustre/lustre/llite/file.c b/drivers/staging/lustre/lustre/llite/file.c index be423171646f..ed1e3f7b4e58 100644 --- a/drivers/staging/lustre/lustre/llite/file.c +++ b/drivers/staging/lustre/lustre/llite/file.c @@ -2563,7 +2563,7 @@ int __ll_inode_revalidate_it(struct dentry *dentry, struct lookup_intent *it, here to preserve get_cwd functionality on 2.6. Bug 10503 */ if (!dentry->d_inode->i_nlink) - d_lustre_invalidate(dentry); + d_lustre_invalidate(dentry, 0); ll_lookup_finish_locks(&oit, dentry); } else if (!ll_have_md_lock(dentry->d_inode, &ibits, LCK_MINMODE)) { diff --git a/drivers/staging/lustre/lustre/llite/llite_internal.h b/drivers/staging/lustre/lustre/llite/llite_internal.h index e972a822b8f5..992cd203ca1a 100644 --- a/drivers/staging/lustre/lustre/llite/llite_internal.h +++ b/drivers/staging/lustre/lustre/llite/llite_internal.h @@ -1525,13 +1525,14 @@ static inline void __d_lustre_invalidate(struct dentry *dentry) * ll_md_blocking_ast), unhash this dentry, and let dcache to reclaim it later; * else dput() of the last refcount will unhash this dentry and kill it. */ -static inline void d_lustre_invalidate(struct dentry *dentry) +static inline void d_lustre_invalidate(struct dentry *dentry, int nested) { CDEBUG(D_DENTRY, "invalidate dentry %.*s (%p) parent %p inode %p " "refc %d\n", dentry->d_name.len, dentry->d_name.name, dentry, dentry->d_parent, dentry->d_inode, d_refcount(dentry)); - spin_lock(&dentry->d_lock); + spin_lock_nested(&dentry->d_lock, + nested ? DENTRY_D_LOCK_NESTED : DENTRY_D_LOCK_NORMAL); __d_lustre_invalidate(dentry); if (d_refcount(dentry) == 0) __d_drop(dentry); diff --git a/drivers/staging/lustre/lustre/llite/namei.c b/drivers/staging/lustre/lustre/llite/namei.c index e6b3f54abbe3..58d59aa12619 100644 --- a/drivers/staging/lustre/lustre/llite/namei.c +++ b/drivers/staging/lustre/lustre/llite/namei.c @@ -187,7 +187,7 @@ static void ll_invalidate_negative_children(struct inode *dir) &dentry->d_subdirs, d_u.d_child) { if (child->d_inode == NULL) - d_lustre_invalidate(child); + d_lustre_invalidate(child, 1); } } spin_unlock(&dentry->d_lock);