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.c28
1 files changed, 17 insertions, 11 deletions
diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c
index aa91089162c..5e3527be114 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);
@@ -1164,7 +1168,8 @@ static void handle_quota_files(struct super_block *s, char **qf_names,
1164 kfree(REISERFS_SB(s)->s_qf_names[i]); 1168 kfree(REISERFS_SB(s)->s_qf_names[i]);
1165 REISERFS_SB(s)->s_qf_names[i] = qf_names[i]; 1169 REISERFS_SB(s)->s_qf_names[i] = qf_names[i];
1166 } 1170 }
1167 REISERFS_SB(s)->s_jquota_fmt = *qfmt; 1171 if (*qfmt)
1172 REISERFS_SB(s)->s_jquota_fmt = *qfmt;
1168} 1173}
1169#endif 1174#endif
1170 1175
@@ -1643,6 +1648,7 @@ static int reiserfs_fill_super(struct super_block *s, void *data, int silent)
1643 /* Set default values for options: non-aggressive tails, RO on errors */ 1648 /* Set default values for options: non-aggressive tails, RO on errors */
1644 REISERFS_SB(s)->s_mount_opt |= (1 << REISERFS_SMALLTAIL); 1649 REISERFS_SB(s)->s_mount_opt |= (1 << REISERFS_SMALLTAIL);
1645 REISERFS_SB(s)->s_mount_opt |= (1 << REISERFS_ERROR_RO); 1650 REISERFS_SB(s)->s_mount_opt |= (1 << REISERFS_ERROR_RO);
1651 REISERFS_SB(s)->s_mount_opt |= (1 << REISERFS_BARRIER_FLUSH);
1646 /* no preallocation minimum, be smart in 1652 /* no preallocation minimum, be smart in
1647 reiserfs_file_write instead */ 1653 reiserfs_file_write instead */
1648 REISERFS_SB(s)->s_alloc_options.preallocmin = 0; 1654 REISERFS_SB(s)->s_alloc_options.preallocmin = 0;