diff options
Diffstat (limited to 'fs/reiserfs/super.c')
-rw-r--r-- | fs/reiserfs/super.c | 28 |
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) | |||
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); |
@@ -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; |