linux-btrfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] btrfs: clear bio reference after submit_one_bio()
@ 2015-01-05 16:01 Naohiro Aota
  2015-01-06 22:46 ` Satoru Takeuchi
  0 siblings, 1 reply; 5+ messages in thread
From: Naohiro Aota @ 2015-01-05 16:01 UTC (permalink / raw)
  To: linux-btrfs; +Cc: linux-kernel, Naohiro Aota

After submit_one_bio(), `bio' can go away. However submit_extent_page()
leave `bio' referable if submit_one_bio() failed (e.g. -ENOMEM on OOM).
It will cause invalid paging request when submit_extent_page() is called
next time.

I reproduced ENOMEM case with the following script (need
CONFIG_FAIL_PAGE_ALLOC, and CONFIG_FAULT_INJECTION_DEBUG_FS).

  #!/bin/bash

  dmesgout=dmesg.txt
  start=100000
  end=300000
  step=1000

  # btrfs options
  device=/dev/vdb1
  directory=/mnt/btrfs

  # fault-injection options
  percent=100
  times=3

  mkdir -p $directory || exit 1
  mount -o compress $device $directory || exit 1

  rm -f $directory/file || exit 1
  dd if=/dev/zero of=$directory/file bs=1M count=512 || exit 1

  for interval in `seq $start $step $end`; do
          dmesg -C
          echo 1 > /proc/sys/vm/drop_caches
          sync
          export FAILCMD_TYPE=fail_page_alloc
          ./failcmd.sh -p $percent -t $times -i $interval \
                  --ignore-gfp-highmem=N --ignore-gfp-wait=N --min-order=0 \
                  -- \
                  cat $directory/file > /dev/null
          dmesg > ${dmesgout}
          if grep -q BUG: ${dmesgout}; then
                  cat ${dmesgout}
                  exit 1
          fi
  done

  umount $directory
  exit 0

Signed-off-by: Naohiro Aota <naota@elisp.net>
---
 fs/btrfs/extent_io.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index 4ebabd2..4421161 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -2816,8 +2816,10 @@ static int submit_extent_page(int rw, struct extent_io_tree *tree,
 		    bio_add_page(bio, page, page_size, offset) < page_size) {
 			ret = submit_one_bio(rw, bio, mirror_num,
 					     prev_bio_flags);
-			if (ret < 0)
+			if (ret < 0) {
+				*bio_ret = NULL;
 				return ret;
+			}
 			bio = NULL;
 		} else {
 			return 0;
-- 
2.2.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH] btrfs: clear bio reference after submit_one_bio()
  2015-01-05 16:01 [PATCH] btrfs: clear bio reference after submit_one_bio() Naohiro Aota
@ 2015-01-06 22:46 ` Satoru Takeuchi
  2015-10-11 18:09   ` Alex Lyakas
  0 siblings, 1 reply; 5+ messages in thread
From: Satoru Takeuchi @ 2015-01-06 22:46 UTC (permalink / raw)
  To: Naohiro Aota, linux-btrfs; +Cc: linux-kernel

Hi Naota,

On 2015/01/06 1:01, Naohiro Aota wrote:
> After submit_one_bio(), `bio' can go away. However submit_extent_page()
> leave `bio' referable if submit_one_bio() failed (e.g. -ENOMEM on OOM).
> It will cause invalid paging request when submit_extent_page() is called
> next time.
> 
> I reproduced ENOMEM case with the following script (need
> CONFIG_FAIL_PAGE_ALLOC, and CONFIG_FAULT_INJECTION_DEBUG_FS).

I confirmed that this problem reproduce with 3.19-rc3 and
not reproduce with 3.19-rc3 with your patch.

Tested-by: Satoru Takeuchi <takeuchi_satoru@jp.fujitsu.com>

Thank you for reporting this problem with the reproducer
and fixing it too.

  NOTE:
  I used v3.19-rc3's tools/testing/fault-injection/failcmd.sh
  for the following "./failcmd.sh".

  >            ./failcmd.sh -p $percent -t $times -i $interval \
  >                    --ignore-gfp-highmem=N --ignore-gfp-wait=N --min-order=0 \
  >                    -- \
  >                    cat $directory/file > /dev/null

* 3.19-rc1 + your patch

===============================================================================
# ./run
512+0 records in
512+0 records out
# 
===============================================================================

* 3.19-rc3

===============================================================================
# ./run
512+0 records in
512+0 records out
[  188.433726] run (776): drop_caches: 1
[  188.682372] FAULT_INJECTION: forcing a failure.
name fail_page_alloc, interval 100, probability 111000, space 0, times 3
[  188.689986] CPU: 0 PID: 954 Comm: cat Not tainted 3.19.0-rc3-ktest #1
[  188.693834] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Bochs 01/01/2011
[  188.698466]  0000000000000064 ffff88007b343618 ffffffff816e5563 ffff88007fc0fc78
[  188.702730]  ffffffff81c655c0 ffff88007b343638 ffffffff813851b5 0000000000000010
[  188.707043]  0000000000000002 ffff88007b343768 ffffffff81188126 ffff88007b3435a8
[  188.711283] Call Trace:
[  188.712620]  [<ffffffff816e5563>] dump_stack+0x45/0x57
[  188.715330]  [<ffffffff813851b5>] should_fail+0x135/0x140
[  188.718218]  [<ffffffff81188126>] __alloc_pages_nodemask+0xd6/0xb30
[  188.721567]  [<ffffffff81339075>] ? blk_rq_map_sg+0x35/0x170
[  188.724558]  [<ffffffffa0010705>] ? virtio_queue_rq+0x145/0x2b0 [virtio_blk]
[  188.728191]  [<ffffffffa01bd00f>] ? btrfs_submit_compressed_read+0xcf/0x4d0 [btrfs]
[  188.732079]  [<ffffffff811d99fb>] ? kmem_cache_alloc+0x1cb/0x230
[  188.735153]  [<ffffffff81181265>] ? mempool_alloc_slab+0x15/0x20
[  188.738188]  [<ffffffff811cee1a>] alloc_pages_current+0x9a/0x120
[  188.741153]  [<ffffffffa01bd0e9>] btrfs_submit_compressed_read+0x1a9/0x4d0 [btrfs]
[  188.744835]  [<ffffffffa0178621>] btrfs_submit_bio_hook+0x1c1/0x1d0 [btrfs]
[  188.748225]  [<ffffffffa018b7b3>] ? lookup_extent_mapping+0x13/0x20 [btrfs]
[  188.751547]  [<ffffffffa0179c08>] ? btrfs_get_extent+0x98/0xad0 [btrfs]
[  188.754656]  [<ffffffffa01901d7>] submit_one_bio+0x67/0xa0 [btrfs]
[  188.757554]  [<ffffffffa0193f27>] submit_extent_page.isra.35+0xd7/0x1c0 [btrfs]
[  188.760981]  [<ffffffffa019509d>] __do_readpage+0x31d/0x7b0 [btrfs]
[  188.763920]  [<ffffffffa0195f10>] ? btrfs_create_repair_bio+0x110/0x110 [btrfs]
[  188.767382]  [<ffffffffa0179b70>] ? btrfs_submit_direct+0x7b0/0x7b0 [btrfs]
[  188.770671]  [<ffffffffa018f88d>] ? btrfs_lookup_ordered_range+0x13d/0x180 [btrfs]
[  188.774366]  [<ffffffffa01958ca>] __extent_readpages.constprop.42+0x2ba/0x2d0 [btrfs]
[  188.778031]  [<ffffffffa0179b70>] ? btrfs_submit_direct+0x7b0/0x7b0 [btrfs]
[  188.781241]  [<ffffffffa01969b9>] extent_readpages+0x169/0x1b0 [btrfs]
[  188.784322]  [<ffffffffa0179b70>] ? btrfs_submit_direct+0x7b0/0x7b0 [btrfs]
[  188.789014]  [<ffffffffa0176b0f>] btrfs_readpages+0x1f/0x30 [btrfs]
[  188.792028]  [<ffffffff8118bf5c>] __do_page_cache_readahead+0x18c/0x1f0
[  188.795078]  [<ffffffff8118c09f>] ondemand_readahead+0xdf/0x260
[  188.797702]  [<ffffffffa016c5df>] ? btrfs_congested_fn+0x5f/0xa0 [btrfs]
[  188.800718]  [<ffffffff8118c291>] page_cache_async_readahead+0x71/0xa0
[  188.803650]  [<ffffffff8118017f>] generic_file_read_iter+0x40f/0x5e0
[  188.806480]  [<ffffffff811f43be>] new_sync_read+0x7e/0xb0
[  188.808832]  [<ffffffff811f55d8>] __vfs_read+0x18/0x50
[  188.811068]  [<ffffffff811f569a>] vfs_read+0x8a/0x140
[  188.813298]  [<ffffffff811f5796>] SyS_read+0x46/0xb0
[  188.815486]  [<ffffffff81125806>] ? __audit_syscall_exit+0x1f6/0x2a0
[  188.818293]  [<ffffffff816eb8e9>] system_call_fastpath+0x12/0x17
[  188.821005] BUG: unable to handle kernel paging request at 000000010000000c
[  188.821984] IP: [<ffffffffa01901b3>] submit_one_bio+0x43/0xa0 [btrfs]
[  188.821984] PGD 7bad3067 PUD 0 
[  188.821984] Oops: 0000 [#1] SMP 
[  188.821984] Modules linked in: ip6table_filter ip6_tables ebtable_nat ebtables bnep bluetooth rfkill btrfs xor raid6_pq microcode 8139too serio_raw virtio_balloon 8139cp mii nfsd auth_rpcgss nfs_acl lockd grace sunrpc virtio_blk ata_generic pata_acpi
[  188.821984] CPU: 1 PID: 954 Comm: cat Not tainted 3.19.0-rc3-ktest #1
[  188.821984] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Bochs 01/01/2011
[  188.821984] task: ffff880037665220 ti: ffff88007b340000 task.ti: ffff88007b340000
[  188.821984] RIP: 0010:[<ffffffffa01901b3>]  [<ffffffffa01901b3>] submit_one_bio+0x43/0xa0 [btrfs]
[  188.821984] RSP: 0018:ffff88007b3438c8  EFLAGS: 00010202
[  188.821984] RAX: 0000000000000000 RBX: ffff88007c282ba8 RCX: 0000000000010001
[  188.821984] RDX: 0000000000000000 RSI: 00000000fffffff4 RDI: 0000000000000000
[  188.821984] RBP: ffff88007b3438d8 R08: ffffea0001e33100 R09: 00000000000027df
[  188.821984] R10: ffff88007fd1c000 R11: 0000000000dbb000 R12: ffff88007b343b40
[  188.821984] R13: ffff88007c282ba8 R14: 0000000000006dd8 R15: ffff880071584f80
[  188.821984] FS:  00007fdf777c5740(0000) GS:ffff88007fd00000(0000) knlGS:0000000000000000
[  188.821984] CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
[  188.821984] CR2: 000000010000000c CR3: 000000007bf59000 CR4: 00000000000006e0
[  188.821984] Stack:
[  188.821984]  0000000000001000 ffff88007b343b40 ffff88007b343938 ffffffffa0193f27
[  188.821984]  ffff88007b343938 0000000000000001 0000000000000000 ffffea0001e33180
[  188.821984]  00000000027e0000 0000000000001000 ffff88007cc24680 ffff88007b343b50
[  188.821984] Call Trace:
[  188.821984]  [<ffffffffa0193f27>] submit_extent_page.isra.35+0xd7/0x1c0 [btrfs]
[  188.821984]  [<ffffffffa019509d>] __do_readpage+0x31d/0x7b0 [btrfs]
[  188.821984]  [<ffffffffa0195f10>] ? btrfs_create_repair_bio+0x110/0x110 [btrfs]
[  188.821984]  [<ffffffffa0179b70>] ? btrfs_submit_direct+0x7b0/0x7b0 [btrfs]
[  188.821984]  [<ffffffffa018f88d>] ? btrfs_lookup_ordered_range+0x13d/0x180 [btrfs]
[  188.821984]  [<ffffffffa01958ca>] __extent_readpages.constprop.42+0x2ba/0x2d0 [btrfs]
[  188.821984]  [<ffffffffa0179b70>] ? btrfs_submit_direct+0x7b0/0x7b0 [btrfs]
[  188.821984]  [<ffffffffa01969b9>] extent_readpages+0x169/0x1b0 [btrfs]
[  188.821984]  [<ffffffffa0179b70>] ? btrfs_submit_direct+0x7b0/0x7b0 [btrfs]
[  188.821984]  [<ffffffffa0176b0f>] btrfs_readpages+0x1f/0x30 [btrfs]
[  188.821984]  [<ffffffff8118bf5c>] __do_page_cache_readahead+0x18c/0x1f0
[  188.821984]  [<ffffffff8118c09f>] ondemand_readahead+0xdf/0x260
[  188.821984]  [<ffffffffa016c5df>] ? btrfs_congested_fn+0x5f/0xa0 [btrfs]
[  188.821984]  [<ffffffff8118c291>] page_cache_async_readahead+0x71/0xa0
[  188.821984]  [<ffffffff8118017f>] generic_file_read_iter+0x40f/0x5e0
[  188.821984]  [<ffffffff811f43be>] new_sync_read+0x7e/0xb0
[  188.821984]  [<ffffffff811f55d8>] __vfs_read+0x18/0x50
[  188.821984]  [<ffffffff811f569a>] vfs_read+0x8a/0x140
[  188.821984]  [<ffffffff811f5796>] SyS_read+0x46/0xb0
[  188.821984]  [<ffffffff81125806>] ? __audit_syscall_exit+0x1f6/0x2a0
[  188.821984]  [<ffffffff816eb8e9>] system_call_fastpath+0x12/0x17
[  188.821984] Code: c1 e0 04 48 8d 44 06 f0 48 8b 73 50 4c 8b 00 8b 40 0c 4d 8b 48 10 48 c7 43 50 00 00 00 00 f0 ff 43 74 48 8b 76 20 48 85 f6 74 4d <4c> 8b 56 18 4d 85 d2 74 44 4d 8b 58 08 49 c1 e1 0c 49 89 c8 89 
[  188.821984] RIP  [<ffffffffa01901b3>] submit_one_bio+0x43/0xa0 [btrfs]
[  188.821984]  RSP <ffff88007b3438c8>
[  188.821984] CR2: 000000010000000c
[  188.953169] ---[ end trace 498f24be78e8baad ]---
# 
===============================================================================

Thanks,
Satoru

> 
>    #!/bin/bash
> 
>    dmesgout=dmesg.txt
>    start=100000
>    end=300000
>    step=1000
> 
>    # btrfs options
>    device=/dev/vdb1
>    directory=/mnt/btrfs
> 
>    # fault-injection options
>    percent=100
>    times=3
> 
>    mkdir -p $directory || exit 1
>    mount -o compress $device $directory || exit 1
> 
>    rm -f $directory/file || exit 1
>    dd if=/dev/zero of=$directory/file bs=1M count=512 || exit 1
> 
>    for interval in `seq $start $step $end`; do
>            dmesg -C
>            echo 1 > /proc/sys/vm/drop_caches
>            sync
>            export FAILCMD_TYPE=fail_page_alloc
>            ./failcmd.sh -p $percent -t $times -i $interval \
>                    --ignore-gfp-highmem=N --ignore-gfp-wait=N --min-order=0 \
>                    -- \
>                    cat $directory/file > /dev/null
>            dmesg > ${dmesgout}
>            if grep -q BUG: ${dmesgout}; then
>                    cat ${dmesgout}
>                    exit 1
>            fi
>    done
> 
>    umount $directory
>    exit 0
> 
> Signed-off-by: Naohiro Aota <naota@elisp.net>
> ---
>   fs/btrfs/extent_io.c | 4 +++-
>   1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
> index 4ebabd2..4421161 100644
> --- a/fs/btrfs/extent_io.c
> +++ b/fs/btrfs/extent_io.c
> @@ -2816,8 +2816,10 @@ static int submit_extent_page(int rw, struct extent_io_tree *tree,
>   		    bio_add_page(bio, page, page_size, offset) < page_size) {
>   			ret = submit_one_bio(rw, bio, mirror_num,
>   					     prev_bio_flags);
> -			if (ret < 0)
> +			if (ret < 0) {
> +				*bio_ret = NULL;
>   				return ret;
> +			}
>   			bio = NULL;
>   		} else {
>   			return 0;
> 


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] btrfs: clear bio reference after submit_one_bio()
  2015-01-06 22:46 ` Satoru Takeuchi
