Thread (4 messages) 4 messages, 4 authors, 2021-01-04

[kbuild] Re: [PATCH v3] btrfs: Make btrfs_direct_write atomic with respect to inode_lock

From: Dan Carpenter <hidden>
Date: 2021-01-04 10:11:59
Also in: oe-kbuild, oe-kbuild-all

Hi Goldwyn,

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
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 <redacted>
Reported-by: Dan Carpenter <redacted>

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  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;
                                                        ^^^^^^^^^^
This needs to be "bool dsync = false;"

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  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org 

Attachments

Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help