* 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
* 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
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.