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

Reply via email to