CC: kbuild-all(a)lists.01.org CC: Omar Sandoval CC: linux-kernel(a)vger.kernel.org TO: Omar Sandoval tree: https://github.com/osandov/linux.git btrfs-send-encoded-v10 head: a87f8dd5b9e777c136ab986baa9b751f9c1909a6 commit: 6716dfd581687f8662d3c828ca2f9911ba58c721 [8/14] btrfs: add BTRFS_IOC_ENCODED_READ :::::: branch date: 2 days ago :::::: commit date: 2 days ago config: nds32-randconfig-m031-20210818 (attached as .config) compiler: nds32le-linux-gcc (GCC) 11.2.0 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot Reported-by: Dan Carpenter New smatch warnings: fs/btrfs/inode.c:10827 btrfs_encoded_read_regular() warn: potentially one past the end of array 'pages[i]' fs/btrfs/inode.c:10827 btrfs_encoded_read_regular() warn: potentially one past the end of array 'pages[i]' Old smatch warnings: fs/btrfs/inode.c:287 insert_inline_extent() error: we previously assumed 'compressed_pages' could be null (see line 256) vim +10827 fs/btrfs/inode.c 6716dfd581687f Omar Sandoval 2019-10-09 10777 6716dfd581687f Omar Sandoval 2019-10-09 10778 static ssize_t btrfs_encoded_read_regular(struct kiocb *iocb, 6716dfd581687f Omar Sandoval 2019-10-09 10779 struct iov_iter *iter, 6716dfd581687f Omar Sandoval 2019-10-09 10780 u64 start, u64 lockend, 6716dfd581687f Omar Sandoval 2019-10-09 10781 struct extent_state **cached_state, 6716dfd581687f Omar Sandoval 2019-10-09 10782 u64 offset, u64 disk_io_size, 6716dfd581687f Omar Sandoval 2019-10-09 10783 size_t count, bool compressed, 6716dfd581687f Omar Sandoval 2019-10-09 10784 bool *unlocked) 6716dfd581687f Omar Sandoval 2019-10-09 10785 { 6716dfd581687f Omar Sandoval 2019-10-09 10786 struct inode *inode = file_inode(iocb->ki_filp); 6716dfd581687f Omar Sandoval 2019-10-09 10787 struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree; 6716dfd581687f Omar Sandoval 2019-10-09 10788 struct page **pages; 6716dfd581687f Omar Sandoval 2019-10-09 10789 unsigned long nr_pages, i; 6716dfd581687f Omar Sandoval 2019-10-09 10790 u64 cur; 6716dfd581687f Omar Sandoval 2019-10-09 10791 size_t page_offset; 6716dfd581687f Omar Sandoval 2019-10-09 10792 ssize_t ret; 6716dfd581687f Omar Sandoval 2019-10-09 10793 6716dfd581687f Omar Sandoval 2019-10-09 10794 nr_pages = DIV_ROUND_UP(disk_io_size, PAGE_SIZE); 6716dfd581687f Omar Sandoval 2019-10-09 10795 pages = kcalloc(nr_pages, sizeof(struct page *), GFP_NOFS); 6716dfd581687f Omar Sandoval 2019-10-09 10796 if (!pages) 6716dfd581687f Omar Sandoval 2019-10-09 10797 return -ENOMEM; 6716dfd581687f Omar Sandoval 2019-10-09 10798 for (i = 0; i < nr_pages; i++) { 6716dfd581687f Omar Sandoval 2019-10-09 10799 pages[i] = alloc_page(GFP_NOFS | __GFP_HIGHMEM); 6716dfd581687f Omar Sandoval 2019-10-09 10800 if (!pages[i]) { 6716dfd581687f Omar Sandoval 2019-10-09 10801 ret = -ENOMEM; 6716dfd581687f Omar Sandoval 2019-10-09 10802 goto out; 6716dfd581687f Omar Sandoval 2019-10-09 10803 } 6716dfd581687f Omar Sandoval 2019-10-09 10804 } 6716dfd581687f Omar Sandoval 2019-10-09 10805 6716dfd581687f Omar Sandoval 2019-10-09 10806 ret = btrfs_encoded_read_regular_fill_pages(inode, offset, disk_io_size, 6716dfd581687f Omar Sandoval 2019-10-09 10807 pages); 6716dfd581687f Omar Sandoval 2019-10-09 10808 if (ret) 6716dfd581687f Omar Sandoval 2019-10-09 10809 goto out; 6716dfd581687f Omar Sandoval 2019-10-09 10810 6716dfd581687f Omar Sandoval 2019-10-09 10811 unlock_extent_cached(io_tree, start, lockend, cached_state); 6716dfd581687f Omar Sandoval 2019-10-09 10812 inode_unlock_shared(inode); 6716dfd581687f Omar Sandoval 2019-10-09 10813 *unlocked = true; 6716dfd581687f Omar Sandoval 2019-10-09 10814 6716dfd581687f Omar Sandoval 2019-10-09 10815 if (compressed) { 6716dfd581687f Omar Sandoval 2019-10-09 10816 i = 0; 6716dfd581687f Omar Sandoval 2019-10-09 10817 page_offset = 0; 6716dfd581687f Omar Sandoval 2019-10-09 10818 } else { 6716dfd581687f Omar Sandoval 2019-10-09 10819 i = (iocb->ki_pos - start) >> PAGE_SHIFT; 6716dfd581687f Omar Sandoval 2019-10-09 10820 page_offset = (iocb->ki_pos - start) & (PAGE_SIZE - 1); 6716dfd581687f Omar Sandoval 2019-10-09 10821 } 6716dfd581687f Omar Sandoval 2019-10-09 10822 cur = 0; 6716dfd581687f Omar Sandoval 2019-10-09 10823 while (cur < count) { 6716dfd581687f Omar Sandoval 2019-10-09 10824 size_t bytes = min_t(size_t, count - cur, 6716dfd581687f Omar Sandoval 2019-10-09 10825 PAGE_SIZE - page_offset); 6716dfd581687f Omar Sandoval 2019-10-09 10826 6716dfd581687f Omar Sandoval 2019-10-09 @10827 if (copy_page_to_iter(pages[i], page_offset, bytes, 6716dfd581687f Omar Sandoval 2019-10-09 10828 iter) != bytes) { 6716dfd581687f Omar Sandoval 2019-10-09 10829 ret = -EFAULT; 6716dfd581687f Omar Sandoval 2019-10-09 10830 goto out; 6716dfd581687f Omar Sandoval 2019-10-09 10831 } 6716dfd581687f Omar Sandoval 2019-10-09 10832 i++; 6716dfd581687f Omar Sandoval 2019-10-09 10833 cur += bytes; 6716dfd581687f Omar Sandoval 2019-10-09 10834 page_offset = 0; 6716dfd581687f Omar Sandoval 2019-10-09 10835 } 6716dfd581687f Omar Sandoval 2019-10-09 10836 ret = count; 6716dfd581687f Omar Sandoval 2019-10-09 10837 out: 6716dfd581687f Omar Sandoval 2019-10-09 10838 for (i = 0; i < nr_pages; i++) { 6716dfd581687f Omar Sandoval 2019-10-09 10839 if (pages[i]) 6716dfd581687f Omar Sandoval 2019-10-09 10840 __free_page(pages[i]); 6716dfd581687f Omar Sandoval 2019-10-09 10841 } 6716dfd581687f Omar Sandoval 2019-10-09 10842 kfree(pages); 6716dfd581687f Omar Sandoval 2019-10-09 10843 return ret; 6716dfd581687f Omar Sandoval 2019-10-09 10844 } 6716dfd581687f Omar Sandoval 2019-10-09 10845 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org