[<prev] [next>] [day] [month] [year] [list]
Message-ID: <202112101601.2Bb6e4oM-lkp@intel.com>
Date: Fri, 10 Dec 2021 16:52:18 +0800
From: kernel test robot <lkp@...el.com>
To: Jeff Layton <jlayton@...nel.org>
Cc: kbuild-all@...ts.01.org, linux-kernel@...r.kernel.org
Subject: [jlayton:ceph-fscrypt-content 50/51] fs/ceph/file.c:1710:31: error:
too many arguments to function 'ceph_fscrypt_encrypt_pages'
tree: https://git.kernel.org/pub/scm/linux/kernel/git/jlayton/linux.git ceph-fscrypt-content
head: a7bdf8275eeb05b44be3426ce23ac0e99791ab80
commit: 81588e00b89cb14beb905a04b84198f99f5db059 [50/51] ceph: add read/modify/write to ceph_sync_write
config: arm64-buildonly-randconfig-r003-20211210 (https://download.01.org/0day-ci/archive/20211210/202112101601.2Bb6e4oM-lkp@intel.com/config)
compiler: aarch64-linux-gcc (GCC) 11.2.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://git.kernel.org/pub/scm/linux/kernel/git/jlayton/linux.git/commit/?id=81588e00b89cb14beb905a04b84198f99f5db059
git remote add jlayton https://git.kernel.org/pub/scm/linux/kernel/git/jlayton/linux.git
git fetch --no-tags jlayton ceph-fscrypt-content
git checkout 81588e00b89cb14beb905a04b84198f99f5db059
# save the config file to linux build tree
mkdir build_dir
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross O=build_dir ARCH=arm64 SHELL=/bin/bash fs/ceph/
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@...el.com>
All errors (new ones prefixed by >>):
fs/ceph/file.c: In function 'ceph_sync_write':
>> fs/ceph/file.c:1710:31: error: too many arguments to function 'ceph_fscrypt_encrypt_pages'
1710 | ret = ceph_fscrypt_encrypt_pages(inode, pages,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from fs/ceph/super.h:29,
from fs/ceph/file.c:16:
fs/ceph/crypto.h:213:19: note: declared here
213 | static inline int ceph_fscrypt_encrypt_pages(struct inode *inode, struct page **page,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~
At top level:
fs/ceph/file.c:1283:1: warning: 'ceph_direct_read_write' defined but not used [-Wunused-function]
1283 | ceph_direct_read_write(struct kiocb *iocb, struct iov_iter *iter,
| ^~~~~~~~~~~~~~~~~~~~~~
vim +/ceph_fscrypt_encrypt_pages +1710 fs/ceph/file.c
1485
1486 /*
1487 * Synchronous write, straight from __user pointer or user pages.
1488 *
1489 * If write spans object boundary, just do multiple writes. (For a
1490 * correct atomic write, we should e.g. take write locks on all
1491 * objects, rollback on failure, etc.)
1492 */
1493 static ssize_t
1494 ceph_sync_write(struct kiocb *iocb, struct iov_iter *from, loff_t pos,
1495 struct ceph_snap_context *snapc)
1496 {
1497 struct file *file = iocb->ki_filp;
1498 struct inode *inode = file_inode(file);
1499 struct ceph_inode_info *ci = ceph_inode(inode);
1500 struct ceph_fs_client *fsc = ceph_inode_to_client(inode);
1501 struct ceph_osd_client *osdc = &fsc->client->osdc;
1502 struct ceph_osd_request *req;
1503 struct page **pages;
1504 u64 len;
1505 int num_pages;
1506 int written = 0;
1507 int ret;
1508 bool check_caps = false;
1509 struct timespec64 mtime = current_time(inode);
1510 size_t count = iov_iter_count(from);
1511
1512 if (ceph_snap(file_inode(file)) != CEPH_NOSNAP)
1513 return -EROFS;
1514
1515 dout("sync_write on file %p %lld~%u snapc %p seq %lld\n",
1516 file, pos, (unsigned)count, snapc, snapc->seq);
1517
1518 ret = filemap_write_and_wait_range(inode->i_mapping,
1519 pos, pos + count - 1);
1520 if (ret < 0)
1521 return ret;
1522
1523 ret = invalidate_inode_pages2_range(inode->i_mapping,
1524 pos >> PAGE_SHIFT,
1525 (pos + count - 1) >> PAGE_SHIFT);
1526 if (ret < 0)
1527 dout("invalidate_inode_pages2_range returned %d\n", ret);
1528
1529 while ((len = iov_iter_count(from)) > 0) {
1530 size_t left;
1531 int n;
1532 u64 write_pos = pos;
1533 u64 write_len;
1534 u64 objnum, objoff;
1535 u32 objlen;
1536 u64 assert_ver;
1537 bool rmw;
1538 struct iov_iter saved_iter = *from;
1539 size_t off;
1540
1541 /* clamp the length to the end of first object */
1542 ceph_calc_file_object_mapping(&ci->i_layout, pos, len,
1543 &objnum, &objoff, &objlen);
1544 if (objlen < len)
1545 len = objlen;
1546
1547 write_len = len;
1548 fscrypt_adjust_off_and_len(inode, &write_pos, &write_len);
1549
1550 /*
1551 * If we had to adjust the length or position to align with a
1552 * crypto block, then we must do a read/modify/write cycle. We
1553 * use a version assertion to redrive the thing if something
1554 * changes in between.
1555 */
1556 rmw = (pos != write_pos || len != write_len);
1557
1558 /*
1559 * The data is emplaced into the page as it would be if it were in
1560 * an array of pagecache pages.
1561 */
1562 num_pages = calc_pages_for(write_pos, write_len);
1563 pages = ceph_alloc_page_vector(num_pages, GFP_KERNEL);
1564 if (IS_ERR(pages)) {
1565 ret = PTR_ERR(pages);
1566 break;
1567 }
1568
1569 /* Do we need to preload the pages? */
1570 if (rmw) {
1571 u64 first_pos = write_pos;
1572 u64 last_pos = (write_pos + write_len) - CEPH_FSCRYPT_BLOCK_SIZE;
1573 u64 read_len = CEPH_FSCRYPT_BLOCK_SIZE;
1574 bool first = (pos != write_pos);
1575 bool last = (len != write_len && first_pos != last_pos);
1576
1577 /* We should only need to do this for encrypted inodes */
1578 WARN_ON_ONCE(!IS_ENCRYPTED(inode));
1579
1580 /*
1581 * Allocate a read request for one or two extents, depending
1582 * on how the request was aligned.
1583 */
1584 req = ceph_osdc_new_request(osdc, &ci->i_layout,
1585 ci->i_vino, first ? first_pos : last_pos,
1586 &read_len, 0, (first && last) ? 2 : 1,
1587 CEPH_OSD_OP_READ, CEPH_OSD_FLAG_READ,
1588 NULL, ci->i_truncate_seq,
1589 ci->i_truncate_size, false);
1590 if (IS_ERR(req)) {
1591 ceph_release_page_vector(pages, num_pages);
1592 ret = PTR_ERR(req);
1593 break;
1594 }
1595
1596 /* Something is misaligned! */
1597 if (read_len != CEPH_FSCRYPT_BLOCK_SIZE) {
1598 ret = -EIO;
1599 break;
1600 }
1601
1602 /* Add extent for first block? */
1603 if (first)
1604 osd_req_op_extent_osd_data_pages(req, 0, pages,
1605 CEPH_FSCRYPT_BLOCK_SIZE,
1606 offset_in_page(first_pos),
1607 false, false);
1608
1609 /* Add extent for last block */
1610 if (last) {
1611 /* Init the other extent if first extent has been used */
1612 if (first) {
1613 osd_req_op_extent_init(req, 1, CEPH_OSD_OP_READ,
1614 last_pos, read_len,
1615 ci->i_truncate_size,
1616 ci->i_truncate_seq);
1617 }
1618
1619 osd_req_op_extent_osd_data_pages(req, first ? 1 : 0,
1620 &pages[num_pages - 1],
1621 CEPH_FSCRYPT_BLOCK_SIZE,
1622 offset_in_page(last_pos),
1623 false, false);
1624 }
1625
1626 ret = ceph_osdc_start_request(osdc, req, false);
1627 if (!ret)
1628 ret = ceph_osdc_wait_request(osdc, req);
1629
1630 /* FIXME: length field is wrong if there are 2 extents */
1631 ceph_update_read_metrics(&fsc->mdsc->metric,
1632 req->r_start_latency,
1633 req->r_end_latency,
1634 read_len, ret);
1635
1636 /* Ok if object is not already present */
1637 if (ret == -ENOENT) {
1638 /*
1639 * If there is no object, then we can't assert
1640 * on its version. Clear rmw so that we don't try.
1641 */
1642 ceph_osdc_put_request(req);
1643 rmw = false;
1644 ret = 0;
1645
1646 /*
1647 * zero out the soon-to-be uncopied parts of the
1648 * first and last pages.
1649 */
1650 if (first)
1651 zero_user_segment(pages[0], 0,
1652 offset_in_page(first_pos));
1653 if (last)
1654 zero_user_segment(pages[num_pages - 1],
1655 offset_in_page(last_pos),
1656 PAGE_SIZE);
1657 } else {
1658 /* Grab assert version. It must be non-zero. */
1659 assert_ver = req->r_version;
1660 WARN_ON_ONCE(assert_ver == 0);
1661
1662 ceph_osdc_put_request(req);
1663 if (ret < 0) {
1664 ceph_release_page_vector(pages, num_pages);
1665 break;
1666 }
1667
1668 if (first) {
1669 ret = ceph_fscrypt_decrypt_block_inplace(inode,
1670 pages[0],
1671 CEPH_FSCRYPT_BLOCK_SIZE,
1672 offset_in_page(first_pos),
1673 first_pos >> CEPH_FSCRYPT_BLOCK_SHIFT);
1674 if (ret)
1675 break;
1676 }
1677 if (last) {
1678 ret = ceph_fscrypt_decrypt_block_inplace(inode,
1679 pages[num_pages - 1],
1680 CEPH_FSCRYPT_BLOCK_SIZE,
1681 offset_in_page(last_pos),
1682 last_pos >> CEPH_FSCRYPT_BLOCK_SHIFT);
1683 if (ret)
1684 break;
1685 }
1686 }
1687 }
1688
1689 left = len;
1690 off = offset_in_page(pos);
1691 for (n = 0; n < num_pages; n++) {
1692 size_t plen = min_t(size_t, left, PAGE_SIZE - off);
1693
1694 /* copy the data */
1695 ret = copy_page_from_iter(pages[n], off, plen, from);
1696 if (ret != plen) {
1697 ret = -EFAULT;
1698 break;
1699 }
1700 off = 0;
1701 left -= ret;
1702 }
1703 if (ret < 0) {
1704 dout("sync_write write failed with %d\n", ret);
1705 ceph_release_page_vector(pages, num_pages);
1706 break;
1707 }
1708
1709 if (IS_ENCRYPTED(inode)) {
> 1710 ret = ceph_fscrypt_encrypt_pages(inode, pages,
1711 offset_in_page(write_pos),
1712 write_len, GFP_KERNEL);
1713 if (ret < 0) {
1714 dout("encryption failed with %d\n", ret);
1715 break;
1716 }
1717 }
1718
1719 req = ceph_osdc_new_request(osdc, &ci->i_layout,
1720 ci->i_vino, write_pos, &write_len,
1721 rmw ? 1 : 0, rmw ? 2 : 1,
1722 CEPH_OSD_OP_WRITE,
1723 CEPH_OSD_FLAG_WRITE,
1724 snapc, ci->i_truncate_seq,
1725 ci->i_truncate_size, false);
1726 if (IS_ERR(req)) {
1727 ret = PTR_ERR(req);
1728 ceph_release_page_vector(pages, num_pages);
1729 break;
1730 }
1731
1732 osd_req_op_extent_osd_data_pages(req, rmw ? 1 : 0, pages, write_len,
1733 write_pos & ~CEPH_FSCRYPT_BLOCK_MASK,
1734 false, true);
1735 req->r_inode = inode;
1736 req->r_mtime = mtime;
1737
1738 /* Set up the assertion */
1739 if (rmw) {
1740 /* Set up the assertion */
1741 osd_req_op_init(req, 0, CEPH_OSD_OP_ASSERT_VER, 0);
1742 req->r_ops[0].assert_ver.ver = assert_ver;
1743 }
1744
1745 ret = ceph_osdc_start_request(osdc, req, false);
1746 if (!ret)
1747 ret = ceph_osdc_wait_request(osdc, req);
1748
1749 ceph_update_write_metrics(&fsc->mdsc->metric, req->r_start_latency,
1750 req->r_end_latency, len, ret);
1751 ceph_osdc_put_request(req);
1752 if (ret != 0) {
1753 dout("sync_write osd write returned %d\n", ret);
1754 /* Version changed! Must re-do the rmw cycle */
1755 if (ret == -ERANGE || ret == -EOVERFLOW) {
1756 /* We should only ever see this on a rmw */
1757 WARN_ON_ONCE(!rmw);
1758
1759 /* The version should never go backward */
1760 WARN_ON_ONCE(ret == -EOVERFLOW);
1761
1762 *from = saved_iter;
1763
1764 /* FIXME: limit number of times we loop? */
1765 continue;
1766 }
1767 ceph_set_error_write(ci);
1768 break;
1769 }
1770 ceph_clear_error_write(ci);
1771 pos += len;
1772 written += len;
1773 if (pos > i_size_read(inode)) {
1774 check_caps = ceph_inode_set_size(inode, pos);
1775 if (check_caps)
1776 ceph_check_caps(ceph_inode(inode),
1777 CHECK_CAPS_AUTHONLY,
1778 NULL);
1779 }
1780
1781 }
1782
1783 if (ret != -EOLDSNAPC && written > 0) {
1784 ret = written;
1785 iocb->ki_pos = pos;
1786 }
1787 dout("sync_write returning %d\n", ret);
1788 return ret;
1789 }
1790
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
Powered by blists - more mailing lists