btrfs: fix panic caused by direct IO
btrfs paniced when we write >64KB data by direct IO at one time.
Reproduce steps:
# mkfs.btrfs /dev/sda5 /dev/sda6
# mount /dev/sda5 /mnt
# dd if=/dev/zero of=/mnt/tmpfile bs=100K count=1 oflag=direct
Then btrfs paniced:
mapping failed logical
1103155200 bio len 69632 len 12288
------------[ cut here ]------------
kernel BUG at fs/btrfs/volumes.c:3010!
[SNIP]
Pid: 1992, comm: btrfs-worker-0 Not tainted 2.6.37-rc1 #1 D2399/PRIMERGY
RIP: 0010:[<
ffffffffa03d1462>] [<
ffffffffa03d1462>] btrfs_map_bio+0x202/0x210 [btrfs]
[SNIP]
Call Trace:
[<
ffffffffa03ab3eb>] __btrfs_submit_bio_done+0x1b/0x20 [btrfs]
[<
ffffffffa03a35ff>] run_one_async_done+0x9f/0xb0 [btrfs]
[<
ffffffffa03d3d20>] run_ordered_completions+0x80/0xc0 [btrfs]
[<
ffffffffa03d45a4>] worker_loop+0x154/0x5f0 [btrfs]
[<
ffffffffa03d4450>] ? worker_loop+0x0/0x5f0 [btrfs]
[<
ffffffffa03d4450>] ? worker_loop+0x0/0x5f0 [btrfs]
[<
ffffffff81083216>] kthread+0x96/0xa0
[<
ffffffff8100cec4>] kernel_thread_helper+0x4/0x10
[<
ffffffff81083180>] ? kthread+0x0/0xa0
[<
ffffffff8100cec0>] ? kernel_thread_helper+0x0/0x10
We fix this problem by splitting bios when we submit bios.
Reported-by: Tsutomu Itoh <t-itoh@jp.fujitsu.com>
Signed-off-by: Miao Xie <miaox@cn.fujitsu.com>
Tested-by: Tsutomu Itoh <t-itoh@jp.fujitsu.com>
Signed-off-by: Chris Mason <chris.mason@oracle.com>