All of lore.kernel.org
 help / color / mirror / Atom feed
* fs/iomap/buffered-io.c:678 iomap_write_begin() warn: bitwise AND condition is false here
@ 2023-10-17 14:59 kernel test robot
  0 siblings, 0 replies; only message in thread
From: kernel test robot @ 2023-10-17 14:59 UTC (permalink / raw)
  To: oe-kbuild; +Cc: lkp, Dan Carpenter

BCC: lkp@intel.com
CC: oe-kbuild-all@lists.linux.dev
CC: linux-kernel@vger.kernel.org
TO: Christoph Hellwig <hch@lst.de>
CC: Jens Axboe <axboe@kernel.dk>
CC: Luis Chamberlain <mcgrof@kernel.org>
CC: Johannes Thumshirn <johannes.thumshirn@wdc.com>

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head:   213f891525c222e8ed145ce1ce7ae1f47921cb9c
commit: 925c86a19bacf8ce10eb666328fb3fa5aff7b951 fs: add CONFIG_BUFFER_HEAD
date:   3 months ago
:::::: branch date: 13 hours ago
:::::: commit date: 3 months ago
config: x86_64-allnoconfig (https://download.01.org/0day-ci/archive/20231017/202310172223.bVBxUtfx-lkp@intel.com/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
reproduce: (https://download.01.org/0day-ci/archive/20231017/202310172223.bVBxUtfx-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Reported-by: Dan Carpenter <error27@gmail.com>
| Closes: https://lore.kernel.org/r/202310172223.bVBxUtfx-lkp@intel.com/

smatch warnings:
fs/iomap/buffered-io.c:678 iomap_write_begin() warn: bitwise AND condition is false here
fs/iomap/buffered-io.c:748 iomap_write_end() warn: bitwise AND condition is false here
fs/iomap/buffered-io.c:1251 iomap_folio_mkwrite_iter() warn: bitwise AND condition is false here

vim +678 fs/iomap/buffered-io.c

69f4a26c1e0c7c Gao Xiang               2021-08-03  630  
d7b64041164ca1 Dave Chinner            2022-11-29  631  static int iomap_write_begin(struct iomap_iter *iter, loff_t pos,
bc6123a84a71b5 Matthew Wilcox (Oracle  2021-05-02  632) 		size_t len, struct folio **foliop)
afc51aaa22f26c Darrick J. Wong         2019-07-15  633  {
471859f57d4253 Andreas Gruenbacher     2023-01-15  634  	const struct iomap_folio_ops *folio_ops = iter->iomap.folio_ops;
fad0a1ab34f777 Christoph Hellwig       2021-08-10  635  	const struct iomap *srcmap = iomap_iter_srcmap(iter);
d1bd0b4ebfe052 Matthew Wilcox (Oracle  2021-11-03  636) 	struct folio *folio;
afc51aaa22f26c Darrick J. Wong         2019-07-15  637  	int status = 0;
afc51aaa22f26c Darrick J. Wong         2019-07-15  638  
1b5c1e36dc0e0f Christoph Hellwig       2021-08-10  639  	BUG_ON(pos + len > iter->iomap.offset + iter->iomap.length);
1b5c1e36dc0e0f Christoph Hellwig       2021-08-10  640  	if (srcmap != &iter->iomap)
c039b997927263 Goldwyn Rodrigues       2019-10-18  641  		BUG_ON(pos + len > srcmap->offset + srcmap->length);
afc51aaa22f26c Darrick J. Wong         2019-07-15  642  
afc51aaa22f26c Darrick J. Wong         2019-07-15  643  	if (fatal_signal_pending(current))
afc51aaa22f26c Darrick J. Wong         2019-07-15  644  		return -EINTR;
afc51aaa22f26c Darrick J. Wong         2019-07-15  645  
d454ab82bc7f4a Matthew Wilcox (Oracle  2021-12-09  646) 	if (!mapping_large_folio_support(iter->inode->i_mapping))
d454ab82bc7f4a Matthew Wilcox (Oracle  2021-12-09  647) 		len = min_t(size_t, len, PAGE_SIZE - offset_in_page(pos));
d454ab82bc7f4a Matthew Wilcox (Oracle  2021-12-09  648) 
07c22b56685dd7 Andreas Gruenbacher     2023-01-15  649  	folio = __iomap_get_folio(iter, pos, len);
9060bc4d3aca61 Andreas Gruenbacher     2023-01-15  650  	if (IS_ERR(folio))
98321b5139f92a Andreas Gruenbacher     2023-01-15  651  		return PTR_ERR(folio);
d7b64041164ca1 Dave Chinner            2022-11-29  652  
d7b64041164ca1 Dave Chinner            2022-11-29  653  	/*
d7b64041164ca1 Dave Chinner            2022-11-29  654  	 * Now we have a locked folio, before we do anything with it we need to
d7b64041164ca1 Dave Chinner            2022-11-29  655  	 * check that the iomap we have cached is not stale. The inode extent
d7b64041164ca1 Dave Chinner            2022-11-29  656  	 * mapping can change due to concurrent IO in flight (e.g.
d7b64041164ca1 Dave Chinner            2022-11-29  657  	 * IOMAP_UNWRITTEN state can change and memory reclaim could have
d7b64041164ca1 Dave Chinner            2022-11-29  658  	 * reclaimed a previously partially written page at this index after IO
d7b64041164ca1 Dave Chinner            2022-11-29  659  	 * completion before this write reaches this file offset) and hence we
d7b64041164ca1 Dave Chinner            2022-11-29  660  	 * could do the wrong thing here (zero a page range incorrectly or fail
d7b64041164ca1 Dave Chinner            2022-11-29  661  	 * to zero) and corrupt data.
d7b64041164ca1 Dave Chinner            2022-11-29  662  	 */
471859f57d4253 Andreas Gruenbacher     2023-01-15  663  	if (folio_ops && folio_ops->iomap_valid) {
471859f57d4253 Andreas Gruenbacher     2023-01-15  664  		bool iomap_valid = folio_ops->iomap_valid(iter->inode,
d7b64041164ca1 Dave Chinner            2022-11-29  665  							 &iter->iomap);
d7b64041164ca1 Dave Chinner            2022-11-29  666  		if (!iomap_valid) {
d7b64041164ca1 Dave Chinner            2022-11-29  667  			iter->iomap.flags |= IOMAP_F_STALE;
d7b64041164ca1 Dave Chinner            2022-11-29  668  			status = 0;
d7b64041164ca1 Dave Chinner            2022-11-29  669  			goto out_unlock;
d7b64041164ca1 Dave Chinner            2022-11-29  670  		}
d7b64041164ca1 Dave Chinner            2022-11-29  671  	}
d7b64041164ca1 Dave Chinner            2022-11-29  672  
d454ab82bc7f4a Matthew Wilcox (Oracle  2021-12-09  673) 	if (pos + len > folio_pos(folio) + folio_size(folio))
d454ab82bc7f4a Matthew Wilcox (Oracle  2021-12-09  674) 		len = folio_pos(folio) + folio_size(folio) - pos;
afc51aaa22f26c Darrick J. Wong         2019-07-15  675  
c039b997927263 Goldwyn Rodrigues       2019-10-18  676  	if (srcmap->type == IOMAP_INLINE)
bc6123a84a71b5 Matthew Wilcox (Oracle  2021-05-02  677) 		status = iomap_write_begin_inline(iter, folio);
1b5c1e36dc0e0f Christoph Hellwig       2021-08-10 @678  	else if (srcmap->flags & IOMAP_F_BUFFER_HEAD)
d1bd0b4ebfe052 Matthew Wilcox (Oracle  2021-11-03  679) 		status = __block_write_begin_int(folio, pos, len, NULL, srcmap);
afc51aaa22f26c Darrick J. Wong         2019-07-15  680  	else
bc6123a84a71b5 Matthew Wilcox (Oracle  2021-05-02  681) 		status = __iomap_write_begin(iter, pos, len, folio);
afc51aaa22f26c Darrick J. Wong         2019-07-15  682  
afc51aaa22f26c Darrick J. Wong         2019-07-15  683  	if (unlikely(status))
afc51aaa22f26c Darrick J. Wong         2019-07-15  684  		goto out_unlock;
afc51aaa22f26c Darrick J. Wong         2019-07-15  685  
bc6123a84a71b5 Matthew Wilcox (Oracle  2021-05-02  686) 	*foliop = folio;
afc51aaa22f26c Darrick J. Wong         2019-07-15  687  	return 0;
afc51aaa22f26c Darrick J. Wong         2019-07-15  688  
afc51aaa22f26c Darrick J. Wong         2019-07-15  689  out_unlock:
7a70a5085ed028 Andreas Gruenbacher     2023-01-15  690  	__iomap_put_folio(iter, pos, 0, folio);
1b5c1e36dc0e0f Christoph Hellwig       2021-08-10  691  	iomap_write_failed(iter->inode, pos, len);
afc51aaa22f26c Darrick J. Wong         2019-07-15  692  
afc51aaa22f26c Darrick J. Wong         2019-07-15  693  	return status;
afc51aaa22f26c Darrick J. Wong         2019-07-15  694  }
afc51aaa22f26c Darrick J. Wong         2019-07-15  695  
e25ba8cbfd16bb Matthew Wilcox (Oracle  2020-09-21  696) static size_t __iomap_write_end(struct inode *inode, loff_t pos, size_t len,
bc6123a84a71b5 Matthew Wilcox (Oracle  2021-05-02  697) 		size_t copied, struct folio *folio)
afc51aaa22f26c Darrick J. Wong         2019-07-15  698  {
cd1e5afe5503ed Matthew Wilcox (Oracle  2021-04-28  699) 	struct iomap_page *iop = to_iomap_page(folio);
bc6123a84a71b5 Matthew Wilcox (Oracle  2021-05-02  700) 	flush_dcache_folio(folio);
afc51aaa22f26c Darrick J. Wong         2019-07-15  701  
afc51aaa22f26c Darrick J. Wong         2019-07-15  702  	/*
afc51aaa22f26c Darrick J. Wong         2019-07-15  703  	 * The blocks that were entirely written will now be uptodate, so we
7479c505b4ab5e Matthew Wilcox (Oracle  2022-04-29  704) 	 * don't have to worry about a read_folio reading them and overwriting a
f1f264b4c134ee Andreas Gruenbacher     2021-08-02  705  	 * partial write.  However, if we've encountered a short write and only
afc51aaa22f26c Darrick J. Wong         2019-07-15  706  	 * partially written into a block, it will not be marked uptodate, so a
7479c505b4ab5e Matthew Wilcox (Oracle  2022-04-29  707) 	 * read_folio might come in and destroy our partial write.
afc51aaa22f26c Darrick J. Wong         2019-07-15  708  	 *
f1f264b4c134ee Andreas Gruenbacher     2021-08-02  709  	 * Do the simplest thing and just treat any short write to a
f1f264b4c134ee Andreas Gruenbacher     2021-08-02  710  	 * non-uptodate page as a zero-length write, and force the caller to
f1f264b4c134ee Andreas Gruenbacher     2021-08-02  711  	 * redo the whole thing.
afc51aaa22f26c Darrick J. Wong         2019-07-15  712  	 */
bc6123a84a71b5 Matthew Wilcox (Oracle  2021-05-02  713) 	if (unlikely(copied < len && !folio_test_uptodate(folio)))
afc51aaa22f26c Darrick J. Wong         2019-07-15  714  		return 0;
431c0566bb6078 Matthew Wilcox (Oracle  2021-04-28  715) 	iomap_set_range_uptodate(folio, iop, offset_in_folio(folio, pos), len);
bc6123a84a71b5 Matthew Wilcox (Oracle  2021-05-02  716) 	filemap_dirty_folio(inode->i_mapping, folio);
afc51aaa22f26c Darrick J. Wong         2019-07-15  717  	return copied;
afc51aaa22f26c Darrick J. Wong         2019-07-15  718  }
afc51aaa22f26c Darrick J. Wong         2019-07-15  719  
fad0a1ab34f777 Christoph Hellwig       2021-08-10  720  static size_t iomap_write_end_inline(const struct iomap_iter *iter,
9c4ce08dd21145 Matthew Wilcox (Oracle  2021-05-02  721) 		struct folio *folio, loff_t pos, size_t copied)
afc51aaa22f26c Darrick J. Wong         2019-07-15  722  {
fad0a1ab34f777 Christoph Hellwig       2021-08-10  723  	const struct iomap *iomap = &iter->iomap;
afc51aaa22f26c Darrick J. Wong         2019-07-15  724  	void *addr;
afc51aaa22f26c Darrick J. Wong         2019-07-15  725  
9c4ce08dd21145 Matthew Wilcox (Oracle  2021-05-02  726) 	WARN_ON_ONCE(!folio_test_uptodate(folio));
69f4a26c1e0c7c Gao Xiang               2021-08-03  727  	BUG_ON(!iomap_inline_data_valid(iomap));
afc51aaa22f26c Darrick J. Wong         2019-07-15  728  
9c4ce08dd21145 Matthew Wilcox (Oracle  2021-05-02  729) 	flush_dcache_folio(folio);
9c4ce08dd21145 Matthew Wilcox (Oracle  2021-05-02  730) 	addr = kmap_local_folio(folio, pos);
ab069d5fdcd145 Matthew Wilcox (Oracle  2021-08-04  731) 	memcpy(iomap_inline_data(iomap, pos), addr, copied);
ab069d5fdcd145 Matthew Wilcox (Oracle  2021-08-04  732) 	kunmap_local(addr);
afc51aaa22f26c Darrick J. Wong         2019-07-15  733  
1b5c1e36dc0e0f Christoph Hellwig       2021-08-10  734  	mark_inode_dirty(iter->inode);
afc51aaa22f26c Darrick J. Wong         2019-07-15  735  	return copied;
afc51aaa22f26c Darrick J. Wong         2019-07-15  736  }
afc51aaa22f26c Darrick J. Wong         2019-07-15  737  
e25ba8cbfd16bb Matthew Wilcox (Oracle  2020-09-21  738) /* Returns the number of bytes copied.  May be 0.  Cannot be an errno. */
1b5c1e36dc0e0f Christoph Hellwig       2021-08-10  739  static size_t iomap_write_end(struct iomap_iter *iter, loff_t pos, size_t len,
bc6123a84a71b5 Matthew Wilcox (Oracle  2021-05-02  740) 		size_t copied, struct folio *folio)
afc51aaa22f26c Darrick J. Wong         2019-07-15  741  {
fad0a1ab34f777 Christoph Hellwig       2021-08-10  742  	const struct iomap *srcmap = iomap_iter_srcmap(iter);
1b5c1e36dc0e0f Christoph Hellwig       2021-08-10  743  	loff_t old_size = iter->inode->i_size;
e25ba8cbfd16bb Matthew Wilcox (Oracle  2020-09-21  744) 	size_t ret;
afc51aaa22f26c Darrick J. Wong         2019-07-15  745  
c039b997927263 Goldwyn Rodrigues       2019-10-18  746  	if (srcmap->type == IOMAP_INLINE) {
9c4ce08dd21145 Matthew Wilcox (Oracle  2021-05-02  747) 		ret = iomap_write_end_inline(iter, folio, pos, copied);
c039b997927263 Goldwyn Rodrigues       2019-10-18 @748  	} else if (srcmap->flags & IOMAP_F_BUFFER_HEAD) {
1b5c1e36dc0e0f Christoph Hellwig       2021-08-10  749  		ret = block_write_end(NULL, iter->inode->i_mapping, pos, len,
bc6123a84a71b5 Matthew Wilcox (Oracle  2021-05-02  750) 				copied, &folio->page, NULL);
afc51aaa22f26c Darrick J. Wong         2019-07-15  751  	} else {
bc6123a84a71b5 Matthew Wilcox (Oracle  2021-05-02  752) 		ret = __iomap_write_end(iter->inode, pos, len, copied, folio);
afc51aaa22f26c Darrick J. Wong         2019-07-15  753  	}
afc51aaa22f26c Darrick J. Wong         2019-07-15  754  
afc51aaa22f26c Darrick J. Wong         2019-07-15  755  	/*
afc51aaa22f26c Darrick J. Wong         2019-07-15  756  	 * Update the in-memory inode size after copying the data into the page
afc51aaa22f26c Darrick J. Wong         2019-07-15  757  	 * cache.  It's up to the file system to write the updated size to disk,
afc51aaa22f26c Darrick J. Wong         2019-07-15  758  	 * preferably after I/O completion so that no stale data is exposed.
afc51aaa22f26c Darrick J. Wong         2019-07-15  759  	 */
afc51aaa22f26c Darrick J. Wong         2019-07-15  760  	if (pos + ret > old_size) {
1b5c1e36dc0e0f Christoph Hellwig       2021-08-10  761  		i_size_write(iter->inode, pos + ret);
1b5c1e36dc0e0f Christoph Hellwig       2021-08-10  762  		iter->iomap.flags |= IOMAP_F_SIZE_CHANGED;
afc51aaa22f26c Darrick J. Wong         2019-07-15  763  	}
7a70a5085ed028 Andreas Gruenbacher     2023-01-15  764  	__iomap_put_folio(iter, pos, ret, folio);
afc51aaa22f26c Darrick J. Wong         2019-07-15  765  
afc51aaa22f26c Darrick J. Wong         2019-07-15  766  	if (old_size < pos)
1b5c1e36dc0e0f Christoph Hellwig       2021-08-10  767  		pagecache_isize_extended(iter->inode, old_size, pos);
afc51aaa22f26c Darrick J. Wong         2019-07-15  768  	if (ret < len)
d74999c8c060df Andreas Gruenbacher     2022-05-05  769  		iomap_write_failed(iter->inode, pos + ret, len - ret);
afc51aaa22f26c Darrick J. Wong         2019-07-15  770  	return ret;
afc51aaa22f26c Darrick J. Wong         2019-07-15  771  }
afc51aaa22f26c Darrick J. Wong         2019-07-15  772  

:::::: The code at line 678 was first introduced by commit
:::::: 1b5c1e36dc0e0f15de9717e81508934cbc3daf15 iomap: pass an iomap_iter to various buffered I/O helpers

:::::: TO: Christoph Hellwig <hch@lst.de>
:::::: CC: Darrick J. Wong <djwong@kernel.org>

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-10-17 14:59 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-10-17 14:59 fs/iomap/buffered-io.c:678 iomap_write_begin() warn: bitwise AND condition is false here kernel test robot

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.