All of lore.kernel.org
 help / color / mirror / Atom feed
* fs/ceph/addr.c:1489 ceph_submit_write() error: 'req' dereferencing possible ERR_PTR()
@ 2025-12-30 15:20 kernel test robot
  0 siblings, 0 replies; 3+ messages in thread
From: kernel test robot @ 2025-12-30 15:20 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: Viacheslav Dubeyko <Slava.Dubeyko@ibm.com>
CC: Christian Brauner <brauner@kernel.org>

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head:   8640b74557fc8b4c300030f6ccb8cd078f665ec8
commit: 1551ec61dc551dab1bb40c516a5a096607aff774 ceph: introduce ceph_submit_write() method
date:   10 months ago
:::::: branch date: 19 hours ago
:::::: commit date: 10 months ago
config: powerpc64-randconfig-r071-20251230 (https://download.01.org/0day-ci/archive/20251230/202512302340.uVRcsfnj-lkp@intel.com/config)
compiler: powerpc64-linux-gcc (GCC) 11.5.0

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/202512302340.uVRcsfnj-lkp@intel.com/

New smatch warnings:
fs/ceph/addr.c:1489 ceph_submit_write() error: 'req' dereferencing possible ERR_PTR()

Old smatch warnings:
fs/ceph/addr.c:437 ceph_netfs_issue_read() error: uninitialized symbol 'err'.
fs/ceph/addr.c:956 writepages_finish() error: 'page' dereferencing possible ERR_PTR()

vim +/req +1489 fs/ceph/addr.c

1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1417  
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1418  static
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1419  int ceph_submit_write(struct address_space *mapping,
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1420  			struct writeback_control *wbc,
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1421  			struct ceph_writeback_ctl *ceph_wbc)
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1422  {
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1423  	struct inode *inode = mapping->host;
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1424  	struct ceph_inode_info *ci = ceph_inode(inode);
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1425  	struct ceph_fs_client *fsc = ceph_inode_to_fs_client(inode);
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1426  	struct ceph_client *cl = fsc->client;
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1427  	struct ceph_vino vino = ceph_vino(inode);
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1428  	struct ceph_osd_request *req = NULL;
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1429  	struct page *page = NULL;
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1430  	bool caching = ceph_is_cache_enabled(inode);
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1431  	u64 offset;
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1432  	u64 len;
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1433  	unsigned i;
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1434  
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1435  new_request:
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1436  	offset = ceph_fscrypt_page_offset(ceph_wbc->pages[0]);
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1437  	len = ceph_wbc->wsize;
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1438  
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1439  	req = ceph_osdc_new_request(&fsc->client->osdc,
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1440  				    &ci->i_layout, vino,
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1441  				    offset, &len, 0, ceph_wbc->num_ops,
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1442  				    CEPH_OSD_OP_WRITE, CEPH_OSD_FLAG_WRITE,
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1443  				    ceph_wbc->snapc, ceph_wbc->truncate_seq,
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1444  				    ceph_wbc->truncate_size, false);
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1445  	if (IS_ERR(req)) {
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1446  		req = ceph_osdc_new_request(&fsc->client->osdc,
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1447  					    &ci->i_layout, vino,
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1448  					    offset, &len, 0,
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1449  					    min(ceph_wbc->num_ops,
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1450  						CEPH_OSD_SLAB_OPS),
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1451  					    CEPH_OSD_OP_WRITE,
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1452  					    CEPH_OSD_FLAG_WRITE,
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1453  					    ceph_wbc->snapc,
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1454  					    ceph_wbc->truncate_seq,
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1455  					    ceph_wbc->truncate_size,
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1456  					    true);
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1457  		BUG_ON(IS_ERR(req));
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1458  	}
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1459  
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1460  	page = ceph_wbc->pages[ceph_wbc->locked_pages - 1];
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1461  	BUG_ON(len < ceph_fscrypt_page_offset(page) + thp_size(page) - offset);
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1462  
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1463  	if (!ceph_inc_osd_stopping_blocker(fsc->mdsc)) {
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1464  		for (i = 0; i < folio_batch_count(&ceph_wbc->fbatch); i++) {
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1465  			struct folio *folio = ceph_wbc->fbatch.folios[i];
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1466  
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1467  			if (!folio)
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1468  				continue;
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1469  
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1470  			page = &folio->page;
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1471  			redirty_page_for_writepage(wbc, page);
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1472  			unlock_page(page);
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1473  		}
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1474  
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1475  		for (i = 0; i < ceph_wbc->locked_pages; i++) {
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1476  			page = ceph_fscrypt_pagecache_page(ceph_wbc->pages[i]);
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1477  
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1478  			if (!page)
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1479  				continue;
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1480  
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1481  			redirty_page_for_writepage(wbc, page);
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1482  			unlock_page(page);
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1483  		}
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1484  
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1485  		ceph_osdc_put_request(req);
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1486  		return -EIO;
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1487  	}
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1488  
1551ec61dc551d Viacheslav Dubeyko 2025-02-04 @1489  	req->r_callback = writepages_finish;
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1490  	req->r_inode = inode;
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1491  
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1492  	/* Format the osd request message and submit the write */
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1493  	len = 0;
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1494  	ceph_wbc->data_pages = ceph_wbc->pages;
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1495  	ceph_wbc->op_idx = 0;
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1496  	for (i = 0; i < ceph_wbc->locked_pages; i++) {
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1497  		u64 cur_offset;
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1498  
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1499  		page = ceph_fscrypt_pagecache_page(ceph_wbc->pages[i]);
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1500  		cur_offset = page_offset(page);
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1501  
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1502  		/*
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1503  		 * Discontinuity in page range? Ceph can handle that by just passing
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1504  		 * multiple extents in the write op.
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1505  		 */
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1506  		if (offset + len != cur_offset) {
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1507  			/* If it's full, stop here */
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1508  			if (ceph_wbc->op_idx + 1 == req->r_num_ops)
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1509  				break;
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1510  
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1511  			/* Kick off an fscache write with what we have so far. */
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1512  			ceph_fscache_write_to_cache(inode, offset, len, caching);
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1513  
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1514  			/* Start a new extent */
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1515  			osd_req_op_extent_dup_last(req, ceph_wbc->op_idx,
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1516  						   cur_offset - offset);
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1517  
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1518  			doutc(cl, "got pages at %llu~%llu\n", offset, len);
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1519  
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1520  			osd_req_op_extent_osd_data_pages(req, ceph_wbc->op_idx,
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1521  							 ceph_wbc->data_pages,
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1522  							 len, 0,
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1523  							 ceph_wbc->from_pool,
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1524  							 false);
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1525  			osd_req_op_extent_update(req, ceph_wbc->op_idx, len);
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1526  
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1527  			len = 0;
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1528  			offset = cur_offset;
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1529  			ceph_wbc->data_pages = ceph_wbc->pages + i;
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1530  			ceph_wbc->op_idx++;
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1531  		}
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1532  
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1533  		set_page_writeback(page);
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1534  
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1535  		if (caching)
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1536  			ceph_set_page_fscache(page);
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1537  
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1538  		len += thp_size(page);
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1539  	}
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1540  
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1541  	ceph_fscache_write_to_cache(inode, offset, len, caching);
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1542  
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1543  	if (ceph_wbc->size_stable) {
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1544  		len = min(len, ceph_wbc->i_size - offset);
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1545  	} else if (i == ceph_wbc->locked_pages) {
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1546  		/* writepages_finish() clears writeback pages
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1547  		 * according to the data length, so make sure
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1548  		 * data length covers all locked pages */
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1549  		u64 min_len = len + 1 - thp_size(page);
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1550  		len = get_writepages_data_length(inode,
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1551  						 ceph_wbc->pages[i - 1],
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1552  						 offset);
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1553  		len = max(len, min_len);
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1554  	}
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1555  
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1556  	if (IS_ENCRYPTED(inode))
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1557  		len = round_up(len, CEPH_FSCRYPT_BLOCK_SIZE);
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1558  
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1559  	doutc(cl, "got pages at %llu~%llu\n", offset, len);
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1560  
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1561  	if (IS_ENCRYPTED(inode) &&
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1562  	    ((offset | len) & ~CEPH_FSCRYPT_BLOCK_MASK)) {
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1563  		pr_warn_client(cl,
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1564  			"bad encrypted write offset=%lld len=%llu\n",
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1565  			offset, len);
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1566  	}
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1567  
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1568  	osd_req_op_extent_osd_data_pages(req, ceph_wbc->op_idx,
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1569  					 ceph_wbc->data_pages, len,
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1570  					 0, ceph_wbc->from_pool, false);
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1571  	osd_req_op_extent_update(req, ceph_wbc->op_idx, len);
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1572  
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1573  	BUG_ON(ceph_wbc->op_idx + 1 != req->r_num_ops);
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1574  
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1575  	ceph_wbc->from_pool = false;
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1576  	if (i < ceph_wbc->locked_pages) {
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1577  		BUG_ON(ceph_wbc->num_ops <= req->r_num_ops);
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1578  		ceph_wbc->num_ops -= req->r_num_ops;
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1579  		ceph_wbc->locked_pages -= i;
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1580  
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1581  		/* allocate new pages array for next request */
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1582  		ceph_wbc->data_pages = ceph_wbc->pages;
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1583  		__ceph_allocate_page_array(ceph_wbc, ceph_wbc->locked_pages);
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1584  		memcpy(ceph_wbc->pages, ceph_wbc->data_pages + i,
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1585  			ceph_wbc->locked_pages * sizeof(*ceph_wbc->pages));
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1586  		memset(ceph_wbc->data_pages + i, 0,
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1587  			ceph_wbc->locked_pages * sizeof(*ceph_wbc->pages));
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1588  	} else {
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1589  		BUG_ON(ceph_wbc->num_ops != req->r_num_ops);
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1590  		/* request message now owns the pages array */
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1591  		ceph_wbc->pages = NULL;
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1592  	}
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1593  
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1594  	req->r_mtime = inode_get_mtime(inode);
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1595  	ceph_osdc_start_request(&fsc->client->osdc, req);
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1596  	req = NULL;
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1597  
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1598  	wbc->nr_to_write -= i;
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1599  	if (ceph_wbc->pages)
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1600  		goto new_request;
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1601  
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1602  	return 0;
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1603  }
1551ec61dc551d Viacheslav Dubeyko 2025-02-04  1604  

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

^ permalink raw reply	[flat|nested] 3+ messages in thread
* fs/ceph/addr.c:1489 ceph_submit_write() error: 'req' dereferencing possible ERR_PTR()
@ 2026-04-14 23:51 kernel test robot
  0 siblings, 0 replies; 3+ messages in thread
From: kernel test robot @ 2026-04-14 23:51 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: Viacheslav Dubeyko <Slava.Dubeyko@ibm.com>
CC: Christian Brauner <brauner@kernel.org>

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head:   508fed6795411f5ab277fd1edc0d7adca4946f23
commit: 1551ec61dc551dab1bb40c516a5a096607aff774 ceph: introduce ceph_submit_write() method
date:   1 year, 2 months ago
:::::: branch date: 72 minutes ago
:::::: commit date: 1 year, 2 months ago
config: powerpc64-randconfig-r073-20260415 (https://download.01.org/0day-ci/archive/20260415/202604150703.7Xdq4XpE-lkp@intel.com/config)
compiler: powerpc64-linux-gcc (GCC) 8.5.0
smatch: v0.5.0-9007-gcf3ea02b

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
| Fixes: 1551ec61dc55 ("ceph: introduce ceph_submit_write() method")
| Reported-by: kernel test robot <lkp@intel.com>
| Reported-by: Dan Carpenter <error27@gmail.com>
| Closes: https://lore.kernel.org/r/202604150703.7Xdq4XpE-lkp@intel.com/

smatch warnings:
fs/ceph/addr.c:1489 ceph_submit_write() error: 'req' dereferencing possible ERR_PTR()

vim +/req +1489 fs/ceph/addr.c

1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1417  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1418  static
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1419  int ceph_submit_write(struct address_space *mapping,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1420  			struct writeback_control *wbc,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1421  			struct ceph_writeback_ctl *ceph_wbc)
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1422  {
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1423  	struct inode *inode = mapping->host;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1424  	struct ceph_inode_info *ci = ceph_inode(inode);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1425  	struct ceph_fs_client *fsc = ceph_inode_to_fs_client(inode);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1426  	struct ceph_client *cl = fsc->client;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1427  	struct ceph_vino vino = ceph_vino(inode);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1428  	struct ceph_osd_request *req = NULL;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1429  	struct page *page = NULL;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1430  	bool caching = ceph_is_cache_enabled(inode);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1431  	u64 offset;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1432  	u64 len;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1433  	unsigned i;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1434  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1435  new_request:
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1436  	offset = ceph_fscrypt_page_offset(ceph_wbc->pages[0]);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1437  	len = ceph_wbc->wsize;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1438  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1439  	req = ceph_osdc_new_request(&fsc->client->osdc,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1440  				    &ci->i_layout, vino,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1441  				    offset, &len, 0, ceph_wbc->num_ops,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1442  				    CEPH_OSD_OP_WRITE, CEPH_OSD_FLAG_WRITE,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1443  				    ceph_wbc->snapc, ceph_wbc->truncate_seq,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1444  				    ceph_wbc->truncate_size, false);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1445  	if (IS_ERR(req)) {
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1446  		req = ceph_osdc_new_request(&fsc->client->osdc,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1447  					    &ci->i_layout, vino,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1448  					    offset, &len, 0,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1449  					    min(ceph_wbc->num_ops,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1450  						CEPH_OSD_SLAB_OPS),
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1451  					    CEPH_OSD_OP_WRITE,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1452  					    CEPH_OSD_FLAG_WRITE,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1453  					    ceph_wbc->snapc,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1454  					    ceph_wbc->truncate_seq,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1455  					    ceph_wbc->truncate_size,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1456  					    true);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1457  		BUG_ON(IS_ERR(req));
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1458  	}
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1459  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1460  	page = ceph_wbc->pages[ceph_wbc->locked_pages - 1];
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1461  	BUG_ON(len < ceph_fscrypt_page_offset(page) + thp_size(page) - offset);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1462  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1463  	if (!ceph_inc_osd_stopping_blocker(fsc->mdsc)) {
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1464  		for (i = 0; i < folio_batch_count(&ceph_wbc->fbatch); i++) {
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1465  			struct folio *folio = ceph_wbc->fbatch.folios[i];
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1466  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1467  			if (!folio)
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1468  				continue;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1469  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1470  			page = &folio->page;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1471  			redirty_page_for_writepage(wbc, page);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1472  			unlock_page(page);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1473  		}
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1474  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1475  		for (i = 0; i < ceph_wbc->locked_pages; i++) {
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1476  			page = ceph_fscrypt_pagecache_page(ceph_wbc->pages[i]);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1477  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1478  			if (!page)
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1479  				continue;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1480  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1481  			redirty_page_for_writepage(wbc, page);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1482  			unlock_page(page);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1483  		}
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1484  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1485  		ceph_osdc_put_request(req);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1486  		return -EIO;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1487  	}
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1488  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04 @1489  	req->r_callback = writepages_finish;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1490  	req->r_inode = inode;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1491  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1492  	/* Format the osd request message and submit the write */
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1493  	len = 0;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1494  	ceph_wbc->data_pages = ceph_wbc->pages;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1495  	ceph_wbc->op_idx = 0;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1496  	for (i = 0; i < ceph_wbc->locked_pages; i++) {
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1497  		u64 cur_offset;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1498  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1499  		page = ceph_fscrypt_pagecache_page(ceph_wbc->pages[i]);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1500  		cur_offset = page_offset(page);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1501  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1502  		/*
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1503  		 * Discontinuity in page range? Ceph can handle that by just passing
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1504  		 * multiple extents in the write op.
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1505  		 */
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1506  		if (offset + len != cur_offset) {
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1507  			/* If it's full, stop here */
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1508  			if (ceph_wbc->op_idx + 1 == req->r_num_ops)
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1509  				break;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1510  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1511  			/* Kick off an fscache write with what we have so far. */
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1512  			ceph_fscache_write_to_cache(inode, offset, len, caching);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1513  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1514  			/* Start a new extent */
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1515  			osd_req_op_extent_dup_last(req, ceph_wbc->op_idx,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1516  						   cur_offset - offset);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1517  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1518  			doutc(cl, "got pages at %llu~%llu\n", offset, len);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1519  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1520  			osd_req_op_extent_osd_data_pages(req, ceph_wbc->op_idx,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1521  							 ceph_wbc->data_pages,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1522  							 len, 0,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1523  							 ceph_wbc->from_pool,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1524  							 false);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1525  			osd_req_op_extent_update(req, ceph_wbc->op_idx, len);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1526  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1527  			len = 0;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1528  			offset = cur_offset;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1529  			ceph_wbc->data_pages = ceph_wbc->pages + i;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1530  			ceph_wbc->op_idx++;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1531  		}
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1532  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1533  		set_page_writeback(page);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1534  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1535  		if (caching)
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1536  			ceph_set_page_fscache(page);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1537  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1538  		len += thp_size(page);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1539  	}
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1540  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1541  	ceph_fscache_write_to_cache(inode, offset, len, caching);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1542  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1543  	if (ceph_wbc->size_stable) {
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1544  		len = min(len, ceph_wbc->i_size - offset);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1545  	} else if (i == ceph_wbc->locked_pages) {
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1546  		/* writepages_finish() clears writeback pages
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1547  		 * according to the data length, so make sure
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1548  		 * data length covers all locked pages */
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1549  		u64 min_len = len + 1 - thp_size(page);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1550  		len = get_writepages_data_length(inode,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1551  						 ceph_wbc->pages[i - 1],
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1552  						 offset);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1553  		len = max(len, min_len);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1554  	}
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1555  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1556  	if (IS_ENCRYPTED(inode))
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1557  		len = round_up(len, CEPH_FSCRYPT_BLOCK_SIZE);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1558  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1559  	doutc(cl, "got pages at %llu~%llu\n", offset, len);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1560  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1561  	if (IS_ENCRYPTED(inode) &&
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1562  	    ((offset | len) & ~CEPH_FSCRYPT_BLOCK_MASK)) {
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1563  		pr_warn_client(cl,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1564  			"bad encrypted write offset=%lld len=%llu\n",
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1565  			offset, len);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1566  	}
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1567  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1568  	osd_req_op_extent_osd_data_pages(req, ceph_wbc->op_idx,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1569  					 ceph_wbc->data_pages, len,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1570  					 0, ceph_wbc->from_pool, false);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1571  	osd_req_op_extent_update(req, ceph_wbc->op_idx, len);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1572  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1573  	BUG_ON(ceph_wbc->op_idx + 1 != req->r_num_ops);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1574  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1575  	ceph_wbc->from_pool = false;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1576  	if (i < ceph_wbc->locked_pages) {
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1577  		BUG_ON(ceph_wbc->num_ops <= req->r_num_ops);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1578  		ceph_wbc->num_ops -= req->r_num_ops;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1579  		ceph_wbc->locked_pages -= i;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1580  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1581  		/* allocate new pages array for next request */
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1582  		ceph_wbc->data_pages = ceph_wbc->pages;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1583  		__ceph_allocate_page_array(ceph_wbc, ceph_wbc->locked_pages);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1584  		memcpy(ceph_wbc->pages, ceph_wbc->data_pages + i,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1585  			ceph_wbc->locked_pages * sizeof(*ceph_wbc->pages));
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1586  		memset(ceph_wbc->data_pages + i, 0,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1587  			ceph_wbc->locked_pages * sizeof(*ceph_wbc->pages));
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1588  	} else {
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1589  		BUG_ON(ceph_wbc->num_ops != req->r_num_ops);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1590  		/* request message now owns the pages array */
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1591  		ceph_wbc->pages = NULL;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1592  	}
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1593  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1594  	req->r_mtime = inode_get_mtime(inode);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1595  	ceph_osdc_start_request(&fsc->client->osdc, req);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1596  	req = NULL;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1597  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1598  	wbc->nr_to_write -= i;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1599  	if (ceph_wbc->pages)
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1600  		goto new_request;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1601  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1602  	return 0;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1603  }
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1604  

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

^ permalink raw reply	[flat|nested] 3+ messages in thread
* fs/ceph/addr.c:1489 ceph_submit_write() error: 'req' dereferencing possible ERR_PTR()
@ 2025-06-27 23:44 kernel test robot
  0 siblings, 0 replies; 3+ messages in thread
From: kernel test robot @ 2025-06-27 23:44 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: Viacheslav Dubeyko <Slava.Dubeyko@ibm.com>
CC: Christian Brauner <brauner@kernel.org>

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head:   35e261cd95ddc741d8664f5ac897bbd0d384bbd0
commit: 1551ec61dc551dab1bb40c516a5a096607aff774 ceph: introduce ceph_submit_write() method
date:   4 months ago
:::::: branch date: 4 hours ago
:::::: commit date: 4 months ago
config: powerpc64-randconfig-r072-20250627 (https://download.01.org/0day-ci/archive/20250628/202506280755.m9gtaLUH-lkp@intel.com/config)
compiler: clang version 21.0.0git (https://github.com/llvm/llvm-project e04c938cc08a90ae60440ce22d072ebc69d67ee8)

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/202506280755.m9gtaLUH-lkp@intel.com/

New smatch warnings:
fs/ceph/addr.c:1489 ceph_submit_write() error: 'req' dereferencing possible ERR_PTR()

Old smatch warnings:
fs/ceph/addr.c:437 ceph_netfs_issue_read() error: uninitialized symbol 'err'.
fs/ceph/addr.c:956 writepages_finish() error: 'page' dereferencing possible ERR_PTR()

vim +/req +1489 fs/ceph/addr.c

1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1417  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1418  static
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1419  int ceph_submit_write(struct address_space *mapping,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1420  			struct writeback_control *wbc,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1421  			struct ceph_writeback_ctl *ceph_wbc)
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1422  {
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1423  	struct inode *inode = mapping->host;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1424  	struct ceph_inode_info *ci = ceph_inode(inode);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1425  	struct ceph_fs_client *fsc = ceph_inode_to_fs_client(inode);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1426  	struct ceph_client *cl = fsc->client;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1427  	struct ceph_vino vino = ceph_vino(inode);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1428  	struct ceph_osd_request *req = NULL;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1429  	struct page *page = NULL;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1430  	bool caching = ceph_is_cache_enabled(inode);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1431  	u64 offset;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1432  	u64 len;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1433  	unsigned i;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1434  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1435  new_request:
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1436  	offset = ceph_fscrypt_page_offset(ceph_wbc->pages[0]);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1437  	len = ceph_wbc->wsize;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1438  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1439  	req = ceph_osdc_new_request(&fsc->client->osdc,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1440  				    &ci->i_layout, vino,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1441  				    offset, &len, 0, ceph_wbc->num_ops,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1442  				    CEPH_OSD_OP_WRITE, CEPH_OSD_FLAG_WRITE,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1443  				    ceph_wbc->snapc, ceph_wbc->truncate_seq,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1444  				    ceph_wbc->truncate_size, false);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1445  	if (IS_ERR(req)) {
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1446  		req = ceph_osdc_new_request(&fsc->client->osdc,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1447  					    &ci->i_layout, vino,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1448  					    offset, &len, 0,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1449  					    min(ceph_wbc->num_ops,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1450  						CEPH_OSD_SLAB_OPS),
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1451  					    CEPH_OSD_OP_WRITE,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1452  					    CEPH_OSD_FLAG_WRITE,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1453  					    ceph_wbc->snapc,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1454  					    ceph_wbc->truncate_seq,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1455  					    ceph_wbc->truncate_size,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1456  					    true);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1457  		BUG_ON(IS_ERR(req));
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1458  	}
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1459  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1460  	page = ceph_wbc->pages[ceph_wbc->locked_pages - 1];
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1461  	BUG_ON(len < ceph_fscrypt_page_offset(page) + thp_size(page) - offset);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1462  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1463  	if (!ceph_inc_osd_stopping_blocker(fsc->mdsc)) {
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1464  		for (i = 0; i < folio_batch_count(&ceph_wbc->fbatch); i++) {
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1465  			struct folio *folio = ceph_wbc->fbatch.folios[i];
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1466  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1467  			if (!folio)
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1468  				continue;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1469  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1470  			page = &folio->page;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1471  			redirty_page_for_writepage(wbc, page);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1472  			unlock_page(page);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1473  		}
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1474  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1475  		for (i = 0; i < ceph_wbc->locked_pages; i++) {
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1476  			page = ceph_fscrypt_pagecache_page(ceph_wbc->pages[i]);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1477  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1478  			if (!page)
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1479  				continue;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1480  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1481  			redirty_page_for_writepage(wbc, page);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1482  			unlock_page(page);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1483  		}
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1484  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1485  		ceph_osdc_put_request(req);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1486  		return -EIO;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1487  	}
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1488  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04 @1489  	req->r_callback = writepages_finish;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1490  	req->r_inode = inode;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1491  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1492  	/* Format the osd request message and submit the write */
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1493  	len = 0;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1494  	ceph_wbc->data_pages = ceph_wbc->pages;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1495  	ceph_wbc->op_idx = 0;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1496  	for (i = 0; i < ceph_wbc->locked_pages; i++) {
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1497  		u64 cur_offset;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1498  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1499  		page = ceph_fscrypt_pagecache_page(ceph_wbc->pages[i]);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1500  		cur_offset = page_offset(page);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1501  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1502  		/*
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1503  		 * Discontinuity in page range? Ceph can handle that by just passing
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1504  		 * multiple extents in the write op.
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1505  		 */
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1506  		if (offset + len != cur_offset) {
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1507  			/* If it's full, stop here */
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1508  			if (ceph_wbc->op_idx + 1 == req->r_num_ops)
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1509  				break;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1510  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1511  			/* Kick off an fscache write with what we have so far. */
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1512  			ceph_fscache_write_to_cache(inode, offset, len, caching);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1513  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1514  			/* Start a new extent */
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1515  			osd_req_op_extent_dup_last(req, ceph_wbc->op_idx,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1516  						   cur_offset - offset);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1517  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1518  			doutc(cl, "got pages at %llu~%llu\n", offset, len);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1519  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1520  			osd_req_op_extent_osd_data_pages(req, ceph_wbc->op_idx,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1521  							 ceph_wbc->data_pages,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1522  							 len, 0,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1523  							 ceph_wbc->from_pool,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1524  							 false);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1525  			osd_req_op_extent_update(req, ceph_wbc->op_idx, len);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1526  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1527  			len = 0;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1528  			offset = cur_offset;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1529  			ceph_wbc->data_pages = ceph_wbc->pages + i;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1530  			ceph_wbc->op_idx++;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1531  		}
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1532  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1533  		set_page_writeback(page);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1534  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1535  		if (caching)
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1536  			ceph_set_page_fscache(page);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1537  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1538  		len += thp_size(page);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1539  	}
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1540  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1541  	ceph_fscache_write_to_cache(inode, offset, len, caching);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1542  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1543  	if (ceph_wbc->size_stable) {
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1544  		len = min(len, ceph_wbc->i_size - offset);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1545  	} else if (i == ceph_wbc->locked_pages) {
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1546  		/* writepages_finish() clears writeback pages
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1547  		 * according to the data length, so make sure
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1548  		 * data length covers all locked pages */
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1549  		u64 min_len = len + 1 - thp_size(page);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1550  		len = get_writepages_data_length(inode,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1551  						 ceph_wbc->pages[i - 1],
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1552  						 offset);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1553  		len = max(len, min_len);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1554  	}
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1555  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1556  	if (IS_ENCRYPTED(inode))
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1557  		len = round_up(len, CEPH_FSCRYPT_BLOCK_SIZE);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1558  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1559  	doutc(cl, "got pages at %llu~%llu\n", offset, len);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1560  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1561  	if (IS_ENCRYPTED(inode) &&
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1562  	    ((offset | len) & ~CEPH_FSCRYPT_BLOCK_MASK)) {
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1563  		pr_warn_client(cl,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1564  			"bad encrypted write offset=%lld len=%llu\n",
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1565  			offset, len);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1566  	}
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1567  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1568  	osd_req_op_extent_osd_data_pages(req, ceph_wbc->op_idx,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1569  					 ceph_wbc->data_pages, len,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1570  					 0, ceph_wbc->from_pool, false);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1571  	osd_req_op_extent_update(req, ceph_wbc->op_idx, len);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1572  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1573  	BUG_ON(ceph_wbc->op_idx + 1 != req->r_num_ops);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1574  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1575  	ceph_wbc->from_pool = false;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1576  	if (i < ceph_wbc->locked_pages) {
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1577  		BUG_ON(ceph_wbc->num_ops <= req->r_num_ops);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1578  		ceph_wbc->num_ops -= req->r_num_ops;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1579  		ceph_wbc->locked_pages -= i;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1580  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1581  		/* allocate new pages array for next request */
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1582  		ceph_wbc->data_pages = ceph_wbc->pages;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1583  		__ceph_allocate_page_array(ceph_wbc, ceph_wbc->locked_pages);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1584  		memcpy(ceph_wbc->pages, ceph_wbc->data_pages + i,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1585  			ceph_wbc->locked_pages * sizeof(*ceph_wbc->pages));
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1586  		memset(ceph_wbc->data_pages + i, 0,
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1587  			ceph_wbc->locked_pages * sizeof(*ceph_wbc->pages));
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1588  	} else {
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1589  		BUG_ON(ceph_wbc->num_ops != req->r_num_ops);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1590  		/* request message now owns the pages array */
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1591  		ceph_wbc->pages = NULL;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1592  	}
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1593  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1594  	req->r_mtime = inode_get_mtime(inode);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1595  	ceph_osdc_start_request(&fsc->client->osdc, req);
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1596  	req = NULL;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1597  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1598  	wbc->nr_to_write -= i;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1599  	if (ceph_wbc->pages)
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1600  		goto new_request;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1601  
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1602  	return 0;
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1603  }
1551ec61dc551da Viacheslav Dubeyko 2025-02-04  1604  

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

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2026-04-14 23:51 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-12-30 15:20 fs/ceph/addr.c:1489 ceph_submit_write() error: 'req' dereferencing possible ERR_PTR() kernel test robot
  -- strict thread matches above, loose matches on Subject: below --
2026-04-14 23:51 kernel test robot
2025-06-27 23:44 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.