aboutsummaryrefslogtreecommitdiffstats
path: root/fs/reiserfs/super.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/reiserfs/super.c')
-rw-r--r--fs/reiserfs/super.c27
1 files changed, 16 insertions, 11 deletions
diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c
index 19c454e61b79..1d42e707d5fa 100644
--- a/fs/reiserfs/super.c
+++ b/fs/reiserfs/super.c
@@ -455,16 +455,20 @@ int remove_save_link(struct inode *inode, int truncate)
455static void reiserfs_kill_sb(struct super_block *s) 455static void reiserfs_kill_sb(struct super_block *s)
456{ 456{
457 if (REISERFS_SB(s)) { 457 if (REISERFS_SB(s)) {
458 if (REISERFS_SB(s)->xattr_root) { 458 /*
459 d_invalidate(REISERFS_SB(s)->xattr_root); 459 * Force any pending inode evictions to occur now. Any
460 dput(REISERFS_SB(s)->xattr_root); 460 * inodes to be removed that have extended attributes
461 REISERFS_SB(s)->xattr_root = NULL; 461 * associated with them need to clean them up before
462 } 462 * we can release the extended attribute root dentries.
463 if (REISERFS_SB(s)->priv_root) { 463 * shrink_dcache_for_umount will BUG if we don't release
464 d_invalidate(REISERFS_SB(s)->priv_root); 464 * those before it's called so ->put_super is too late.
465 dput(REISERFS_SB(s)->priv_root); 465 */
466 REISERFS_SB(s)->priv_root = NULL; 466 shrink_dcache_sb(s);
467 } 467
468 dput(REISERFS_SB(s)->xattr_root);
469 REISERFS_SB(s)->xattr_root = NULL;
470 dput(REISERFS_SB(s)->priv_root);
471 REISERFS_SB(s)->priv_root = NULL;
468 } 472 }
469 473
470 kill_block_super(s); 474 kill_block_super(s);
@@ -1249,7 +1253,8 @@ static void handle_quota_files(struct super_block *s, char **qf_names,
1249 kfree(REISERFS_SB(s)->s_qf_names[i]); 1253 kfree(REISERFS_SB(s)->s_qf_names[i]);
1250 REISERFS_SB(s)->s_qf_names[i] = qf_names[i]; 1254 REISERFS_SB(s)->s_qf_names[i] = qf_names[i];
1251 } 1255 }
1252 REISERFS_SB(s)->s_jquota_fmt = *qfmt; 1256 if (*qfmt)
1257 REISERFS_SB(s)->s_jquota_fmt = *qfmt;
1253} 1258}
1254#endif 1259#endif
1255 1260