@ 2015-10-11 18:09   ` Alex Lyakas
  2015-11-05 13:08     ` Holger Hoffstätte
  0 siblings, 1 reply; 5+ messages in thread
From: Alex Lyakas @ 2015-10-11 18:09 UTC (permalink / raw)
  To: Satoru Takeuchi; +Cc: Naohiro Aota, linux-btrfs

Hi Naota,

What happens if btrfs_bio_alloc() in submit_extent_page fails? Then we
return -ENOMEM to the caller, but we do not set *bio_ret to NULL. And
if *bio_ret was non-NULL upon entry into submit_extent_page, then we
had submitted this bio before getting to btrfs_bio_alloc(). So should
btrfs_bio_alloc() failure be handled in the same way?

diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index 3915c94..cd443bc 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -2834,8 +2834,11 @@ static int submit_extent_page(int rw, struct
extent_io_tree *tree,

        bio = btrfs_bio_alloc(bdev, sector, BIO_MAX_PAGES,
                        GFP_NOFS | __GFP_HIGH);
-       if (!bio)
+       if (!bio) {
+               if (bio_ret)
+                       *bio_ret = NULL;
                return -ENOMEM;
+       }

        bio_add_page(bio, page, page_size, offset);
        bio->bi_end_io = end_io_func;


Thanks,
Alex.

On Wed, Jan 7, 2015 at 12:46 AM, Satoru Takeuchi
<takeuchi_satoru@jp.fujitsu.com> wrote:
> Hi Naota,
>
> On 2015/01/06 1:01, Naohiro Aota wrote:
>> After submit_one_bio(), `bio' can go away. However submit_extent_page()
>> leave `bio' referable if submit_one_bio() failed (e.g. -ENOMEM on OOM).
>> It will cause invalid paging request when submit_extent_page() is called
>> next time.
>>
>> I reproduced ENOMEM case with the following script (need
>> CONFIG_FAIL_PAGE_ALLOC, and CONFIG_FAULT_INJECTION_DEBUG_FS).
>
> I confirmed that this problem reproduce with 3.19-rc3 and
> not reproduce with 3.19-rc3 with your patch.
>
> Tested-by: Satoru Takeuchi <takeuchi_satoru@jp.fujitsu.com>
>
> Thank you for reporting this problem with the reproducer
> and fixing it too.
>
>   NOTE:
>   I used v3.19-rc3's tools/testing/fault-injection/failcmd.sh
>   for the following "./failcmd.sh".
>
>   >            ./failcmd.sh -p $percent -t $times -i $interval \
>   >                    --ignore-gfp-highmem=N --ignore-gfp-wait=N --min-order=0 \
>   >                    -- \
>   >                    cat $directory/file > /dev/null
>
> * 3.19-rc1 + your patch
>
> ===============================================================================
> # ./run
> 512+0 records in
> 512+0 records out
> #
> ===============================================================================
>
> * 3.19-rc3
>
> ===============================================================================
> # ./run
> 512+0 records in
> 512+0 records out
> [  188.433726] run (776): drop_caches: 1
> [  188.682372] FAULT_INJECTION: forcing a failure.
> name fail_page_alloc, interval 100, probability 111000, space 0, times 3
> [  188.689986] CPU: 0 PID: 954 Comm: cat Not tainted 3.19.0-rc3-ktest #1
> [  188.693834] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Bochs 01/01/2011
> [  188.698466]  0000000000000064 ffff88007b343618 ffffffff816e5563 ffff88007fc0fc78
> [  188.702730]  ffffffff81c655c0 ffff88007b343638 ffffffff813851b5 0000000000000010
> [  188.707043]  0000000000000002 ffff88007b343768 ffffffff81188126 ffff88007b3435a8
> [  188.711283] Call Trace:
> [  188.712620]  [<ffffffff816e5563>] dump_stack+0x45/0x57
> [  188.715330]  [<ffffffff813851b5>] should_fail+0x135/0x140
> [  188.718218]  [<ffffffff81188126>] __alloc_pages_nodemask+0xd6/0xb30
> [  188.721567]  [<ffffffff81339075>] ? blk_rq_map_sg+0x35/0x170
> [  188.724558]  [<ffffffffa0010705>] ? virtio_queue_rq+0x145/0x2b0 [virtio_blk]
> [  188.728191]  [<ffffffffa01bd00f>] ? btrfs_submit_compressed_read+0xcf/0x4d0 [btrfs]
> [  188.732079]  [<ffffffff811d99fb>] ? kmem_cache_alloc+0x1cb/0x230
> [  188.735153]  [<ffffffff81181265>] ? mempool_alloc_slab+0x15/0x20
> [  188.738188]  [<ffffffff811cee1a>] alloc_pages_current+0x9a/0x120
> [  188.741153]  [<ffffffffa01bd0e9>] btrfs_submit_compressed_read+0x1a9/0x4d0 [btrfs]
> [  188.744835]  [<ffffffffa0178621>] btrfs_submit_bio_hook+0x1c1/0x1d0 [btrfs]
> [  188.748225]  [<ffffffffa018b7b3>] ? lookup_extent_mapping+0x13/0x20 [btrfs]
> [  188.751547]  [<ffffffffa0179c08>] ? btrfs_get_extent+0x98/0xad0 [btrfs]
> [  188.754656]  [<ffffffffa01901d7>] submit_one_bio+0x67/0xa0 [btrfs]
> [  188.757554]  [<ffffffffa0193f27>] submit_extent_page.isra.35+0xd7/0x1c0 [btrfs]
> [  188.760981]  [<ffffffffa019509d>] __do_readpage+0x31d/0x7b0 [btrfs]
> [  188.763920]  [<ffffffffa0195f10>] ? btrfs_create_repair_bio+0x110/0x110 [btrfs]
> [  188.767382]  [<ffffffffa0179b70>] ? btrfs_submit_direct+0x7b0/0x7b0 [btrfs]
> [  188.770671]  [<ffffffffa018f88d>] ? btrfs_lookup_ordered_range+0x13d/0x180 [btrfs]
> [  188.774366]  [<ffffffffa01958ca>] __extent_readpages.constprop.42+0x2ba/0x2d0 [btrfs]
> [  188.778031]  [<ffffffffa0179b70>] ? btrfs_submit_direct+0x7b0/0x7b0 [btrfs]
> [  188.781241]  [<ffffffffa01969b9>] extent_readpages+0x169/0x1b0 [btrfs]
> [  188.784322]  [<ffffffffa0179b70>] ? btrfs_submit_direct+0x7b0/0x7b0 [btrfs]
> [  188.789014]  [<ffffffffa0176b0f>] btrfs_readpages+0x1f/0x30 [btrfs]
> [  188.792028]  [<ffffffff8118bf5c>] __do_page_cache_readahead+0x18c/0x1f0
> [  188.795078]  [<ffffffff8118c09f>] ondemand_readahead+0xdf/0x260
> [  188.797702]  [<ffffffffa016c5df>] ? btrfs_congested_fn+0x5f/0xa0 [btrfs]
> [  188.800718]  [<ffffffff8118c291>] page_cache_async_readahead+0x71/0xa0
> [  188.803650]  [<ffffffff8118017f>] generic_file_read_iter+0x40f/0x5e0
> [  188.806480]  [<ffffffff811f43be>] new_sync_read+0x7e/0xb0
> [  188.808832]  [<ffffffff811f55d8>] __vfs_read+0x18/0x50
> [  188.811068]  [<ffffffff811f569a>] vfs_read+0x8a/0x140
> [  188.813298]  [<ffffffff811f5796>] SyS_read+0x46/0xb0
> [  188.815486]  [<ffffffff81125806>] ? __audit_syscall_exit+0x1f6/0x2a0
> [  188.818293]  [<ffffffff816eb8e9>] system_call_fastpath+0x12/0x17
> [  188.821005] BUG: unable to handle kernel paging request at 000000010000000c
> [  188.821984] IP: [<ffffffffa01901b3>] submit_one_bio+0x43/0xa0 [btrfs]
> [  188.821984] PGD 7bad3067 PUD 0
> [  188.821984] Oops: 0000 [#1] SMP
> [  188.821984] Modules linked in: ip6table_filter ip6_tables ebtable_nat ebtables bnep bluetooth rfkill btrfs xor raid6_pq microcode 8139too serio_raw virtio_balloon 8139cp mii nfsd auth_rpcgss nfs_acl lockd grace sunrpc virtio_blk ata_generic pata_acpi
> [  188.821984] CPU: 1 PID: 954 Comm: cat Not tainted 3.19.0-rc3-ktest #1
> [  188.821984] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Bochs 01/01/2011
> [  188.821984] task: ffff880037665220 ti: ffff88007b340000 task.ti: ffff88007b340000
> [  188.821984] RIP: 0010:[<ffffffffa01901b3>]  [<ffffffffa01901b3>] submit_one_bio+0x43/0xa0 [btrfs]
> [  188.821984] RSP: 0018:ffff88007b3438c8  EFLAGS: 00010202
> [  188.821984] RAX: 0000000000000000 RBX: ffff88007c282ba8 RCX: 0000000000010001
> [  188.821984] RDX: 0000000000000000 RSI: 00000000fffffff4 RDI: 0000000000000000
> [  188.821984] RBP: ffff88007b3438d8 R08: ffffea0001e33100 R09: 00000000000027df
> [  188.821984] R10: ffff88007fd1c000 R11: 0000000000dbb000 R12: ffff88007b343b40
> [  188.821984] R13: ffff88007c282ba8 R14: 0000000000006dd8 R15: ffff880071584f80
> [  188.821984] FS:  00007fdf777c5740(0000) GS:ffff88007fd00000(0000) knlGS:0000000000000000
> [  188.821984] CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
> [  188.821984] CR2: 000000010000000c CR3: 000000007bf59000 CR4: 00000000000006e0
> [  188.821984] Stack:
> [  188.821984]  0000000000001000 ffff88007b343b40 ffff88007b343938 ffffffffa0193f27
> [  188.821984]  ffff88007b343938 0000000000000001 0000000000000000 ffffea0001e33180
> [  188.821984]  00000000027e0000 0000000000001000 ffff88007cc24680 ffff88007b343b50
> [  188.821984] Call Trace:
> [  188.821984]  [<ffffffffa0193f27>] submit_extent_page.isra.35+0xd7/0x1c0 [btrfs]
> [  188.821984]  [<ffffffffa019509d>] __do_readpage+0x31d/0x7b0 [btrfs]
> [  188.821984]  [<ffffffffa0195f10>] ? btrfs_create_repair_bio+0x110/0x110 [btrfs]
> [  188.821984]  [<ffffffffa0179b70>] ? btrfs_submit_direct+0x7b0/0x7b0 [btrfs]
> [  188.821984]  [<ffffffffa018f88d>] ? btrfs_lookup_ordered_range+0x13d/0x180 [btrfs]
> [  188.821984]  [<ffffffffa01958ca>] __extent_readpages.constprop.42+0x2ba/0x2d0 [btrfs]
> [  188.821984]  [<ffffffffa0179b70>] ? btrfs_submit_direct+0x7b0/0x7b0 [btrfs]
> [  188.821984]  [<ffffffffa01969b9>] extent_readpages+0x169/0x1b0 [btrfs]
> [  188.821984]  [<ffffffffa0179b70>] ? btrfs_submit_direct+0x7b0/0x7b0 [btrfs]
> [  188.821984]  [<ffffffffa0176b0f>] btrfs_readpages+0x1f/0x30 [btrfs]
> [  188.821984]  [<ffffffff8118bf5c>] __do_page_cache_readahead+0x18c/0x1f0
> [  188.821984]  [<ffffffff8118c09f>] ondemand_readahead+0xdf/0x260
> [  188.821984]  [<ffffffffa016c5df>] ? btrfs_congested_fn+0x5f/0xa0 [btrfs]
> [  188.821984]  [<ffffffff8118c291>] page_cache_async_readahead+0x71/0xa0
> [  188.821984]  [<ffffffff8118017f>] generic_file_read_iter+0x40f/0x5e0
> [  188.821984]  [<ffffffff811f43be>] new_sync_read+0x7e/0xb0
> [  188.821984]  [<ffffffff811f55d8>] __vfs_read+0x18/0x50
> [  188.821984]  [<ffffffff811f569a>] vfs_read+0x8a/0x140
> [  188.821984]  [<ffffffff811f5796>] SyS_read+0x46/0xb0
> [  188.821984]  [<ffffffff81125806>] ? __audit_syscall_exit+0x1f6/0x2a0
> [  188.821984]  [<ffffffff816eb8e9>] system_call_fastpath+0x12/0x17
> [  188.821984] Code: c1 e0 04 48 8d 44 06 f0 48 8b 73 50 4c 8b 00 8b 40 0c 4d 8b 48 10 48 c7 43 50 00 00 00 00 f0 ff 43 74 48 8b 76 20 48 85 f6 74 4d <4c> 8b 56 18 4d 85 d2 74 44 4d 8b 58 08 49 c1 e1 0c 49 89 c8 89
> [  188.821984] RIP  [<ffffffffa01901b3>] submit_one_bio+0x43/0xa0 [btrfs]
> [  188.821984]  RSP <ffff88007b3438c8>
> [  188.821984] CR2: 000000010000000c
> [  188.953169] ---[ end trace 498f24be78e8baad ]---
> #
> ===============================================================================
>
> Thanks,
> Satoru
>
>>
>>    #!/bin/bash
>>
>>    dmesgout=dmesg.txt
>>    start=100000
>>    end=300000
>>    step=1000
>>
>>    # btrfs options
>>    device=/dev/vdb1
>>    directory=/mnt/btrfs
>>
>>    # fault-injection options
>>    percent=100
>>    times=3
>>
>>    mkdir -p $directory || exit 1
>>    mount -o compress $device $directory || exit 1
>>
>>    rm -f $directory/file || exit 1
>>    dd if=/dev/zero of=$directory/file bs=1M count=512 || exit 1
>>
>>    for interval in `seq $start $step $end`; do
>>            dmesg -C
>>            echo 1 > /proc/sys/vm/drop_caches
>>            sync
>>            export FAILCMD_TYPE=fail_page_alloc
>>            ./failcmd.sh -p $percent -t $times -i $interval \
>>                    --ignore-gfp-highmem=N --ignore-gfp-wait=N --min-order=0 \
>>                    -- \
>>                    cat $directory/file > /dev/null
>>            dmesg > ${dmesgout}
>>            if grep -q BUG: ${dmesgout}; then
>>                    cat ${dmesgout}
>>                    exit 1
>>            fi
>>    done
>>
>>    umount $directory
>>    exit 0
>>
>> Signed-off-by: Naohiro Aota <naota@elisp.net>
>> ---
>>   fs/btrfs/extent_io.c | 4 +++-
>>   1 file changed, 3 insertions(+), 1 deletion(-)
>>
>> diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
>> index 4ebabd2..4421161 100644
>> --- a/fs/btrfs/extent_io.c
>> +++ b/fs/btrfs/extent_io.c
>> @@ -2816,8 +2816,10 @@ static int submit_extent_page(int rw, struct extent_io_tree *tree,
>>                   bio_add_page(bio, page, page_size, offset) < page_size) {
>>                       ret = submit_one_bio(rw, bio, mirror_num,
>>                                            prev_bio_flags);
>> -                     if (ret < 0)
>> +                     if (ret < 0) {
>> +                             *bio_ret = NULL;
>>                               return ret;
>> +                     }
>>                       bio = NULL;
>>               } else {
>>                       return 0;
>>
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH] btrfs: clear bio reference after submit_one_bio()
  2015-10-11 18:09   ` Alex Lyakas
@ 2015-11-05 13:08     ` Holger Hoffstätte
  2015-11-07 16:24       ` Alex Lyakas
  0 siblings, 1 reply; 5+ messages in thread
From: Holger Hoffstätte @ 2015-11-05 13:08 UTC (permalink / raw)
  To: Alex Lyakas, Satoru Takeuchi; +Cc: Naohiro Aota, linux-btrfs

On 10/11/15 20:09, Alex Lyakas wrote:
> Hi Naota,
> 
> What happens if btrfs_bio_alloc() in submit_extent_page fails? Then we
> return -ENOMEM to the caller, but we do not set *bio_ret to NULL. And
> if *bio_ret was non-NULL upon entry into submit_extent_page, then we
> had submitted this bio before getting to btrfs_bio_alloc(). So should
> btrfs_bio_alloc() failure be handled in the same way?
> 
> diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
> index 3915c94..cd443bc 100644
> --- a/fs/btrfs/extent_io.c
> +++ b/fs/btrfs/extent_io.c
> @@ -2834,8 +2834,11 @@ static int submit_extent_page(int rw, struct
> extent_io_tree *tree,
> 
>         bio = btrfs_bio_alloc(bdev, sector, BIO_MAX_PAGES,
>                         GFP_NOFS | __GFP_HIGH);
> -       if (!bio)
> +       if (!bio) {
> +               if (bio_ret)
> +                       *bio_ret = NULL;
>                 return -ENOMEM;
> +       }
> 
>         bio_add_page(bio, page, page_size, offset);
>         bio->bi_end_io = end_io_func;
> 

Did you get any feedback on this? It seems it could cause data loss or
corruption on allocation failures, no?

-h


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] btrfs: clear bio reference after submit_one_bio()
  2015-11-05 13:08     ` Holger Hoffstätte
@ 2015-11-07 16:24       ` Alex Lyakas
  0 siblings, 0 replies; 5+ messages in thread
From: Alex Lyakas @ 2015-11-07 16:24 UTC (permalink / raw)
  To: Holger Hoffstätte; +Cc: Satoru Takeuchi, Naohiro Aota, linux-btrfs

Hi Holger,
I think it will cause an invalid paging request, just like in case
that Naohiro has fixed.
I am not running the "latest and greatest" btrfs in my system, and it
is not easy to set it up, that's why I cannot submit patches based on
the latest code, I can only review and comment on patches.

Alex.


On Thu, Nov 5, 2015 at 3:08 PM, Holger Hoffstätte
<holger.hoffstaette@googlemail.com> wrote:
> On 10/11/15 20:09, Alex Lyakas wrote:
>> Hi Naota,
>>
>> What happens if btrfs_bio_alloc() in submit_extent_page fails? Then we
>> return -ENOMEM to the caller, but we do not set *bio_ret to NULL. And
>> if *bio_ret was non-NULL upon entry into submit_extent_page, then we
>> had submitted this bio before getting to btrfs_bio_alloc(). So should
>> btrfs_bio_alloc() failure be handled in the same way?
>>
>> diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
>> index 3915c94..cd443bc 100644
>> --- a/fs/btrfs/extent_io.c
>> +++ b/fs/btrfs/extent_io.c
>> @@ -2834,8 +2834,11 @@ static int submit_extent_page(int rw, struct
>> extent_io_tree *tree,
>>
>>         bio = btrfs_bio_alloc(bdev, sector, BIO_MAX_PAGES,
>>                         GFP_NOFS | __GFP_HIGH);
>> -       if (!bio)
>> +       if (!bio) {
>> +               if (bio_ret)
>> +                       *bio_ret = NULL;
>>                 return -ENOMEM;
>> +       }
>>
>>         bio_add_page(bio, page, page_size, offset);
>>         bio->bi_end_io = end_io_func;
>>
>
> Did you get any feedback on this? It seems it could cause data loss or
> corruption on allocation failures, no?
>
> -h
>

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2015-11-07 16:24 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-01-05 16:01 [PATCH] btrfs: clear bio reference after submit_one_bio() Naohiro Aota
2015-01-06 22:46 ` Satoru Takeuchi
2015-10-11 18:09   ` Alex Lyakas
2015-11-05 13:08     ` Holger Hoffstätte
2015-11-07 16:24       ` Alex Lyakas

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).