diff options
-rw-r--r-- | fs/reiserfs/super.c | 24 |
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) | |||
453 | static void reiserfs_kill_sb(struct super_block *s) | 453 | static 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); |