On 2019/3/26 上午2:06, Omar Sandoval wrote:
> On Tue, Mar 05, 2019 at 02:55:08PM +0100, David Sterba wrote:
>> On Fri, Sep 14, 2018 at 03:49:44PM +0800, Qu Wenruo wrote:
>>> In github issues, one user reports unexpected ENOSPC error if enabling
>>> datasum.
>>> After some investigation, it looks like that during ext2_saved/image
>>> creation, we could create large file extent whose size can be 128M (max
>>> data extent size).
>>>
>>> In that case, its csum will be at least 128K. Under certain case we need
>>> to allocate extra metadata chunks to fulfill such space requirement.
>>>
>>> However we only do metadata prealloc if we're reserving extents for fs
>>> trees.
>>> (we use btrfs_root::ref_cows to determine whether we should do metadata
>>> prealloc, and that member is only set for fs trees).
>>>
>>> There is no explaination on why we only do metadata prealloc for file
>>> trees, but at least from my investigation, it could be related to avoid
>>> nested extent tree modication.
>>>
>>> At least extent reservation for csum tree shouldn't be a problem with
>>> metadata block group preallocation.
>>>
>>> So change the metadata block group preallocation check from
>>> "root->ref_cow" to "root->root_key.objectid !=
>>> BTRFS_EXTENT_TREE_OBJECTID", and add some comment for it.
>>
>> This looks a bit fragile to me but I don't have a better suggestion for
>> a fix. Added to devel, thanks.
> 
> This seems to be causing infinite recursion in do_chunk_alloc() during mkfs:

I can also reproduce it.

And indeed it's caused by this patch.

Please discard this patch until a better solution is found.

