Re: fs/btrfs/inode.c:569:2: error: call to __compiletime_assert_921 declared with 'error' attribute: BUILD_BUG_ON failed: (BTRFS_MAX_COMPRESSED % PAGE_SIZE) != 0

From: Nick Desaulniers
Date: Mon Nov 29 2021 - 17:02:40 EST


On Fri, Nov 26, 2021 at 10:22 AM kernel test robot <lkp@xxxxxxxxx> wrote:
>
> tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
> head: a4849f6000e29235a2707f22e39da6b897bb9543
> commit: b83a908498d68fafca931e1276e145b339cac5fb compiler_attributes.h: move __compiletime_{error|warning}
> date: 3 months ago
> config: hexagon-randconfig-r034-20211126 (https://download.01.org/0day-ci/archive/20211127/202111270255.UYOoN5VN-lkp@xxxxxxxxx/config)
> compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project 5162b558d8c0b542e752b037e72a69d5fd51eb1e)
> reproduce (this is a W=1 build):
> wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
> chmod +x ~/bin/make.cross
> # https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=b83a908498d68fafca931e1276e145b339cac5fb
> git remote add linus https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
> git fetch --no-tags linus master
> git checkout b83a908498d68fafca931e1276e145b339cac5fb
> # save the config file to linux build tree
> mkdir build_dir
> COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=hexagon SHELL=/bin/bash fs/btrfs/ prepare
>
> If you fix the issue, kindly add following tag as appropriate
> Reported-by: kernel test robot <lkp@xxxxxxxxx>
>
> All errors (new ones prefixed by >>):
>
> >> fs/btrfs/inode.c:569:2: error: call to __compiletime_assert_921 declared with 'error' attribute: BUILD_BUG_ON failed: (BTRFS_MAX_COMPRESSED % PAGE_SIZE) != 0
> BUILD_BUG_ON((BTRFS_MAX_COMPRESSED % PAGE_SIZE) != 0);
> ^
> include/linux/build_bug.h:50:2: note: expanded from macro 'BUILD_BUG_ON'
> BUILD_BUG_ON_MSG(condition, "BUILD_BUG_ON failed: " #condition)
> ^
> include/linux/build_bug.h:39:37: note: expanded from macro 'BUILD_BUG_ON_MSG'
> #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
> ^
> include/linux/compiler_types.h:322:2: note: expanded from macro 'compiletime_assert'
> _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
> ^
> include/linux/compiler_types.h:310:2: note: expanded from macro '_compiletime_assert'
> __compiletime_assert(condition, msg, prefix, suffix)
> ^
> include/linux/compiler_types.h:303:4: note: expanded from macro '__compiletime_assert'
> prefix ## suffix(); \
> ^
> <scratch space>:59:1: note: expanded from here
> __compiletime_assert_921
> ^
> >> fs/btrfs/inode.c:569:2: error: call to __compiletime_assert_921 declared with 'error' attribute: BUILD_BUG_ON failed: (BTRFS_MAX_COMPRESSED % PAGE_SIZE) != 0
> include/linux/build_bug.h:50:2: note: expanded from macro 'BUILD_BUG_ON'
> BUILD_BUG_ON_MSG(condition, "BUILD_BUG_ON failed: " #condition)
> ^
> include/linux/build_bug.h:39:37: note: expanded from macro 'BUILD_BUG_ON_MSG'
> #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
> ^
> include/linux/compiler_types.h:322:2: note: expanded from macro 'compiletime_assert'
> _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
> ^
> include/linux/compiler_types.h:310:2: note: expanded from macro '_compiletime_assert'
> __compiletime_assert(condition, msg, prefix, suffix)
> ^
> include/linux/compiler_types.h:303:4: note: expanded from macro '__compiletime_assert'
> prefix ## suffix(); \
> ^
> <scratch space>:59:1: note: expanded from here
> __compiletime_assert_921
> ^

Filed https://github.com/ClangBuiltLinux/linux/issues/1518 for now.
But when I run `make olddefconfig` with the provided randconfig, I do
see the following Kconfig warnings:

WARNING: unmet direct dependencies detected for BTRFS_FS
Depends on [n]: BLOCK [=y] && !PPC_256K_PAGES && !PAGE_SIZE_256KB [=y]
Selected by [m]:
- TEST_KMOD [=m] && RUNTIME_TESTING_MENU [=y] && m && MODULES [=y]
&& NETDEVICES [=y] && NET_CORE [=y] && INET [=y] && BLOCK [=y]

WARNING: unmet direct dependencies detected for BTRFS_FS
Depends on [n]: BLOCK [=y] && !PPC_256K_PAGES && !PAGE_SIZE_256KB [=y]
Selected by [m]:
- TEST_KMOD [=m] && RUNTIME_TESTING_MENU [=y] && m && MODULES [=y]
&& NETDEVICES [=y] && NET_CORE [=y] && INET [=y] && BLOCK [=y]

WARNING: unmet direct dependencies detected for BTRFS_FS
Depends on [n]: BLOCK [=y] && !PPC_256K_PAGES && !PAGE_SIZE_256KB [=y]
Selected by [m]:
- TEST_KMOD [=m] && RUNTIME_TESTING_MENU [=y] && m && MODULES [=y]
&& NETDEVICES [=y] && NET_CORE [=y] && INET [=y] && BLOCK [=y]

It looks like CONFIG_BLOCK=y, CONFIG_PPC_256K_PAGES=n, and
PAGE_SIZE_256KB=y in the randconfig, so I don't grok the Kconfig
warning.

---

If CONFIG_PAGE_SIZE_256KB is set, then in
arch/hexagon/include/asm/page.h we have:
30 #ifdef CONFIG_PAGE_SIZE_256KB
31 #define PAGE_SHIFT 18
...
53 #define PAGE_SIZE (1UL << PAGE_SHIFT)

then
fs/btrfs/compression.h:24:#define BTRFS_MAX_COMPRESSED (SZ_128K)
include/linux/sizes.h:
28 #define SZ_128K 0x00020000


so that's (1 << 18) == 0x40000. The failing assert is checking
(0x20000 % 0x40000 != 0) (0x20000 % 0x40000 == 0x20000).

Not really sure what to do at this point, but that's why this assert
is failing for this randconfig.


> 2 errors generated.
>
>
> vim +/error +569 fs/btrfs/inode.c
>
> 26d30f852907236 Anand Jain 2016-12-19 512
> d352ac68148b699 Chris Mason 2008-09-29 513 /*
> 771ed689d2cd534 Chris Mason 2008-11-06 514 * we create compressed extents in two phases. The first
> 771ed689d2cd534 Chris Mason 2008-11-06 515 * phase compresses a range of pages that have already been
> 771ed689d2cd534 Chris Mason 2008-11-06 516 * locked (both pages and state bits are locked).
> c8b978188c9a0fd Chris Mason 2008-10-29 517 *
> 771ed689d2cd534 Chris Mason 2008-11-06 518 * This is done inside an ordered work queue, and the compression
> 771ed689d2cd534 Chris Mason 2008-11-06 519 * is spread across many cpus. The actual IO submission is step
> 771ed689d2cd534 Chris Mason 2008-11-06 520 * two, and the ordered work queue takes care of making sure that
> 771ed689d2cd534 Chris Mason 2008-11-06 521 * happens in the same order things were put onto the queue by
> 771ed689d2cd534 Chris Mason 2008-11-06 522 * writepages and friends.
> c8b978188c9a0fd Chris Mason 2008-10-29 523 *
> 771ed689d2cd534 Chris Mason 2008-11-06 524 * If this code finds it can't get good compression, it puts an
> 771ed689d2cd534 Chris Mason 2008-11-06 525 * entry onto the work queue to write the uncompressed bytes. This
> 771ed689d2cd534 Chris Mason 2008-11-06 526 * makes sure that both compressed inodes and uncompressed inodes
> b257031408945eb Artem Bityutskiy 2012-07-25 527 * are written in the same order that the flusher thread sent them
> b257031408945eb Artem Bityutskiy 2012-07-25 528 * down.
> d352ac68148b699 Chris Mason 2008-09-29 529 */
> ac3e99334d640b6 Nikolay Borisov 2019-07-17 530 static noinline int compress_file_range(struct async_chunk *async_chunk)
> b888db2bd7b67f1 Chris Mason 2007-08-27 531 {
> 1368c6dac7f10a1 Nikolay Borisov 2019-03-12 532 struct inode *inode = async_chunk->inode;
> 0b246afa62b0cf5 Jeff Mahoney 2016-06-22 533 struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
> 0b246afa62b0cf5 Jeff Mahoney 2016-06-22 534 u64 blocksize = fs_info->sectorsize;
> 1368c6dac7f10a1 Nikolay Borisov 2019-03-12 535 u64 start = async_chunk->start;
> 1368c6dac7f10a1 Nikolay Borisov 2019-03-12 536 u64 end = async_chunk->end;
> c8b978188c9a0fd Chris Mason 2008-10-29 537 u64 actual_end;
> d98da49977f6739 Josef Bacik 2019-10-11 538 u64 i_size;
> e6dcd2dc9c48910 Chris Mason 2008-07-17 539 int ret = 0;
> c8b978188c9a0fd Chris Mason 2008-10-29 540 struct page **pages = NULL;
> c8b978188c9a0fd Chris Mason 2008-10-29 541 unsigned long nr_pages;
> c8b978188c9a0fd Chris Mason 2008-10-29 542 unsigned long total_compressed = 0;
> c8b978188c9a0fd Chris Mason 2008-10-29 543 unsigned long total_in = 0;
> c8b978188c9a0fd Chris Mason 2008-10-29 544 int i;
> c8b978188c9a0fd Chris Mason 2008-10-29 545 int will_compress;
> 0b246afa62b0cf5 Jeff Mahoney 2016-06-22 546 int compress_type = fs_info->compress_type;
> ac3e99334d640b6 Nikolay Borisov 2019-07-17 547 int compressed_extents = 0;
> 4adaa611020fa6a Chris Mason 2013-03-26 548 int redirty = 0;
> b888db2bd7b67f1 Chris Mason 2007-08-27 549
> 6158e1ce1cc620d Nikolay Borisov 2017-02-20 550 inode_should_defrag(BTRFS_I(inode), start, end, end - start + 1,
> 6158e1ce1cc620d Nikolay Borisov 2017-02-20 551 SZ_16K);
> 4cb5300bc839b8a Chris Mason 2011-05-24 552
> d98da49977f6739 Josef Bacik 2019-10-11 553 /*
> d98da49977f6739 Josef Bacik 2019-10-11 554 * We need to save i_size before now because it could change in between
> d98da49977f6739 Josef Bacik 2019-10-11 555 * us evaluating the size and assigning it. This is because we lock and
> d98da49977f6739 Josef Bacik 2019-10-11 556 * unlock the page in truncate and fallocate, and then modify the i_size
> d98da49977f6739 Josef Bacik 2019-10-11 557 * later on.
> d98da49977f6739 Josef Bacik 2019-10-11 558 *
> d98da49977f6739 Josef Bacik 2019-10-11 559 * The barriers are to emulate READ_ONCE, remove that once i_size_read
> d98da49977f6739 Josef Bacik 2019-10-11 560 * does that for us.
> d98da49977f6739 Josef Bacik 2019-10-11 561 */
> d98da49977f6739 Josef Bacik 2019-10-11 562 barrier();
> d98da49977f6739 Josef Bacik 2019-10-11 563 i_size = i_size_read(inode);
> d98da49977f6739 Josef Bacik 2019-10-11 564 barrier();
> d98da49977f6739 Josef Bacik 2019-10-11 565 actual_end = min_t(u64, i_size, end + 1);
> c8b978188c9a0fd Chris Mason 2008-10-29 566 again:
> c8b978188c9a0fd Chris Mason 2008-10-29 567 will_compress = 0;
> 09cbfeaf1a5a67b Kirill A. Shutemov 2016-04-01 568 nr_pages = (end >> PAGE_SHIFT) - (start >> PAGE_SHIFT) + 1;
> 069eac7850890ac David Sterba 2017-02-14 @569 BUILD_BUG_ON((BTRFS_MAX_COMPRESSED % PAGE_SIZE) != 0);
> 069eac7850890ac David Sterba 2017-02-14 570 nr_pages = min_t(unsigned long, nr_pages,
> 069eac7850890ac David Sterba 2017-02-14 571 BTRFS_MAX_COMPRESSED / PAGE_SIZE);
> c8b978188c9a0fd Chris Mason 2008-10-29 572
> f03d9301f15fb69 Chris Mason 2009-02-04 573 /*
> f03d9301f15fb69 Chris Mason 2009-02-04 574 * we don't want to send crud past the end of i_size through
> f03d9301f15fb69 Chris Mason 2009-02-04 575 * compression, that's just a waste of CPU time. So, if the
> f03d9301f15fb69 Chris Mason 2009-02-04 576 * end of the file is before the start of our current
> f03d9301f15fb69 Chris Mason 2009-02-04 577 * requested range of bytes, we bail out to the uncompressed
> f03d9301f15fb69 Chris Mason 2009-02-04 578 * cleanup code that can deal with all of this.
> f03d9301f15fb69 Chris Mason 2009-02-04 579 *
> f03d9301f15fb69 Chris Mason 2009-02-04 580 * It isn't really the fastest way to fix things, but this is a
> f03d9301f15fb69 Chris Mason 2009-02-04 581 * very uncommon corner.
> f03d9301f15fb69 Chris Mason 2009-02-04 582 */
> f03d9301f15fb69 Chris Mason 2009-02-04 583 if (actual_end <= start)
> f03d9301f15fb69 Chris Mason 2009-02-04 584 goto cleanup_and_bail_uncompressed;
> f03d9301f15fb69 Chris Mason 2009-02-04 585
> c8b978188c9a0fd Chris Mason 2008-10-29 586 total_compressed = actual_end - start;
> c8b978188c9a0fd Chris Mason 2008-10-29 587
> 4bcbb33255131ad Shilong Wang 2014-10-07 588 /*
> 4bcbb33255131ad Shilong Wang 2014-10-07 589 * skip compression for a small file range(<=blocksize) that
> 0132761017e012a Nicholas D Steeves 2016-05-19 590 * isn't an inline extent, since it doesn't save disk space at all.
> 4bcbb33255131ad Shilong Wang 2014-10-07 591 */
> 4bcbb33255131ad Shilong Wang 2014-10-07 592 if (total_compressed <= blocksize &&
> 4bcbb33255131ad Shilong Wang 2014-10-07 593 (start > 0 || end + 1 < BTRFS_I(inode)->disk_i_size))
> 4bcbb33255131ad Shilong Wang 2014-10-07 594 goto cleanup_and_bail_uncompressed;
> 4bcbb33255131ad Shilong Wang 2014-10-07 595
> 069eac7850890ac David Sterba 2017-02-14 596 total_compressed = min_t(unsigned long, total_compressed,
> 069eac7850890ac David Sterba 2017-02-14 597 BTRFS_MAX_UNCOMPRESSED);
> c8b978188c9a0fd Chris Mason 2008-10-29 598 total_in = 0;
> c8b978188c9a0fd Chris Mason 2008-10-29 599 ret = 0;
> db94535db75e67f Chris Mason 2007-10-15 600
> 771ed689d2cd534 Chris Mason 2008-11-06 601 /*
> 771ed689d2cd534 Chris Mason 2008-11-06 602 * we do compression for mount -o compress and when the
> 771ed689d2cd534 Chris Mason 2008-11-06 603 * inode has not been flagged as nocompress. This flag can
> 771ed689d2cd534 Chris Mason 2008-11-06 604 * change at any time if we discover bad compression ratios.
> c8b978188c9a0fd Chris Mason 2008-10-29 605 */
> 808a12923203ee1 Nikolay Borisov 2020-06-03 606 if (inode_need_compress(BTRFS_I(inode), start, end)) {
> c8b978188c9a0fd Chris Mason 2008-10-29 607 WARN_ON(pages);
> 31e818fe7375d60 David Sterba 2015-02-20 608 pages = kcalloc(nr_pages, sizeof(struct page *), GFP_NOFS);
> 560f7d75457f86a Li Zefan 2011-09-08 609 if (!pages) {
> 560f7d75457f86a Li Zefan 2011-09-08 610 /* just bail out to the uncompressed code */
> 3527a018c00e5db Filipe Manana 2018-10-13 611 nr_pages = 0;
> 560f7d75457f86a Li Zefan 2011-09-08 612 goto cont;
> 560f7d75457f86a Li Zefan 2011-09-08 613 }
> c8b978188c9a0fd Chris Mason 2008-10-29 614
> eec63c65dcbeb14 David Sterba 2017-07-17 615 if (BTRFS_I(inode)->defrag_compress)
> eec63c65dcbeb14 David Sterba 2017-07-17 616 compress_type = BTRFS_I(inode)->defrag_compress;
> eec63c65dcbeb14 David Sterba 2017-07-17 617 else if (BTRFS_I(inode)->prop_compress)
> b52aa8c93e1fec9 David Sterba 2017-07-17 618 compress_type = BTRFS_I(inode)->prop_compress;
> 261507a02ccba9a Li Zefan 2010-12-17 619
> 4adaa611020fa6a Chris Mason 2013-03-26 620 /*
> 4adaa611020fa6a Chris Mason 2013-03-26 621 * we need to call clear_page_dirty_for_io on each
> 4adaa611020fa6a Chris Mason 2013-03-26 622 * page in the range. Otherwise applications with the file
> 4adaa611020fa6a Chris Mason 2013-03-26 623 * mmap'd can wander in and change the page contents while
> 4adaa611020fa6a Chris Mason 2013-03-26 624 * we are compressing them.
> 4adaa611020fa6a Chris Mason 2013-03-26 625 *
> 4adaa611020fa6a Chris Mason 2013-03-26 626 * If the compression fails for any reason, we set the pages
> 4adaa611020fa6a Chris Mason 2013-03-26 627 * dirty again later on.
> e9679de3fdcb11a Timofey Titovets 2017-10-24 628 *
> e9679de3fdcb11a Timofey Titovets 2017-10-24 629 * Note that the remaining part is redirtied, the start pointer
> e9679de3fdcb11a Timofey Titovets 2017-10-24 630 * has moved, the end is the original one.
> 4adaa611020fa6a Chris Mason 2013-03-26 631 */
> e9679de3fdcb11a Timofey Titovets 2017-10-24 632 if (!redirty) {
> 4adaa611020fa6a Chris Mason 2013-03-26 633 extent_range_clear_dirty_for_io(inode, start, end);
> 4adaa611020fa6a Chris Mason 2013-03-26 634 redirty = 1;
> e9679de3fdcb11a Timofey Titovets 2017-10-24 635 }
> f51d2b59120ff36 David Sterba 2017-09-15 636
> f51d2b59120ff36 David Sterba 2017-09-15 637 /* Compression level is applied here and only here */
> f51d2b59120ff36 David Sterba 2017-09-15 638 ret = btrfs_compress_pages(
> f51d2b59120ff36 David Sterba 2017-09-15 639 compress_type | (fs_info->compress_level << 4),
> 261507a02ccba9a Li Zefan 2010-12-17 640 inode->i_mapping, start,
> 38c31464089f639 David Sterba 2017-02-14 641 pages,
> 4d3a800ebb12999 David Sterba 2017-02-14 642 &nr_pages,
> c8b978188c9a0fd Chris Mason 2008-10-29 643 &total_in,
> e5d74902362f1a0 David Sterba 2017-02-14 644 &total_compressed);
> c8b978188c9a0fd Chris Mason 2008-10-29 645
> c8b978188c9a0fd Chris Mason 2008-10-29 646 if (!ret) {
> 7073017aeb98db3 Johannes Thumshirn 2018-12-05 647 unsigned long offset = offset_in_page(total_compressed);
> 4d3a800ebb12999 David Sterba 2017-02-14 648 struct page *page = pages[nr_pages - 1];
> c8b978188c9a0fd Chris Mason 2008-10-29 649
> c8b978188c9a0fd Chris Mason 2008-10-29 650 /* zero the tail end of the last page, we might be
> c8b978188c9a0fd Chris Mason 2008-10-29 651 * sending it down to disk
> c8b978188c9a0fd Chris Mason 2008-10-29 652 */
> d048b9c2a737eb7 Ira Weiny 2021-05-04 653 if (offset)
> d048b9c2a737eb7 Ira Weiny 2021-05-04 654 memzero_page(page, offset, PAGE_SIZE - offset);
> c8b978188c9a0fd Chris Mason 2008-10-29 655 will_compress = 1;
> c8b978188c9a0fd Chris Mason 2008-10-29 656 }
> c8b978188c9a0fd Chris Mason 2008-10-29 657 }
> 560f7d75457f86a Li Zefan 2011-09-08 658 cont:
> c8b978188c9a0fd Chris Mason 2008-10-29 659 if (start == 0) {
> c8b978188c9a0fd Chris Mason 2008-10-29 660 /* lets try to make an inline extent */
> 6018ba0a0e1bc23 Timofey Titovets 2017-09-15 661 if (ret || total_in < actual_end) {
> c8b978188c9a0fd Chris Mason 2008-10-29 662 /* we didn't compress the entire range, try
> 771ed689d2cd534 Chris Mason 2008-11-06 663 * to make an uncompressed inline extent.
> c8b978188c9a0fd Chris Mason 2008-10-29 664 */
> a0349401c14f507 Nikolay Borisov 2020-06-03 665 ret = cow_file_range_inline(BTRFS_I(inode), start, end,
> a0349401c14f507 Nikolay Borisov 2020-06-03 666 0, BTRFS_COMPRESS_NONE,
> a0349401c14f507 Nikolay Borisov 2020-06-03 667 NULL);
> c8b978188c9a0fd Chris Mason 2008-10-29 668 } else {
> 771ed689d2cd534 Chris Mason 2008-11-06 669 /* try making a compressed inline extent */
> a0349401c14f507 Nikolay Borisov 2020-06-03 670 ret = cow_file_range_inline(BTRFS_I(inode), start, end,
> fe3f566cd19bb6d Li Zefan 2011-03-28 671 total_compressed,
> fe3f566cd19bb6d Li Zefan 2011-03-28 672 compress_type, pages);
> c8b978188c9a0fd Chris Mason 2008-10-29 673 }
> 79787eaab46121d Jeff Mahoney 2012-03-12 674 if (ret <= 0) {
> 151a41bc46df2a9 Josef Bacik 2013-07-29 675 unsigned long clear_flags = EXTENT_DELALLOC |
> 8b62f87bad9cf06 Josef Bacik 2017-10-19 676 EXTENT_DELALLOC_NEW | EXTENT_DEFRAG |
> 8b62f87bad9cf06 Josef Bacik 2017-10-19 677 EXTENT_DO_ACCOUNTING;
> e6eb43142a72ba3 Filipe Manana 2014-10-10 678 unsigned long page_error_op;
> e6eb43142a72ba3 Filipe Manana 2014-10-10 679
> e6eb43142a72ba3 Filipe Manana 2014-10-10 680 page_error_op = ret < 0 ? PAGE_SET_ERROR : 0;
> 151a41bc46df2a9 Josef Bacik 2013-07-29 681
> 771ed689d2cd534 Chris Mason 2008-11-06 682 /*
> 79787eaab46121d Jeff Mahoney 2012-03-12 683 * inline extent creation worked or returned error,
> 79787eaab46121d Jeff Mahoney 2012-03-12 684 * we don't need to create any more async work items.
> 79787eaab46121d Jeff Mahoney 2012-03-12 685 * Unlock and free up our temp pages.
> 8b62f87bad9cf06 Josef Bacik 2017-10-19 686 *
> 8b62f87bad9cf06 Josef Bacik 2017-10-19 687 * We use DO_ACCOUNTING here because we need the
> 8b62f87bad9cf06 Josef Bacik 2017-10-19 688 * delalloc_release_metadata to be done _after_ we drop
> 8b62f87bad9cf06 Josef Bacik 2017-10-19 689 * our outstanding extent for clearing delalloc for this
> 8b62f87bad9cf06 Josef Bacik 2017-10-19 690 * range.
> 771ed689d2cd534 Chris Mason 2008-11-06 691 */
> ad7ff17b65a0567 Nikolay Borisov 2020-06-03 692 extent_clear_unlock_delalloc(BTRFS_I(inode), start, end,
> ad7ff17b65a0567 Nikolay Borisov 2020-06-03 693 NULL,
> 74e9194afb2c5c6 Nikolay Borisov 2019-07-17 694 clear_flags,
> ba8b04c1d4adbc6 Qu Wenruo 2016-07-19 695 PAGE_UNLOCK |
> 6869b0a8be775e9 Qu Wenruo 2021-01-26 696 PAGE_START_WRITEBACK |
> e6eb43142a72ba3 Filipe Manana 2014-10-10 697 page_error_op |
> c2790a2e2bc8240 Josef Bacik 2013-07-29 698 PAGE_END_WRITEBACK);
> cecc8d9038d164e Nikolay Borisov 2019-07-17 699
> 1e6e238c3002ea3 Qu Wenruo 2020-07-28 700 /*
> 1e6e238c3002ea3 Qu Wenruo 2020-07-28 701 * Ensure we only free the compressed pages if we have
> 1e6e238c3002ea3 Qu Wenruo 2020-07-28 702 * them allocated, as we can still reach here with
> 1e6e238c3002ea3 Qu Wenruo 2020-07-28 703 * inode_need_compress() == false.
> 1e6e238c3002ea3 Qu Wenruo 2020-07-28 704 */
> 1e6e238c3002ea3 Qu Wenruo 2020-07-28 705 if (pages) {
> cecc8d9038d164e Nikolay Borisov 2019-07-17 706 for (i = 0; i < nr_pages; i++) {
> cecc8d9038d164e Nikolay Borisov 2019-07-17 707 WARN_ON(pages[i]->mapping);
> cecc8d9038d164e Nikolay Borisov 2019-07-17 708 put_page(pages[i]);
> cecc8d9038d164e Nikolay Borisov 2019-07-17 709 }
> cecc8d9038d164e Nikolay Borisov 2019-07-17 710 kfree(pages);
> 1e6e238c3002ea3 Qu Wenruo 2020-07-28 711 }
> cecc8d9038d164e Nikolay Borisov 2019-07-17 712 return 0;
> c8b978188c9a0fd Chris Mason 2008-10-29 713 }
> c8b978188c9a0fd Chris Mason 2008-10-29 714 }
> c8b978188c9a0fd Chris Mason 2008-10-29 715
> c8b978188c9a0fd Chris Mason 2008-10-29 716 if (will_compress) {
> c8b978188c9a0fd Chris Mason 2008-10-29 717 /*
> c8b978188c9a0fd Chris Mason 2008-10-29 718 * we aren't doing an inline extent round the compressed size
> c8b978188c9a0fd Chris Mason 2008-10-29 719 * up to a block size boundary so the allocator does sane
> c8b978188c9a0fd Chris Mason 2008-10-29 720 * things
> c8b978188c9a0fd Chris Mason 2008-10-29 721 */
> fda2832febb1928 Qu Wenruo 2013-02-26 722 total_compressed = ALIGN(total_compressed, blocksize);
> c8b978188c9a0fd Chris Mason 2008-10-29 723
> c8b978188c9a0fd Chris Mason 2008-10-29 724 /*
> c8b978188c9a0fd Chris Mason 2008-10-29 725 * one last check to make sure the compression is really a
> 170607ebd9c891d Timofey Titovets 2017-06-06 726 * win, compare the page count read with the blocks on disk,
> 170607ebd9c891d Timofey Titovets 2017-06-06 727 * compression must free at least one sector size
> c8b978188c9a0fd Chris Mason 2008-10-29 728 */
> 09cbfeaf1a5a67b Kirill A. Shutemov 2016-04-01 729 total_in = ALIGN(total_in, PAGE_SIZE);
> 170607ebd9c891d Timofey Titovets 2017-06-06 730 if (total_compressed + blocksize <= total_in) {
> ac3e99334d640b6 Nikolay Borisov 2019-07-17 731 compressed_extents++;
> c8bb0c8bd22a4b9 Ashish Samant 2016-03-25 732
> c8bb0c8bd22a4b9 Ashish Samant 2016-03-25 733 /*
> c8bb0c8bd22a4b9 Ashish Samant 2016-03-25 734 * The async work queues will take care of doing actual
> c8bb0c8bd22a4b9 Ashish Samant 2016-03-25 735 * allocation on disk for these compressed pages, and
> c8bb0c8bd22a4b9 Ashish Samant 2016-03-25 736 * will submit them to the elevator.
> c8bb0c8bd22a4b9 Ashish Samant 2016-03-25 737 */
> b5326271e791ea9 Nikolay Borisov 2019-03-12 738 add_async_extent(async_chunk, start, total_in,
> 4d3a800ebb12999 David Sterba 2017-02-14 739 total_compressed, pages, nr_pages,
> c8bb0c8bd22a4b9 Ashish Samant 2016-03-25 740 compress_type);
> c8bb0c8bd22a4b9 Ashish Samant 2016-03-25 741
> 1170862d783a3b4 Timofey Titovets 2017-10-03 742 if (start + total_in < end) {
> 1170862d783a3b4 Timofey Titovets 2017-10-03 743 start += total_in;
> c8bb0c8bd22a4b9 Ashish Samant 2016-03-25 744 pages = NULL;
> c8bb0c8bd22a4b9 Ashish Samant 2016-03-25 745 cond_resched();
> c8bb0c8bd22a4b9 Ashish Samant 2016-03-25 746 goto again;
> c8bb0c8bd22a4b9 Ashish Samant 2016-03-25 747 }
> ac3e99334d640b6 Nikolay Borisov 2019-07-17 748 return compressed_extents;
> c8b978188c9a0fd Chris Mason 2008-10-29 749 }
> c8b978188c9a0fd Chris Mason 2008-10-29 750 }
> c8bb0c8bd22a4b9 Ashish Samant 2016-03-25 751 if (pages) {
> c8b978188c9a0fd Chris Mason 2008-10-29 752 /*
> c8b978188c9a0fd Chris Mason 2008-10-29 753 * the compression code ran but failed to make things smaller,
> c8b978188c9a0fd Chris Mason 2008-10-29 754 * free any pages it allocated and our page pointer array
> c8b978188c9a0fd Chris Mason 2008-10-29 755 */
> 4d3a800ebb12999 David Sterba 2017-02-14 756 for (i = 0; i < nr_pages; i++) {
> 70b99e6959a4c28 Chris Mason 2008-10-31 757 WARN_ON(pages[i]->mapping);
> 09cbfeaf1a5a67b Kirill A. Shutemov 2016-04-01 758 put_page(pages[i]);
> c8b978188c9a0fd Chris Mason 2008-10-29 759 }
> c8b978188c9a0fd Chris Mason 2008-10-29 760 kfree(pages);
> c8b978188c9a0fd Chris Mason 2008-10-29 761 pages = NULL;
> c8b978188c9a0fd Chris Mason 2008-10-29 762 total_compressed = 0;
> 4d3a800ebb12999 David Sterba 2017-02-14 763 nr_pages = 0;
> c8b978188c9a0fd Chris Mason 2008-10-29 764
> c8b978188c9a0fd Chris Mason 2008-10-29 765 /* flag the file so we don't compress in the future */
> 0b246afa62b0cf5 Jeff Mahoney 2016-06-22 766 if (!btrfs_test_opt(fs_info, FORCE_COMPRESS) &&
> b52aa8c93e1fec9 David Sterba 2017-07-17 767 !(BTRFS_I(inode)->prop_compress)) {
> 6cbff00f4632c80 Christoph Hellwig 2009-04-17 768 BTRFS_I(inode)->flags |= BTRFS_INODE_NOCOMPRESS;
> c8b978188c9a0fd Chris Mason 2008-10-29 769 }
> 1e701a3292e25a6 Chris Mason 2010-03-11 770 }
> f03d9301f15fb69 Chris Mason 2009-02-04 771 cleanup_and_bail_uncompressed:
> 771ed689d2cd534 Chris Mason 2008-11-06 772 /*
> c8bb0c8bd22a4b9 Ashish Samant 2016-03-25 773 * No compression, but we still need to write the pages in the file
> c8bb0c8bd22a4b9 Ashish Samant 2016-03-25 774 * we've been given so far. redirty the locked page if it corresponds
> c8bb0c8bd22a4b9 Ashish Samant 2016-03-25 775 * to our extent and set things up for the async work queue to run
> c8bb0c8bd22a4b9 Ashish Samant 2016-03-25 776 * cow_file_range to do the normal delalloc dance.
> 771ed689d2cd534 Chris Mason 2008-11-06 777 */
> 1d53c9e6723022b Chris Mason 2019-07-10 778 if (async_chunk->locked_page &&
> 1d53c9e6723022b Chris Mason 2019-07-10 779 (page_offset(async_chunk->locked_page) >= start &&
> 1d53c9e6723022b Chris Mason 2019-07-10 780 page_offset(async_chunk->locked_page)) <= end) {
> 1368c6dac7f10a1 Nikolay Borisov 2019-03-12 781 __set_page_dirty_nobuffers(async_chunk->locked_page);
> 771ed689d2cd534 Chris Mason 2008-11-06 782 /* unlocked later on in the async handlers */
> 1d53c9e6723022b Chris Mason 2019-07-10 783 }
> c8bb0c8bd22a4b9 Ashish Samant 2016-03-25 784
> 4adaa611020fa6a Chris Mason 2013-03-26 785 if (redirty)
> 4adaa611020fa6a Chris Mason 2013-03-26 786 extent_range_redirty_for_io(inode, start, end);
> b5326271e791ea9 Nikolay Borisov 2019-03-12 787 add_async_extent(async_chunk, start, end - start + 1, 0, NULL, 0,
> c8bb0c8bd22a4b9 Ashish Samant 2016-03-25 788 BTRFS_COMPRESS_NONE);
> ac3e99334d640b6 Nikolay Borisov 2019-07-17 789 compressed_extents++;
> 3b951516ed703af Chris Mason 2008-04-17 790
> ac3e99334d640b6 Nikolay Borisov 2019-07-17 791 return compressed_extents;
> 771ed689d2cd534 Chris Mason 2008-11-06 792 }
> 771ed689d2cd534 Chris Mason 2008-11-06 793
>
> :::::: The code at line 569 was first introduced by commit
> :::::: 069eac7850890acf0d3c21a6c8ca9f33ddb34a0d btrfs: use predefined limits for calculating maximum number of pages for compression
>
> :::::: TO: David Sterba <dsterba@xxxxxxxx>
> :::::: CC: David Sterba <dsterba@xxxxxxxx>
>
> ---
> 0-DAY CI Kernel Test Service, Intel Corporation
> https://lists.01.org/hyperkitty/list/kbuild-all@xxxxxxxxxxxx



--
Thanks,
~Nick Desaulniers