From: kernel test robot <lkp@intel.com>
To: oe-kbuild@lists.linux.dev
Cc: lkp@intel.com, Dan Carpenter <error27@gmail.com>
Subject: fs/ceph/addr.c:1489 ceph_submit_write() error: 'req' dereferencing possible ERR_PTR()
Date: Sat, 28 Jun 2025 07:44:43 +0800 [thread overview]
Message-ID: <202506280755.m9gtaLUH-lkp@intel.com> (raw)
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
next reply other threads:[~2025-06-27 23:44 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-06-27 23:44 kernel test robot [this message]
-- strict thread matches above, loose matches on Subject: below --
2025-12-30 15:20 fs/ceph/addr.c:1489 ceph_submit_write() error: 'req' dereferencing possible ERR_PTR() kernel test robot
2026-04-14 23:51 kernel test robot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=202506280755.m9gtaLUH-lkp@intel.com \
--to=lkp@intel.com \
--cc=error27@gmail.com \
--cc=oe-kbuild@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.