Add Jan Kara's ext4 data corruption bugs for blocksize < pagesize
[ext4-patch-queue.git] / jbd2_log_wait_for_space-improve-error-detection
bloba54e42b046d74397b2270b2ae436e1e757e8233a
1 jbd2: jbd2_log_wait_for_space improve error detetcion
3 From: Dmitry Monakhov <dmonakhov@openvz.org>
5 If EIO happens after we have dropped j_state_lock, we won't notice
6 that the journal has been aborted.  So it is reasonable to move this
7 check after we have grabbed the j_checkpoint_mutex and re-grabbed the
8 j_state_lock.  This patch helps to prevent false positive complain
9 after EIO.
11 #DMESG:
12 __jbd2_log_wait_for_space: needed 8448 blocks and only had 8386 space available
13 __jbd2_log_wait_for_space: no way to get more journal space in ram1-8
14 ------------[ cut here ]------------
15 WARNING: CPU: 15 PID: 6739 at fs/jbd2/checkpoint.c:168 __jbd2_log_wait_for_space+0x188/0x200()
16 Modules linked in: brd iTCO_wdt lpc_ich mfd_core igb ptp dm_mirror dm_region_hash dm_log dm_mod
17 CPU: 15 PID: 6739 Comm: fsstress Tainted: G        W      3.17.0-rc2-00429-g684de57 #139
18 Hardware name: Intel Corporation W2600CR/W2600CR, BIOS SE5C600.86B.99.99.x028.061320111235 06/13/2011
19  00000000000000a8 ffff88077aaab878 ffffffff815c1a8c 00000000000000a8
20  0000000000000000 ffff88077aaab8b8 ffffffff8106ce8c ffff88077aaab898
21  ffff8807c57e6000 ffff8807c57e6028 0000000000002100 ffff8807c57e62f0
22 Call Trace:
23  [<ffffffff815c1a8c>] dump_stack+0x51/0x6d
24  [<ffffffff8106ce8c>] warn_slowpath_common+0x8c/0xc0
25  [<ffffffff8106ceda>] warn_slowpath_null+0x1a/0x20
26  [<ffffffff812419f8>] __jbd2_log_wait_for_space+0x188/0x200
27  [<ffffffff8123be9a>] start_this_handle+0x4da/0x7b0
28  [<ffffffff810990e5>] ? local_clock+0x25/0x30
29  [<ffffffff810aba87>] ? lockdep_init_map+0xe7/0x180
30  [<ffffffff8123c5bc>] jbd2__journal_start+0xdc/0x1d0
31  [<ffffffff811f2414>] ? __ext4_new_inode+0x7f4/0x1330
32  [<ffffffff81222a38>] __ext4_journal_start_sb+0xf8/0x110
33  [<ffffffff811f2414>] __ext4_new_inode+0x7f4/0x1330
34  [<ffffffff810ac359>] ? lock_release_holdtime+0x29/0x190
35  [<ffffffff812025bb>] ext4_create+0x8b/0x150
36  [<ffffffff8117fe3b>] vfs_create+0x7b/0xb0
37  [<ffffffff8118097b>] do_last+0x7db/0xcf0
38  [<ffffffff8117e31d>] ? inode_permission+0x4d/0x50
39  [<ffffffff811845d2>] path_openat+0x242/0x590
40  [<ffffffff81191a76>] ? __alloc_fd+0x36/0x140
41  [<ffffffff81184a6a>] do_filp_open+0x4a/0xb0
42  [<ffffffff81191b61>] ? __alloc_fd+0x121/0x140
43  [<ffffffff81172f20>] do_sys_open+0x170/0x220
44  [<ffffffff8117300e>] SyS_open+0x1e/0x20
45  [<ffffffff811715d6>] SyS_creat+0x16/0x20
46  [<ffffffff815c7e12>] system_call_fastpath+0x16/0x1b
47 ---[ end trace cd71c831f82059db ]---
49 Signed-off-by: Dmitry Monakhov <dmonakhov@openvz.org>
50 Signed-off-by: Theodore Ts'o <tytso@mit.edu>
51 ---
52  fs/jbd2/checkpoint.c | 6 ++++--
53  1 file changed, 4 insertions(+), 2 deletions(-)
55 diff --git a/fs/jbd2/checkpoint.c b/fs/jbd2/checkpoint.c
56 index 9ffb19c..1fbf599 100644
57 --- a/fs/jbd2/checkpoint.c
58 +++ b/fs/jbd2/checkpoint.c
59 @@ -115,8 +115,6 @@ void __jbd2_log_wait_for_space(journal_t *journal)
61         nblocks = jbd2_space_needed(journal);
62         while (jbd2_log_space_left(journal) < nblocks) {
63 -               if (journal->j_flags & JBD2_ABORT)
64 -                       return;
65                 write_unlock(&journal->j_state_lock);
66                 mutex_lock(&journal->j_checkpoint_mutex);
68 @@ -132,6 +130,10 @@ void __jbd2_log_wait_for_space(journal_t *journal)
69                  * trace for forensic evidence.
70                  */
71                 write_lock(&journal->j_state_lock);
72 +               if (journal->j_flags & JBD2_ABORT) {
73 +                       mutex_unlock(&journal->j_checkpoint_mutex);
74 +                       return;
75 +               }
76                 spin_lock(&journal->j_list_lock);
77                 nblocks = jbd2_space_needed(journal);
78                 space_left = jbd2_log_space_left(journal);