CC: [email protected] In-Reply-To: <8846c296bcd4d5d3c21c6a98ee467ab5060c6757.1608307404.git.rgold...@suse.com> References: <8846c296bcd4d5d3c21c6a98ee467ab5060c6757.1608307404.git.rgold...@suse.com> TO: Goldwyn Rodrigues <[email protected]> TO: [email protected] CC: Goldwyn Rodrigues <[email protected]>
Hi Goldwyn, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on kdave/for-next] [also build test WARNING on v5.11-rc1 next-20201223] [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] url: https://github.com/0day-ci/linux/commits/Goldwyn-Rodrigues/btrfs-Make-btrfs_direct_write-atomic-with-respect-to-inode_lock/20201219-001114 base: https://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux.git for-next :::::: branch date: 11 days ago :::::: commit date: 11 days ago config: x86_64-randconfig-m001-20201229 (attached as .config) compiler: gcc-9 (Debian 9.3.0-15) 9.3.0 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <[email protected]> Reported-by: Dan Carpenter <[email protected]> New smatch warnings: fs/btrfs/file.c:1980 btrfs_direct_write() error: uninitialized symbol 'dsync'. Old smatch warnings: fs/btrfs/file.c:1865 __btrfs_buffered_write() error: uninitialized symbol 'ret'. fs/btrfs/file.c:2013 btrfs_direct_write() error: uninitialized symbol 'dsync'. vim +/dsync +1980 fs/btrfs/file.c 4e4cabece9f9c6b Goldwyn Rodrigues 2020-09-24 1909 4e4cabece9f9c6b Goldwyn Rodrigues 2020-09-24 1910 static ssize_t btrfs_direct_write(struct kiocb *iocb, struct iov_iter *from) d0215f3e5ebb580 Josef Bacik 2011-01-25 1911 { d0215f3e5ebb580 Josef Bacik 2011-01-25 1912 struct file *file = iocb->ki_filp; 728404dacfddb53 Filipe Manana 2014-10-10 1913 struct inode *inode = file_inode(file); 4e4cabece9f9c6b Goldwyn Rodrigues 2020-09-24 1914 struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb); c352370633400d1 Goldwyn Rodrigues 2020-09-24 1915 loff_t pos; 4e4cabece9f9c6b Goldwyn Rodrigues 2020-09-24 1916 ssize_t written = 0; d0215f3e5ebb580 Josef Bacik 2011-01-25 1917 ssize_t written_buffered; d0215f3e5ebb580 Josef Bacik 2011-01-25 1918 loff_t endbyte; c352370633400d1 Goldwyn Rodrigues 2020-09-24 1919 ssize_t err; c352370633400d1 Goldwyn Rodrigues 2020-09-24 1920 unsigned int ilock_flags = 0; a42fa643169d232 Goldwyn Rodrigues 2020-09-24 1921 struct iomap_dio *dio = NULL; e7a8dd2d9537a7e Goldwyn Rodrigues 2020-12-18 1922 bool dsync; c352370633400d1 Goldwyn Rodrigues 2020-09-24 1923 c352370633400d1 Goldwyn Rodrigues 2020-09-24 1924 if (iocb->ki_flags & IOCB_NOWAIT) c352370633400d1 Goldwyn Rodrigues 2020-09-24 1925 ilock_flags |= BTRFS_ILOCK_TRY; c352370633400d1 Goldwyn Rodrigues 2020-09-24 1926 e9adabb9712ef94 Goldwyn Rodrigues 2020-09-24 1927 /* If the write DIO is within EOF, use a shared lock */ e9adabb9712ef94 Goldwyn Rodrigues 2020-09-24 1928 if (iocb->ki_pos + iov_iter_count(from) <= i_size_read(inode)) e9adabb9712ef94 Goldwyn Rodrigues 2020-09-24 1929 ilock_flags |= BTRFS_ILOCK_SHARED; e9adabb9712ef94 Goldwyn Rodrigues 2020-09-24 1930 e9adabb9712ef94 Goldwyn Rodrigues 2020-09-24 1931 relock: c352370633400d1 Goldwyn Rodrigues 2020-09-24 1932 err = btrfs_inode_lock(inode, ilock_flags); c352370633400d1 Goldwyn Rodrigues 2020-09-24 1933 if (err < 0) c352370633400d1 Goldwyn Rodrigues 2020-09-24 1934 return err; c352370633400d1 Goldwyn Rodrigues 2020-09-24 1935 c352370633400d1 Goldwyn Rodrigues 2020-09-24 1936 err = generic_write_checks(iocb, from); c352370633400d1 Goldwyn Rodrigues 2020-09-24 1937 if (err <= 0) { c352370633400d1 Goldwyn Rodrigues 2020-09-24 1938 btrfs_inode_unlock(inode, ilock_flags); c352370633400d1 Goldwyn Rodrigues 2020-09-24 1939 return err; c352370633400d1 Goldwyn Rodrigues 2020-09-24 1940 } d0215f3e5ebb580 Josef Bacik 2011-01-25 1941 c352370633400d1 Goldwyn Rodrigues 2020-09-24 1942 err = btrfs_write_check(iocb, from, err); e7a8dd2d9537a7e Goldwyn Rodrigues 2020-12-18 1943 if (err < 0) c352370633400d1 Goldwyn Rodrigues 2020-09-24 1944 goto out; c352370633400d1 Goldwyn Rodrigues 2020-09-24 1945 c352370633400d1 Goldwyn Rodrigues 2020-09-24 1946 pos = iocb->ki_pos; e9adabb9712ef94 Goldwyn Rodrigues 2020-09-24 1947 /* e9adabb9712ef94 Goldwyn Rodrigues 2020-09-24 1948 * Re-check since file size may have changed just before taking the e9adabb9712ef94 Goldwyn Rodrigues 2020-09-24 1949 * lock or pos may have changed because of O_APPEND in generic_write_check() e9adabb9712ef94 Goldwyn Rodrigues 2020-09-24 1950 */ e9adabb9712ef94 Goldwyn Rodrigues 2020-09-24 1951 if ((ilock_flags & BTRFS_ILOCK_SHARED) && e9adabb9712ef94 Goldwyn Rodrigues 2020-09-24 1952 pos + iov_iter_count(from) > i_size_read(inode)) { e9adabb9712ef94 Goldwyn Rodrigues 2020-09-24 1953 btrfs_inode_unlock(inode, ilock_flags); e9adabb9712ef94 Goldwyn Rodrigues 2020-09-24 1954 ilock_flags &= ~BTRFS_ILOCK_SHARED; e9adabb9712ef94 Goldwyn Rodrigues 2020-09-24 1955 goto relock; e9adabb9712ef94 Goldwyn Rodrigues 2020-09-24 1956 } c352370633400d1 Goldwyn Rodrigues 2020-09-24 1957 e7a8dd2d9537a7e Goldwyn Rodrigues 2020-12-18 1958 if (check_direct_IO(fs_info, from, pos)) 4e4cabece9f9c6b Goldwyn Rodrigues 2020-09-24 1959 goto buffered; 4e4cabece9f9c6b Goldwyn Rodrigues 2020-09-24 1960 a42fa643169d232 Goldwyn Rodrigues 2020-09-24 1961 dio = __iomap_dio_rw(iocb, from, &btrfs_dio_iomap_ops, 4e4cabece9f9c6b Goldwyn Rodrigues 2020-09-24 1962 &btrfs_dio_ops, is_sync_kiocb(iocb)); 4e4cabece9f9c6b Goldwyn Rodrigues 2020-09-24 1963 d0215f3e5ebb580 Josef Bacik 2011-01-25 1964 a42fa643169d232 Goldwyn Rodrigues 2020-09-24 1965 if (IS_ERR_OR_NULL(dio)) { a42fa643169d232 Goldwyn Rodrigues 2020-09-24 1966 err = PTR_ERR_OR_ZERO(dio); a42fa643169d232 Goldwyn Rodrigues 2020-09-24 1967 if (err < 0 && err != -ENOTBLK) a42fa643169d232 Goldwyn Rodrigues 2020-09-24 1968 goto out; a42fa643169d232 Goldwyn Rodrigues 2020-09-24 1969 } else { e7a8dd2d9537a7e Goldwyn Rodrigues 2020-12-18 1970 /* e7a8dd2d9537a7e Goldwyn Rodrigues 2020-12-18 1971 * Remove the DSYNC flag because iomap_dio_complete() calls e7a8dd2d9537a7e Goldwyn Rodrigues 2020-12-18 1972 * generic_write_sync() which may deadlock with btrfs_sync() e7a8dd2d9537a7e Goldwyn Rodrigues 2020-12-18 1973 * on inode->i_rwsem e7a8dd2d9537a7e Goldwyn Rodrigues 2020-12-18 1974 */ e7a8dd2d9537a7e Goldwyn Rodrigues 2020-12-18 1975 if (iocb->ki_flags & IOCB_DSYNC) { e7a8dd2d9537a7e Goldwyn Rodrigues 2020-12-18 1976 dsync = true; e7a8dd2d9537a7e Goldwyn Rodrigues 2020-12-18 1977 iocb->ki_flags &= ~IOCB_DSYNC; e7a8dd2d9537a7e Goldwyn Rodrigues 2020-12-18 1978 } a42fa643169d232 Goldwyn Rodrigues 2020-09-24 1979 written = iomap_dio_complete(dio); e7a8dd2d9537a7e Goldwyn Rodrigues 2020-12-18 @1980 if (dsync) e7a8dd2d9537a7e Goldwyn Rodrigues 2020-12-18 1981 iocb->ki_flags |= IOCB_DSYNC; a42fa643169d232 Goldwyn Rodrigues 2020-09-24 1982 } a42fa643169d232 Goldwyn Rodrigues 2020-09-24 1983 c352370633400d1 Goldwyn Rodrigues 2020-09-24 1984 if (written < 0 || !iov_iter_count(from)) { c352370633400d1 Goldwyn Rodrigues 2020-09-24 1985 err = written; c352370633400d1 Goldwyn Rodrigues 2020-09-24 1986 goto out; c352370633400d1 Goldwyn Rodrigues 2020-09-24 1987 } d0215f3e5ebb580 Josef Bacik 2011-01-25 1988 4e4cabece9f9c6b Goldwyn Rodrigues 2020-09-24 1989 buffered: e4af400a9c5081e Goldwyn Rodrigues 2018-06-17 1990 pos = iocb->ki_pos; e7a8dd2d9537a7e Goldwyn Rodrigues 2020-12-18 1991 written_buffered = __btrfs_buffered_write(iocb, from); d0215f3e5ebb580 Josef Bacik 2011-01-25 1992 if (written_buffered < 0) { d0215f3e5ebb580 Josef Bacik 2011-01-25 1993 err = written_buffered; d0215f3e5ebb580 Josef Bacik 2011-01-25 1994 goto out; d0215f3e5ebb580 Josef Bacik 2011-01-25 1995 } 075bdbdbe9f21d6 Filipe Manana 2014-10-09 1996 /* 075bdbdbe9f21d6 Filipe Manana 2014-10-09 1997 * Ensure all data is persisted. We want the next direct IO read to be 075bdbdbe9f21d6 Filipe Manana 2014-10-09 1998 * able to read what was just written. 075bdbdbe9f21d6 Filipe Manana 2014-10-09 1999 */ d0215f3e5ebb580 Josef Bacik 2011-01-25 2000 endbyte = pos + written_buffered - 1; 728404dacfddb53 Filipe Manana 2014-10-10 2001 err = btrfs_fdatawrite_range(inode, pos, endbyte); 075bdbdbe9f21d6 Filipe Manana 2014-10-09 2002 if (err) 075bdbdbe9f21d6 Filipe Manana 2014-10-09 2003 goto out; 728404dacfddb53 Filipe Manana 2014-10-10 2004 err = filemap_fdatawait_range(inode->i_mapping, pos, endbyte); d0215f3e5ebb580 Josef Bacik 2011-01-25 2005 if (err) d0215f3e5ebb580 Josef Bacik 2011-01-25 2006 goto out; d0215f3e5ebb580 Josef Bacik 2011-01-25 2007 written += written_buffered; 867c4f9329e1bf7 Al Viro 2014-02-11 2008 iocb->ki_pos = pos + written_buffered; 09cbfeaf1a5a67b Kirill A. Shutemov 2016-04-01 2009 invalidate_mapping_pages(file->f_mapping, pos >> PAGE_SHIFT, 09cbfeaf1a5a67b Kirill A. Shutemov 2016-04-01 2010 endbyte >> PAGE_SHIFT); 39279cc3d2704cf Chris Mason 2007-06-12 2011 out: e7a8dd2d9537a7e Goldwyn Rodrigues 2020-12-18 2012 btrfs_inode_unlock(inode, ilock_flags); e7a8dd2d9537a7e Goldwyn Rodrigues 2020-12-18 2013 if (written > 0 && dsync) e7a8dd2d9537a7e Goldwyn Rodrigues 2020-12-18 2014 generic_write_sync(iocb, written); e7a8dd2d9537a7e Goldwyn Rodrigues 2020-12-18 2015 d0215f3e5ebb580 Josef Bacik 2011-01-25 2016 return written ? written : err; d0215f3e5ebb580 Josef Bacik 2011-01-25 2017 } d0215f3e5ebb580 Josef Bacik 2011-01-25 2018 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/[email protected]
.config.gz
Description: application/gzip
_______________________________________________ kbuild mailing list -- [email protected] To unsubscribe send an email to [email protected]
