|
@@ -453,16 +453,20 @@ int remove_save_link(struct inode *inode, int truncate)
|
|
|
static void reiserfs_kill_sb(struct super_block *s)
|
|
|
{
|
|
|
if (REISERFS_SB(s)) {
|
|
|
- if (REISERFS_SB(s)->xattr_root) {
|
|
|
- d_invalidate(REISERFS_SB(s)->xattr_root);
|
|
|
- dput(REISERFS_SB(s)->xattr_root);
|
|
|
- REISERFS_SB(s)->xattr_root = NULL;
|
|
|
- }
|
|
|
- if (REISERFS_SB(s)->priv_root) {
|
|
|
- d_invalidate(REISERFS_SB(s)->priv_root);
|
|
|
- dput(REISERFS_SB(s)->priv_root);
|
|
|
- REISERFS_SB(s)->priv_root = NULL;
|
|
|
- }
|
|
|
+ /*
|
|
|
+ * Force any pending inode evictions to occur now. Any
|
|
|
+ * inodes to be removed that have extended attributes
|
|
|
+ * associated with them need to clean them up before
|
|
|
+ * we can release the extended attribute root dentries.
|
|
|
+ * shrink_dcache_for_umount will BUG if we don't release
|
|
|
+ * those before it's called so ->put_super is too late.
|
|
|
+ */
|
|
|
+ shrink_dcache_sb(s);
|
|
|
+
|
|
|
+ dput(REISERFS_SB(s)->xattr_root);
|
|
|
+ REISERFS_SB(s)->xattr_root = NULL;
|
|
|
+ dput(REISERFS_SB(s)->priv_root);
|
|
|
+ REISERFS_SB(s)->priv_root = NULL;
|
|
|
}
|
|
|
|
|
|
kill_block_super(s);
|