tree: https://git.kernel.org/pub/scm/linux/kernel/git/gfs2/linux-gfs2.git for-next head: 3d7b481b8a996e68339268487c0d3c8e54a2c274 commit: 32c8d6969d43c1bce394f75e9bcf32697146a773 [16/17] gfs2: Don't get stuck on partial buffered writes config: hexagon-randconfig-r022-20220325 (https://download.01.org/0day-ci/archive/20220326/202203260944.dmj6xxb2-...@intel.com/config) compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project 0f6d9501cf49ce02937099350d08f20c4af86f3d) 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/gfs2/linux-gfs2.git/commit/?id=32c8d6969d43c1bce394f75e9bcf32697146a773 git remote add gfs2 https://git.kernel.org/pub/scm/linux/kernel/git/gfs2/linux-gfs2.git git fetch --no-tags gfs2 for-next git checkout 32c8d6969d43c1bce394f75e9bcf32697146a773 # 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/gfs2/
If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <l...@intel.com> All warnings (new ones prefixed by >>): >> fs/gfs2/file.c:1073:14: warning: comparison of distinct pointer types >> ('typeof ((1UL << 18) - ((unsigned long)(iocb->ki_pos) & ~(~((1 << 18) - >> 1)))) *' (aka 'unsigned long *') and 'typeof (iov_iter_count(from)) *' (aka >> 'unsigned int *')) [-Wcompare-distinct-pointer-types] min_size = min(PAGE_SIZE - offset_in_page(iocb->ki_pos), ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ include/linux/minmax.h:45:19: note: expanded from macro 'min' #define min(x, y) __careful_cmp(x, y, <) ^~~~~~~~~~~~~~~~~~~~~~ include/linux/minmax.h:36:24: note: expanded from macro '__careful_cmp' __builtin_choose_expr(__safe_cmp(x, y), \ ^~~~~~~~~~~~~~~~ include/linux/minmax.h:26:4: note: expanded from macro '__safe_cmp' (__typecheck(x, y) && __no_side_effects(x, y)) ^~~~~~~~~~~~~~~~~ include/linux/minmax.h:20:28: note: expanded from macro '__typecheck' (!!(sizeof((typeof(x) *)1 == (typeof(y) *)1))) ~~~~~~~~~~~~~~ ^ ~~~~~~~~~~~~~~ 1 warning generated. vim +1073 fs/gfs2/file.c 1005 1006 static ssize_t gfs2_file_buffered_write(struct kiocb *iocb, 1007 struct iov_iter *from, 1008 struct gfs2_holder *gh) 1009 { 1010 struct file *file = iocb->ki_filp; 1011 struct inode *inode = file_inode(file); 1012 struct gfs2_inode *ip = GFS2_I(inode); 1013 struct gfs2_sbd *sdp = GFS2_SB(inode); 1014 struct gfs2_holder *statfs_gh = NULL; 1015 size_t prev_count = 0, window_size = 0; 1016 size_t read = 0; 1017 ssize_t ret; 1018 1019 /* 1020 * In this function, we disable page faults when we're holding the 1021 * inode glock while doing I/O. If a page fault occurs, we indicate 1022 * that the inode glock may be dropped, fault in the pages manually, 1023 * and retry. 1024 */ 1025 1026 if (inode == sdp->sd_rindex) { 1027 statfs_gh = kmalloc(sizeof(*statfs_gh), GFP_NOFS); 1028 if (!statfs_gh) 1029 return -ENOMEM; 1030 } 1031 1032 gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, gh); 1033 retry: 1034 ret = gfs2_glock_nq(gh); 1035 if (ret) 1036 goto out_uninit; 1037 retry_under_glock: 1038 if (inode == sdp->sd_rindex) { 1039 struct gfs2_inode *m_ip = GFS2_I(sdp->sd_statfs_inode); 1040 1041 ret = gfs2_glock_nq_init(m_ip->i_gl, LM_ST_EXCLUSIVE, 1042 GL_NOCACHE, statfs_gh); 1043 if (ret) 1044 goto out_unlock; 1045 } 1046 1047 current->backing_dev_info = inode_to_bdi(inode); 1048 pagefault_disable(); 1049 ret = iomap_file_buffered_write(iocb, from, &gfs2_iomap_ops); 1050 pagefault_enable(); 1051 current->backing_dev_info = NULL; 1052 if (ret > 0) { 1053 iocb->ki_pos += ret; 1054 read += ret; 1055 } 1056 1057 if (inode == sdp->sd_rindex) 1058 gfs2_glock_dq_uninit(statfs_gh); 1059 1060 if (should_fault_in_pages(ret, from, &prev_count, &window_size)) { 1061 size_t min_size, leftover; 1062 1063 /* 1064 * Make sure to fault in enough memory to fill at least one 1065 * page cache page. Otherwise, we could end up with a partial 1066 * write that __iomap_write_end() treats as a zero-length 1067 * write, and we would get stuck. 1068 * 1069 * Note that we assume that after fault_in_iov_iter_readable(), 1070 * at least min_size bytes of memory will be readable. This 1071 * could change with sub-page pointer color probing. 1072 */ > 1073 min_size = min(PAGE_SIZE - offset_in_page(iocb->ki_pos), 1074 iov_iter_count(from)); 1075 if (window_size < min_size) 1076 window_size = min_size; 1077 1078 gfs2_holder_allow_demote(gh); 1079 leftover = fault_in_iov_iter_readable(from, window_size); 1080 gfs2_holder_disallow_demote(gh); 1081 if (window_size - leftover >= min_size) { 1082 if (gfs2_holder_queued(gh)) 1083 goto retry_under_glock; 1084 if (read && !(iocb->ki_flags & IOCB_DIRECT)) 1085 goto out_uninit; 1086 goto retry; 1087 } 1088 } 1089 out_unlock: 1090 if (gfs2_holder_queued(gh)) 1091 gfs2_glock_dq(gh); 1092 out_uninit: 1093 gfs2_holder_uninit(gh); 1094 if (statfs_gh) 1095 kfree(statfs_gh); 1096 return read ? read : ret; 1097 } 1098 -- 0-DAY CI Kernel Test Service https://01.org/lkp