aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/reiserfs/super.c24
1 files changed, 14 insertions, 10 deletions
diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c
index f9eaa4a4f5f3..5e3527be1146 100644
--- a/fs/reiserfs/super.c
+++ b/fs/reiserfs/super.c
@@ -453,16 +453,20 @@ int remove_save_link(struct inode *inode, int truncate)
453static void reiserfs_kill_sb(struct super_block *s) 453static void reiserfs_kill_sb(struct super_block *s)
454{ 454{
455 if (REISERFS_SB(s)) { 455 if (REISERFS_SB(s)) {
456 if (REISERFS_SB(s)->xattr_root) { 456 /*
457 d_invalidate(REISERFS_SB(s)->xattr_root); 457 * Force any pending inode evictions to occur now. Any
458 dput(REISERFS_SB(s)->xattr_root); 458 * inodes to be removed that have extended attributes
459 REISERFS_SB(s)->xattr_root = NULL; 459 * associated with them need to clean them up before
460 } 460 * we can release the extended attribute root dentries.
461 if (REISERFS_SB(s)->priv_root) { 461 * shrink_dcache_for_umount will BUG if we don't release
462 d_invalidate(REISERFS_SB(s)->priv_root); 462 * those before it's called so ->put_super is too late.
463 dput(REISERFS_SB(s)->priv_root); 463 */
464 REISERFS_SB(s)->priv_root = NULL; 464 shrink_dcache_sb(s);
465 } 465
466 dput(REISERFS_SB(s)->xattr_root);
467 REISERFS_SB(s)->xattr_root = NULL;
468 dput(REISERFS_SB(s)->priv_root);
469 REISERFS_SB(s)->priv_root = NULL;
466 } 470 }
467 471
468 kill_block_super(s); 472 kill_block_super(s);