diff options
author | Jan Kara <jack@suse.cz> | 2013-05-13 09:45:01 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2013-05-13 09:45:01 -0400 |
commit | e2555fde4159467fb579e6ae3c0a8fc33015d0f5 (patch) | |
tree | aacf8fc79d3180a2bd2bf265f1fb362e7b2b4c50 /include | |
parent | a549984b8c95acbecefd1fdd4bfdbea4d29b0588 (diff) |
jbd,jbd2: fix oops in jbd2_journal_put_journal_head()
Commit ae4647fb (jbd2: reduce journal_head size) introduced a
regression where we occasionally hit panic in
jbd2_journal_put_journal_head() because of wrong b_jcount. The bug is
caused by gcc making 64-bit access to 32-bit bitfield and thus
clobbering b_jcount.
At least for now, those 8 bytes saved in struct journal_head are not
worth the trouble with gcc bitfield handling so revert that part of
the patch.
Reported-by: EUNBONG SONG <eunb.song@samsung.com>
Reported-by: Tony Luck <tony.luck@gmail.com>
Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/journal-head.h | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/include/linux/journal-head.h b/include/linux/journal-head.h index 13a3da25ff07..98cd41bb39c8 100644 --- a/include/linux/journal-head.h +++ b/include/linux/journal-head.h | |||
@@ -30,15 +30,19 @@ struct journal_head { | |||
30 | 30 | ||
31 | /* | 31 | /* |
32 | * Journalling list for this buffer [jbd_lock_bh_state()] | 32 | * Journalling list for this buffer [jbd_lock_bh_state()] |
33 | * NOTE: We *cannot* combine this with b_modified into a bitfield | ||
34 | * as gcc would then (which the C standard allows but which is | ||
35 | * very unuseful) make 64-bit accesses to the bitfield and clobber | ||
36 | * b_jcount if its update races with bitfield modification. | ||
33 | */ | 37 | */ |
34 | unsigned b_jlist:4; | 38 | unsigned b_jlist; |
35 | 39 | ||
36 | /* | 40 | /* |
37 | * This flag signals the buffer has been modified by | 41 | * This flag signals the buffer has been modified by |
38 | * the currently running transaction | 42 | * the currently running transaction |
39 | * [jbd_lock_bh_state()] | 43 | * [jbd_lock_bh_state()] |
40 | */ | 44 | */ |
41 | unsigned b_modified:1; | 45 | unsigned b_modified; |
42 | 46 | ||
43 | /* | 47 | /* |
44 | * Copy of the buffer data frozen for writing to the log. | 48 | * Copy of the buffer data frozen for writing to the log. |