Thanks,
Qu
> 
> $ truncate -s $((1024 * 1024 * 1024)) foo
> $ gdb --args ./mkfs.btrfs foo
> GNU gdb (GDB) 8.2.1
> Copyright (C) 2018 Free Software Foundation, Inc.
> License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
> This is free software: you are free to change and redistribute it.
> There is NO WARRANTY, to the extent permitted by law.
> Type "show copying" and "show warranty" for details.
> This GDB was configured as "x86_64-pc-linux-gnu".
> Type "show configuration" for configuration details.
> For bug reporting instructions, please see:
> <http://www.gnu.org/software/gdb/bugs/>.
> Find the GDB manual and other documentation resources online at:
>     <http://www.gnu.org/software/gdb/documentation/>.
> 
> For help, type "help".
> Type "apropos word" to search for commands related to "word"...
> Reading symbols from ./mkfs.btrfs...done.
> (gdb) r
> Starting program: /home/osandov/linux/btrfs-progs/mkfs.btrfs foo
> [Thread debugging using libthread_db enabled]
> Using host libthread_db library "/usr/lib/libthread_db.so.1".
> btrfs-progs v4.20.2
> See http://btrfs.wiki.kernel.org for more information.
> 
> 
> Program received signal SIGSEGV, Segmentation fault.
> 0x000055555557fe24 in memcpy (__len=17, __src=0x5555555e5ef5, 
> __dest=0x7fffff7ff040) at /usr/include/bits/string_fortified.h:34
> 34        return __builtin___memcpy_chk (__dest, __src, __len, __bos0 
> (__dest));
> (gdb) bt
> #0  0x000055555557fe24 in memcpy (__len=17, __src=0x5555555e5ef5, 
> __dest=0x7fffff7ff040) at /usr/include/bits/string_fortified.h:34
> #1  read_extent_buffer (eb=eb@entry=0x5555555e5e10, 
> dst=dst@entry=0x7fffff7ff040, start=start@entry=101, len=len@entry=17) at 
> extent_io.c:975
> #2  0x0000555555565d1e in btrfs_item_key (nr=0, disk_key=0x7fffff7ff040, 
> eb=0x5555555e5e10) at ctree.h:1905
> #3  __btrfs_cow_block (trans=trans@entry=0x5555555f2430, 
> root=root@entry=0x5555555d3e40, buf=buf@entry=0x5555555e5e10, 
> parent=parent@entry=0x0, parent_slot=parent_slot@entry=0, 
> cow_ret=cow_ret@entry=0x7fffff7ff288, search_start=0, empty_size=0) at 
> ctree.c:291
> #4  0x0000555555566676 in btrfs_cow_block (trans=trans@entry=0x5555555f2430, 
> root=root@entry=0x5555555d3e40, buf=0x5555555e5e10, parent=0x0, 
> parent_slot=0, cow_ret=cow_ret@entry=0x7fffff7ff288) at ctree.c:388
> #5  0x0000555555569319 in btrfs_search_slot (trans=<optimized out>, 
> root=root@entry=0x5555555d3e40, key=key@entry=0x7fffff7ff440, 
> p=p@entry=0x555555738ea0, ins_len=ins_len@entry=73, cow=cow@entry=1) at 
> ctree.c:1158
> #6  0x000055555556ab6f in btrfs_insert_empty_items 
> (trans=trans@entry=0x5555555f2430, root=root@entry=0x5555555d3e40, 
> path=path@entry=0x555555738ea0, cpu_key=cpu_key@entry=0x7fffff7ff440, 
> data_size=data_size@entry=0x7fffff7ff43c, nr=nr@entry=1) at ctree.c:2612
> #7  0x0000555555580ad7 in btrfs_insert_empty_item (data_size=<optimized out>, 
> key=0x7fffff7ff440, path=0x555555738ea0, root=0x5555555d3e40, 
> trans=0x5555555f2430) at ctree.h:2650
> #8  btrfs_insert_dev_extent (trans=trans@entry=0x5555555f2430, 
> device=device@entry=0x5555555d59e0, chunk_offset=chunk_offset@entry=5242880, 
> num_bytes=num_bytes@entry=8388608, start=5242880) at volumes.c:574
> #9  0x00005555555818c1 in btrfs_alloc_dev_extent (start=0x7fffff7ff568, 
> num_bytes=8388608, chunk_offset=5242880, device=0x5555555d59e0, 
> trans=0x5555555f2430) at volumes.c:610
> #10 btrfs_alloc_chunk (trans=trans@entry=0x5555555f2430, 
> info=info@entry=0x5555555d2970, start=start@entry=0x7fffff7ff698, 
> num_bytes=num_bytes@entry=0x7fffff7ff6a0, type=4) at volumes.c:1143
> #11 0x0000555555575ca4 in do_chunk_alloc (trans=trans@entry=0x5555555f2430, 
> fs_info=fs_info@entry=0x5555555d2970, alloc_bytes=alloc_bytes@entry=16384, 
> flags=flags@entry=4) at extent-tree.c:1876
> #12 0x0000555555575f8d in btrfs_reserve_extent 
> (trans=trans@entry=0x5555555f2430, root=root@entry=0x5555555d3e40, 
> num_bytes=num_bytes@entry=16384, empty_size=empty_size@entry=0, 
> hint_byte=hint_byte@entry=0, 
> search_end=search_end@entry=18446744073709551615, ins=0x7fffff7ff8c0, 
> is_data=false) at extent-tree.c:2516
> #13 0x0000555555576914 in alloc_tree_block (ins=0x7fffff7ff8c0, 
> search_end=18446744073709551615, hint_byte=0, empty_size=0, level=0, 
> key=0x7fffff7ff960, flags=0, generation=<optimized out>, root_objectid=4, 
> num_bytes=16384, root=0x5555555d3e40, trans=0x5555555f2430) at 
> extent-tree.c:2641
> #14 btrfs_alloc_free_block (trans=trans@entry=0x5555555f2430, 
> root=root@entry=0x5555555d3e40, blocksize=16384, root_objectid=4, 
> key=key@entry=0x7fffff7ff960, level=level@entry=0, hint=0, empty_size=0) at 
> extent-tree.c:2694
> #15 0x0000555555565d4a in __btrfs_cow_block 
> (trans=trans@entry=0x5555555f2430, root=root@entry=0x5555555d3e40, 
> buf=buf@entry=0x5555555e5e10, parent=parent@entry=0x0, 
> parent_slot=parent_slot@entry=0, cow_ret=cow_ret@entry=0x7fffff7ffba8, 
> search_start=0, empty_size=0) at ctree.c:295
> #16 0x0000555555566676 in btrfs_cow_block (trans=trans@entry=0x5555555f2430, 
> root=root@entry=0x5555555d3e40, buf=0x5555555e5e10, parent=0x0, 
> parent_slot=0, cow_ret=cow_ret@entry=0x7fffff7ffba8) at ctree.c:388
> #17 0x0000555555569319 in btrfs_search_slot (trans=<optimized out>, 
> root=root@entry=0x5555555d3e40, key=key@entry=0x7fffff7ffd60, 
> p=p@entry=0x555555738d30, ins_len=ins_len@entry=73, cow=cow@entry=1) at 
> ctree.c:1158
> #18 0x000055555556ab6f in btrfs_insert_empty_items 
> (trans=trans@entry=0x5555555f2430, root=root@entry=0x5555555d3e40, 
> path=path@entry=0x555555738d30, cpu_key=cpu_key@entry=0x7fffff7ffd60, 
> data_size=data_size@entry=0x7fffff7ffd5c, nr=nr@entry=1) at ctree.c:2612
> #19 0x0000555555580ad7 in btrfs_insert_empty_item (data_size=<optimized out>, 
> key=0x7fffff7ffd60, path=0x555555738d30, root=0x5555555d3e40, 
> trans=0x5555555f2430) at ctree.h:2650
> #20 btrfs_insert_dev_extent (trans=trans@entry=0x5555555f2430, 
> device=device@entry=0x5555555d59e0, chunk_offset=chunk_offset@entry=5242880, 
> num_bytes=num_bytes@entry=8388608, start=5242880) at volumes.c:574
> #21 0x00005555555818c1 in btrfs_alloc_dev_extent (start=0x7fffff7ffe88, 
> num_bytes=8388608, chunk_offset=5242880, device=0x5555555d59e0, 
> trans=0x5555555f2430) at volumes.c:610
> #22 btrfs_alloc_chunk (trans=trans@entry=0x5555555f2430, 
> info=info@entry=0x5555555d2970, start=start@entry=0x7fffff7fffb8, 
> num_bytes=num_bytes@entry=0x7fffff7fffc0, type=4) at volumes.c:1143
> #23 0x0000555555575ca4 in do_chunk_alloc (trans=trans@entry=0x5555555f2430, 
> fs_info=fs_info@entry=0x5555555d2970, alloc_bytes=alloc_bytes@entry=16384, 
> flags=flags@entry=4) at extent-tree.c:1876
> #24 0x0000555555575f8d in btrfs_reserve_extent 
> (trans=trans@entry=0x5555555f2430, root=root@entry=0x5555555d3e40, 
> num_bytes=num_bytes@entry=16384, empty_size=empty_size@entry=0, 
> hint_byte=hint_byte@entry=0, 
> search_end=search_end@entry=18446744073709551615, ins=0x7fffff8001e0, 
> is_data=false) at extent-tree.c:2516
> #25 0x0000555555576914 in alloc_tree_block (ins=0x7fffff8001e0, 
> search_end=18446744073709551615, hint_byte=0, empty_size=0, level=0, 
> key=0x7fffff800280, flags=0, generation=<optimized out>, root_objectid=4, 
> num_bytes=16384, root=0x5555555d3e40, trans=0x5555555f2430) at 
> extent-tree.c:2641
> #26 btrfs_alloc_free_block (trans=trans@entry=0x5555555f2430, 
> root=root@entry=0x5555555d3e40, blocksize=16384, root_objectid=4, 
> key=key@entry=0x7fffff800280, level=level@entry=0, hint=0, empty_size=0) at 
> extent-tree.c:2694
> #27 0x0000555555565d4a in __btrfs_cow_block 
> (trans=trans@entry=0x5555555f2430, root=root@entry=0x5555555d3e40, 
> buf=buf@entry=0x5555555e5e10, parent=parent@entry=0x0, 
> parent_slot=parent_slot@entry=0, cow_ret=cow_ret@entry=0x7fffff8004c8, 
> search_start=0, empty_size=0) at ctree.c:295
> #28 0x0000555555566676 in btrfs_cow_block (trans=trans@entry=0x5555555f2430, 
> root=root@entry=0x5555555d3e40, buf=0x5555555e5e10, parent=0x0, 
> parent_slot=0, cow_ret=cow_ret@entry=0x7fffff8004c8) at ctree.c:388
> #29 0x0000555555569319 in btrfs_search_slot (trans=<optimized out>, 
> root=root@entry=0x5555555d3e40, key=key@entry=0x7fffff800680, 
> p=p@entry=0x555555738bc0, ins_len=ins_len@entry=73, cow=cow@entry=1) at 
> ctree.c:1158
> #30 0x000055555556ab6f in btrfs_insert_empty_items 
> (trans=trans@entry=0x5555555f2430, root=root@entry=0x5555555d3e40, 
> path=path@entry=0x555555738bc0, cpu_key=cpu_key@entry=0x7fffff800680, 
> data_size=data_size@entry=0x7fffff80067c, nr=nr@entry=1) at ctree.c:2612
> #31 0x0000555555580ad7 in btrfs_insert_empty_item (data_size=<optimized out>, 
> key=0x7fffff800680, path=0x555555738bc0, root=0x5555555d3e40, 
> trans=0x5555555f2430) at ctree.h:2650
> #32 btrfs_insert_dev_extent (trans=trans@entry=0x5555555f2430, 
> device=device@entry=0x5555555d59e0, chunk_offset=chunk_offset@entry=5242880, 
> num_bytes=num_bytes@entry=8388608, start=5242880) at volumes.c:574
> #33 0x00005555555818c1 in btrfs_alloc_dev_extent (start=0x7fffff8007a8, 
> num_bytes=8388608, chunk_offset=5242880, device=0x5555555d59e0, 
> trans=0x5555555f2430) at volumes.c:610
> #34 btrfs_alloc_chunk (trans=trans@entry=0x5555555f2430, 
> info=info@entry=0x5555555d2970, start=start@entry=0x7fffff8008d8, 
> num_bytes=num_bytes@entry=0x7fffff8008e0, type=4) at volumes.c:1143
> #35 0x0000555555575ca4 in do_chunk_alloc (trans=trans@entry=0x5555555f2430, 
> fs_info=fs_info@entry=0x5555555d2970, alloc_bytes=alloc_bytes@entry=16384, 
> flags=flags@entry=4) at extent-tree.c:1876
> 

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to