diff options
author | Wen Congyang <wency@cn.fujitsu.com> | 2010-10-27 21:27:12 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2010-10-27 21:27:12 -0400 |
commit | b853fd364810a241050778124842a8c415c72a69 (patch) | |
tree | 5fbc9f7ed51db48f9ef68343f69fa5b5b537a901 /include/trace | |
parent | 39e3ac2599a5f9aba499b5f8af809108e70a6163 (diff) | |
download | kernel-common-b853fd364810a241050778124842a8c415c72a69.tar.gz kernel-common-b853fd364810a241050778124842a8c415c72a69.tar.bz2 kernel-common-b853fd364810a241050778124842a8c415c72a69.zip |
ext4: avoid null dereference in trace_ext4_mballoc_discard
ac->inode is set to null in function ext4_mb_release_group_pa(),
and then trace_ext4_mballoc_discard(ac) is called, the kernel
will panic.
BUG: unable to handle kernel NULL pointer dereference at 000000a4
IP: [<f87e1714>] ftrace_raw_event_ext4__mballoc+0x54/0xc0 [ext4]
*pdpt = 0000000000abd001 *pde = 0000000000000000
Oops: 0000 [#1] SMP
Pid: 550, comm: flush-8:16 Not tainted 2.6.36-rc1 #1 SE7320EP2/Altos G530
EIP: 0060:[<f87e1714>] EFLAGS: 00010206 CPU: 1
EIP is at ftrace_raw_event_ext4__mballoc+0x54/0xc0 [ext4]
EAX: f32ac840 EBX: f3f1cf88 ECX: f32ac840 EDX: 00000000
ESI: f32ac83c EDI: f880b9d8 EBP: 00000000 ESP: f4b77ae4
DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068
Process flush-8:16 (pid: 550, ti=f4b76000 task=f613e540 task.ti=f4b76000)
Call Trace:
[<f87f5ac1>] ? ext4_mb_release_group_pa+0x121/0x150 [ext4]
[<f87f8356>] ? ext4_mb_discard_group_preallocations+0x336/0x400 [ext4]
[<f87fb7f1>] ? ext4_mb_new_blocks+0x3d1/0x4f0 [ext4]
[<c05a6c5b>] ? __make_request+0x10b/0x440
[<f87f1fb4>] ? ext4_ext_map_blocks+0x1334/0x1980 [ext4]
[<c04ac78a>] ? rb_reserve_next_event+0xaa/0x3b0
[<f87d18d6>] ? ext4_map_blocks+0xd6/0x1d0 [ext4]
[<f87d2da7>] ? mpage_da_map_blocks+0xc7/0x8a0 [ext4]
[<c04c8a68>] ? find_get_pages_tag+0x38/0x110
[<c04d23a5>] ? __pagevec_release+0x15/0x20
[<f87d3ca5>] ? ext4_da_writepages+0x2b5/0x5d0 [ext4]
[<c04cfbe0>] ? __writepage+0x0/0x30
[<c04d0e34>] ? do_writepages+0x14/0x30
[<c0526600>] ? writeback_single_inode+0xa0/0x240
[<c0526971>] ? writeback_sb_inodes+0xc1/0x180
[<c0526ab8>] ? writeback_inodes_wb+0x88/0x140
[<c0526d7b>] ? wb_writeback+0x20b/0x320
[<c045aca7>] ? lock_timer_base+0x27/0x50
[<c0526fe0>] ? wb_do_writeback+0x150/0x190
[<c05270a8>] ? bdi_writeback_thread+0x88/0x1f0
[<c043b680>] ? complete+0x40/0x60
[<c0527020>] ? bdi_writeback_thread+0x0/0x1f0
[<c0469474>] ? kthread+0x74/0x80
[<c0469400>] ? kthread+0x0/0x80
[<c040a23e>] ? kernel_thread_helper+0x6/0x10
Signed-off-by: Wen Congyang <wency@cn.fujitsu.com>
Acked-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Diffstat (limited to 'include/trace')
-rw-r--r-- | include/trace/events/ext4.h | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/include/trace/events/ext4.h b/include/trace/events/ext4.h index 01e9e0076a92..6a1fcff95f7c 100644 --- a/include/trace/events/ext4.h +++ b/include/trace/events/ext4.h @@ -796,8 +796,9 @@ DECLARE_EVENT_CLASS(ext4__mballoc, ), TP_fast_assign( - __entry->dev = ac->ac_inode->i_sb->s_dev; - __entry->ino = ac->ac_inode->i_ino; + __entry->dev = ac->ac_sb->s_dev; + __entry->ino = ac->ac_inode ? + ac->ac_inode->i_ino : 0; __entry->result_logical = ac->ac_b_ex.fe_logical; __entry->result_start = ac->ac_b_ex.fe_start; __entry->result_group = ac->ac_b_ex.fe_group; |