diff options
Diffstat (limited to 'fs/ext3/super.c')
-rw-r--r-- | fs/ext3/super.c | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/fs/ext3/super.c b/fs/ext3/super.c index 3a260af5544d..cac29ee3b14a 100644 --- a/fs/ext3/super.c +++ b/fs/ext3/super.c | |||
@@ -393,7 +393,8 @@ static void ext3_put_super (struct super_block * sb) | |||
393 | int i; | 393 | int i; |
394 | 394 | ||
395 | ext3_xattr_put_super(sb); | 395 | ext3_xattr_put_super(sb); |
396 | journal_destroy(sbi->s_journal); | 396 | if (journal_destroy(sbi->s_journal) < 0) |
397 | ext3_abort(sb, __func__, "Couldn't clean up the journal"); | ||
397 | if (!(sb->s_flags & MS_RDONLY)) { | 398 | if (!(sb->s_flags & MS_RDONLY)) { |
398 | EXT3_CLEAR_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_RECOVER); | 399 | EXT3_CLEAR_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_RECOVER); |
399 | es->s_state = cpu_to_le16(sbi->s_mount_state); | 400 | es->s_state = cpu_to_le16(sbi->s_mount_state); |
@@ -2296,7 +2297,9 @@ static void ext3_mark_recovery_complete(struct super_block * sb, | |||
2296 | journal_t *journal = EXT3_SB(sb)->s_journal; | 2297 | journal_t *journal = EXT3_SB(sb)->s_journal; |
2297 | 2298 | ||
2298 | journal_lock_updates(journal); | 2299 | journal_lock_updates(journal); |
2299 | journal_flush(journal); | 2300 | if (journal_flush(journal) < 0) |
2301 | goto out; | ||
2302 | |||
2300 | lock_super(sb); | 2303 | lock_super(sb); |
2301 | if (EXT3_HAS_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_RECOVER) && | 2304 | if (EXT3_HAS_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_RECOVER) && |
2302 | sb->s_flags & MS_RDONLY) { | 2305 | sb->s_flags & MS_RDONLY) { |
@@ -2305,6 +2308,8 @@ static void ext3_mark_recovery_complete(struct super_block * sb, | |||
2305 | ext3_commit_super(sb, es, 1); | 2308 | ext3_commit_super(sb, es, 1); |
2306 | } | 2309 | } |
2307 | unlock_super(sb); | 2310 | unlock_super(sb); |
2311 | |||
2312 | out: | ||
2308 | journal_unlock_updates(journal); | 2313 | journal_unlock_updates(journal); |
2309 | } | 2314 | } |
2310 | 2315 | ||
@@ -2404,7 +2409,13 @@ static void ext3_write_super_lockfs(struct super_block *sb) | |||
2404 | 2409 | ||
2405 | /* Now we set up the journal barrier. */ | 2410 | /* Now we set up the journal barrier. */ |
2406 | journal_lock_updates(journal); | 2411 | journal_lock_updates(journal); |
2407 | journal_flush(journal); | 2412 | |
2413 | /* | ||
2414 | * We don't want to clear needs_recovery flag when we failed | ||
2415 | * to flush the journal. | ||
2416 | */ | ||
2417 | if (journal_flush(journal) < 0) | ||
2418 | return; | ||
2408 | 2419 | ||
2409 | /* Journal blocked and flushed, clear needs_recovery flag. */ | 2420 | /* Journal blocked and flushed, clear needs_recovery flag. */ |
2410 | EXT3_CLEAR_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_RECOVER); | 2421 | EXT3_CLEAR_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_RECOVER); |
@@ -2822,8 +2833,12 @@ static int ext3_quota_on(struct super_block *sb, int type, int format_id, | |||
2822 | * otherwise be livelocked... | 2833 | * otherwise be livelocked... |
2823 | */ | 2834 | */ |
2824 | journal_lock_updates(EXT3_SB(sb)->s_journal); | 2835 | journal_lock_updates(EXT3_SB(sb)->s_journal); |
2825 | journal_flush(EXT3_SB(sb)->s_journal); | 2836 | err = journal_flush(EXT3_SB(sb)->s_journal); |
2826 | journal_unlock_updates(EXT3_SB(sb)->s_journal); | 2837 | journal_unlock_updates(EXT3_SB(sb)->s_journal); |
2838 | if (err) { | ||
2839 | path_put(&nd.path); | ||
2840 | return err; | ||
2841 | } | ||
2827 | } | 2842 | } |
2828 | 2843 | ||
2829 | err = vfs_quota_on_path(sb, type, format_id, &nd.path); | 2844 | err = vfs_quota_on_path(sb, type, format_id, &nd.path); |