Hi Jaegeuk, I love your patch! Yet something to improve: [auto build test ERROR on jaegeuk-f2fs/dev-test] [also build test ERROR on jaegeuk-f2fs/dev linus/master v6.1-rc8 next-20221205] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Jaegeuk-Kim/f2fs-specify-extent-cache-for-read-explicitly/20221206-025623 base: https://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs.git dev-test patch link: https://lore.kernel.org/r/20221205185433.3479699-4-jaegeuk%40kernel.org patch subject: [PATCH 4/6] f2fs: refactor extent_cache to support for read and more config: x86_64-rhel-8.3-kselftests compiler: gcc-11 (Debian 11.3.0-8) 11.3.0 reproduce (this is a W=1 build): # https://github.com/intel-lab-lkp/linux/commit/970774977d18a0fdceac12ea200d1be74554e371 git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review Jaegeuk-Kim/f2fs-specify-extent-cache-for-read-explicitly/20221206-025623 git checkout 970774977d18a0fdceac12ea200d1be74554e371 # save the config file mkdir build_dir && cp config build_dir/.config make W=1 O=build_dir ARCH=x86_64 SHELL=/bin/bash fs/f2fs/ If you fix the issue, kindly add following tag where applicable | Reported-by: kernel test robot All errors (new ones prefixed by >>): fs/f2fs/node.c: In function 'f2fs_get_dnode_of_data': >> fs/f2fs/node.c:864:17: error: implicit declaration of function 'f2fs_update_read_extent_tree_range_compressed'; did you mean 'f2fs_update_extent_tree_range_compressed'? [-Werror=implicit-function-declaration] 864 | f2fs_update_read_extent_tree_range_compressed(dn->inode, | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | f2fs_update_extent_tree_range_compressed cc1: some warnings being treated as errors vim +864 fs/f2fs/node.c 753 754 /* 755 * Caller should call f2fs_put_dnode(dn). 756 * Also, it should grab and release a rwsem by calling f2fs_lock_op() and 757 * f2fs_unlock_op() only if mode is set with ALLOC_NODE. 758 */ 759 int f2fs_get_dnode_of_data(struct dnode_of_data *dn, pgoff_t index, int mode) 760 { 761 struct f2fs_sb_info *sbi = F2FS_I_SB(dn->inode); 762 struct page *npage[4]; 763 struct page *parent = NULL; 764 int offset[4]; 765 unsigned int noffset[4]; 766 nid_t nids[4]; 767 int level, i = 0; 768 int err = 0; 769 770 level = get_node_path(dn->inode, index, offset, noffset); 771 if (level < 0) 772 return level; 773 774 nids[0] = dn->inode->i_ino; 775 npage[0] = dn->inode_page; 776 777 if (!npage[0]) { 778 npage[0] = f2fs_get_node_page(sbi, nids[0]); 779 if (IS_ERR(npage[0])) 780 return PTR_ERR(npage[0]); 781 } 782 783 /* if inline_data is set, should not report any block indices */ 784 if (f2fs_has_inline_data(dn->inode) && index) { 785 err = -ENOENT; 786 f2fs_put_page(npage[0], 1); 787 goto release_out; 788 } 789 790 parent = npage[0]; 791 if (level != 0) 792 nids[1] = get_nid(parent, offset[0], true); 793 dn->inode_page = npage[0]; 794 dn->inode_page_locked = true; 795 796 /* get indirect or direct nodes */ 797 for (i = 1; i <= level; i++) { 798 bool done = false; 799 800 if (!nids[i] && mode == ALLOC_NODE) { 801 /* alloc new node */ 802 if (!f2fs_alloc_nid(sbi, &(nids[i]))) { 803 err = -ENOSPC; 804 goto release_pages; 805 } 806 807 dn->nid = nids[i]; 808 npage[i] = f2fs_new_node_page(dn, noffset[i]); 809 if (IS_ERR(npage[i])) { 810 f2fs_alloc_nid_failed(sbi, nids[i]); 811 err = PTR_ERR(npage[i]); 812 goto release_pages; 813 } 814 815 set_nid(parent, offset[i - 1], nids[i], i == 1); 816 f2fs_alloc_nid_done(sbi, nids[i]); 817 done = true; 818 } else if (mode == LOOKUP_NODE_RA && i == level && level > 1) { 819 npage[i] = f2fs_get_node_page_ra(parent, offset[i - 1]); 820 if (IS_ERR(npage[i])) { 821 err = PTR_ERR(npage[i]); 822 goto release_pages; 823 } 824 done = true; 825 } 826 if (i == 1) { 827 dn->inode_page_locked = false; 828 unlock_page(parent); 829 } else { 830 f2fs_put_page(parent, 1); 831 } 832 833 if (!done) { 834 npage[i] = f2fs_get_node_page(sbi, nids[i]); 835 if (IS_ERR(npage[i])) { 836 err = PTR_ERR(npage[i]); 837 f2fs_put_page(npage[0], 0); 838 goto release_out; 839 } 840 } 841 if (i < level) { 842 parent = npage[i]; 843 nids[i + 1] = get_nid(parent, offset[i], false); 844 } 845 } 846 dn->nid = nids[level]; 847 dn->ofs_in_node = offset[level]; 848 dn->node_page = npage[level]; 849 dn->data_blkaddr = f2fs_data_blkaddr(dn); 850 851 if (is_inode_flag_set(dn->inode, FI_COMPRESSED_FILE) && 852 f2fs_sb_has_readonly(sbi)) { 853 unsigned int c_len = f2fs_cluster_blocks_are_contiguous(dn); 854 block_t blkaddr; 855 856 if (!c_len) 857 goto out; 858 859 blkaddr = f2fs_data_blkaddr(dn); 860 if (blkaddr == COMPRESS_ADDR) 861 blkaddr = data_blkaddr(dn->inode, dn->node_page, 862 dn->ofs_in_node + 1); 863 > 864 f2fs_update_read_extent_tree_range_compressed(dn->inode, 865 index, blkaddr, 866 F2FS_I(dn->inode)->i_cluster_size, 867 c_len); 868 } 869 out: 870 return 0; 871 872 release_pages: 873 f2fs_put_page(parent, 1); 874 if (i > 1) 875 f2fs_put_page(npage[0], 0); 876 release_out: 877 dn->inode_page = NULL; 878 dn->node_page = NULL; 879 if (err == -ENOENT) { 880 dn->cur_level = i; 881 dn->max_level = level; 882 dn->ofs_in_node = offset[level]; 883 } 884 return err; 885 } 886 -- 0-DAY CI Kernel Test Service https://01.org/lkp