Hi Jeff, I love your patch! Perhaps something to improve: [auto build test WARNING on next-20220929] [cannot apply to tytso-ext4/dev trondmy-nfs/linux-next ceph-client/for-linus linus/master v6.0-rc7 v6.0-rc6 v6.0-rc5 v6.0-rc7] [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/Jeff-Layton/vfs-nfsd-clean-up-handling-of-i_version-counter/20220930-192844 base: 1c6c4f42b3de4f18ea96d62950d0e266ca35a055 config: i386-randconfig-a002 compiler: clang version 14.0.6 (https://github.com/llvm/llvm-project f28c006a5895fc0e329fe15fead81e37457cb1d1) 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://github.com/intel-lab-lkp/linux/commit/b305ff6981591917824b59e5ac7f833afea77ce6 git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review Jeff-Layton/vfs-nfsd-clean-up-handling-of-i_version-counter/20220930-192844 git checkout b305ff6981591917824b59e5ac7f833afea77ce6 # save the config file mkdir build_dir && cp config build_dir/.config COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=i386 SHELL=/bin/bash If you fix the issue, kindly add following tag where applicable | Reported-by: kernel test robot All warnings (new ones prefixed by >>): >> mm/filemap.c:3892:65: warning: format specifies type 'long' but the argument has type 'ssize_t' (aka 'int') [-Wformat] WARN_ONCE(err, "Failed to update m/ctime after write: %ld\n", err); ~~~ ^~~ %zd include/asm-generic/bug.h:151:38: note: expanded from macro 'WARN_ONCE' DO_ONCE_LITE_IF(condition, WARN, 1, format) ^~~~~~ include/linux/once_lite.h:31:9: note: expanded from macro 'DO_ONCE_LITE_IF' func(__VA_ARGS__); \ ^~~~~~~~~~~ include/asm-generic/bug.h:133:29: note: expanded from macro 'WARN' __WARN_printf(TAINT_WARN, format); \ ^~~~~~ include/asm-generic/bug.h:105:17: note: expanded from macro '__WARN_printf' __warn_printk(arg); \ ^~~ 1 warning generated. vim +3892 mm/filemap.c 3793 3794 /** 3795 * __generic_file_write_iter - write data to a file 3796 * @iocb: IO state structure (file, offset, etc.) 3797 * @from: iov_iter with data to write 3798 * 3799 * This function does all the work needed for actually writing data to a 3800 * file. It does all basic checks, removes SUID from the file, updates 3801 * modification times and calls proper subroutines depending on whether we 3802 * do direct IO or a standard buffered write. 3803 * 3804 * It expects i_rwsem to be grabbed unless we work on a block device or similar 3805 * object which does not need locking at all. 3806 * 3807 * This function does *not* take care of syncing data in case of O_SYNC write. 3808 * A caller has to handle it. This is mainly due to the fact that we want to 3809 * avoid syncing under i_rwsem. 3810 * 3811 * Return: 3812 * * number of bytes written, even for truncated writes 3813 * * negative error code if no data has been written at all 3814 */ 3815 ssize_t __generic_file_write_iter(struct kiocb *iocb, struct iov_iter *from) 3816 { 3817 struct file *file = iocb->ki_filp; 3818 struct address_space *mapping = file->f_mapping; 3819 struct inode *inode = mapping->host; 3820 ssize_t written = 0; 3821 ssize_t err; 3822 ssize_t status; 3823 3824 /* We can write back this queue in page reclaim */ 3825 current->backing_dev_info = inode_to_bdi(inode); 3826 err = file_remove_privs(file); 3827 if (err) 3828 goto out; 3829 3830 if (iocb->ki_flags & IOCB_DIRECT) { 3831 loff_t pos, endbyte; 3832 3833 written = generic_file_direct_write(iocb, from); 3834 /* 3835 * If the write stopped short of completing, fall back to 3836 * buffered writes. Some filesystems do this for writes to 3837 * holes, for example. For DAX files, a buffered write will 3838 * not succeed (even if it did, DAX does not handle dirty 3839 * page-cache pages correctly). 3840 */ 3841 if (written < 0 || !iov_iter_count(from) || IS_DAX(inode)) 3842 goto out; 3843 3844 pos = iocb->ki_pos; 3845 status = generic_perform_write(iocb, from); 3846 /* 3847 * If generic_perform_write() returned a synchronous error 3848 * then we want to return the number of bytes which were 3849 * direct-written, or the error code if that was zero. Note 3850 * that this differs from normal direct-io semantics, which 3851 * will return -EFOO even if some bytes were written. 3852 */ 3853 if (unlikely(status < 0)) { 3854 err = status; 3855 goto out; 3856 } 3857 /* 3858 * We need to ensure that the page cache pages are written to 3859 * disk and invalidated to preserve the expected O_DIRECT 3860 * semantics. 3861 */ 3862 endbyte = pos + status - 1; 3863 err = filemap_write_and_wait_range(mapping, pos, endbyte); 3864 if (err == 0) { 3865 iocb->ki_pos = endbyte + 1; 3866 written += status; 3867 invalidate_mapping_pages(mapping, 3868 pos >> PAGE_SHIFT, 3869 endbyte >> PAGE_SHIFT); 3870 } else { 3871 /* 3872 * We don't know how much we wrote, so just return 3873 * the number of bytes which were direct-written 3874 */ 3875 } 3876 } else { 3877 written = generic_perform_write(iocb, from); 3878 if (likely(written > 0)) 3879 iocb->ki_pos += written; 3880 } 3881 out: 3882 if (written > 0) { 3883 err = file_update_time(file); 3884 /* 3885 * There isn't much we can do at this point if updating the 3886 * times fails after a successful write. The times and i_version 3887 * should still be updated in the inode, and it should still be 3888 * marked dirty, so hopefully the next inode update will catch it. 3889 * Log a warning once so we have a record that something untoward 3890 * has occurred. 3891 */ > 3892 WARN_ONCE(err, "Failed to update m/ctime after write: %ld\n", err); 3893 } 3894 3895 current->backing_dev_info = NULL; 3896 return written ? written : err; 3897 } 3898 EXPORT_SYMBOL(__generic_file_write_iter); 3899 -- 0-DAY CI Kernel Test Service https://01.org/lkp