From: Dan Carpenter <dan.carpenter@oracle.com>
To: kbuild@lists.01.org, Jeff Layton <jlayton@kernel.org>
Cc: lkp@intel.com, kbuild-all@lists.01.org,
ceph-devel@vger.kernel.org, Xiubo Li <xiubli@redhat.com>
Subject: [ceph-client:wip-fscrypt 53/64] fs/ceph/file.c:1896 ceph_sync_write() error: uninitialized symbol 'assert_ver'.
Date: Tue, 24 May 2022 21:39:08 +0300 [thread overview]
Message-ID: <202205250038.pULlmpTX-lkp@intel.com> (raw)
tree: https://github.com/ceph/ceph-client.git wip-fscrypt
head: 9ab30a676da19ce5d83364306a03d643dd446aca
commit: 6341655663fe166fd30acca6b4e692d2fafb02e5 [53/64] ceph: add read/modify/write to ceph_sync_write
config: microblaze-randconfig-m031-20220524 (https://download.01.org/0day-ci/archive/20220525/202205250038.pULlmpTX-lkp@intel.com/config)
compiler: microblaze-linux-gcc (GCC) 11.3.0
If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
New smatch warnings:
fs/ceph/file.c:1896 ceph_sync_write() error: uninitialized symbol 'assert_ver'.
Old smatch warnings:
fs/ceph/file.c:146 iter_get_bvecs_alloc() warn: Please consider using kvcalloc instead of kvmalloc_array
vim +/assert_ver +1896 fs/ceph/file.c
06fee30f6a31f10 Yan, Zheng 2014-07-28 1550 static ssize_t
5dda377cf0a6bd4 Yan, Zheng 2015-04-30 1551 ceph_sync_write(struct kiocb *iocb, struct iov_iter *from, loff_t pos,
5dda377cf0a6bd4 Yan, Zheng 2015-04-30 1552 struct ceph_snap_context *snapc)
e8344e668915a74 majianpeng 2013-09-12 1553 {
e8344e668915a74 majianpeng 2013-09-12 1554 struct file *file = iocb->ki_filp;
e8344e668915a74 majianpeng 2013-09-12 1555 struct inode *inode = file_inode(file);
e8344e668915a74 majianpeng 2013-09-12 1556 struct ceph_inode_info *ci = ceph_inode(inode);
e8344e668915a74 majianpeng 2013-09-12 1557 struct ceph_fs_client *fsc = ceph_inode_to_client(inode);
6341655663fe166 Jeff Layton 2021-01-27 1558 struct ceph_osd_client *osdc = &fsc->client->osdc;
e8344e668915a74 majianpeng 2013-09-12 1559 struct ceph_osd_request *req;
e8344e668915a74 majianpeng 2013-09-12 1560 struct page **pages;
e8344e668915a74 majianpeng 2013-09-12 1561 u64 len;
e8344e668915a74 majianpeng 2013-09-12 1562 int num_pages;
e8344e668915a74 majianpeng 2013-09-12 1563 int written = 0;
e8344e668915a74 majianpeng 2013-09-12 1564 int ret;
efb0ca765ac6f49 Yan, Zheng 2017-05-22 1565 bool check_caps = false;
fac02ddf910814c Arnd Bergmann 2018-07-13 1566 struct timespec64 mtime = current_time(inode);
4908b822b300d2d Al Viro 2014-04-03 1567 size_t count = iov_iter_count(from);
e8344e668915a74 majianpeng 2013-09-12 1568
e8344e668915a74 majianpeng 2013-09-12 1569 if (ceph_snap(file_inode(file)) != CEPH_NOSNAP)
e8344e668915a74 majianpeng 2013-09-12 1570 return -EROFS;
e8344e668915a74 majianpeng 2013-09-12 1571
1c0a9c2d9783604 Yan, Zheng 2017-08-16 1572 dout("sync_write on file %p %lld~%u snapc %p seq %lld\n",
1c0a9c2d9783604 Yan, Zheng 2017-08-16 1573 file, pos, (unsigned)count, snapc, snapc->seq);
e8344e668915a74 majianpeng 2013-09-12 1574
e450f4d1a5d633d zhengbin 2019-02-01 1575 ret = filemap_write_and_wait_range(inode->i_mapping,
e450f4d1a5d633d zhengbin 2019-02-01 1576 pos, pos + count - 1);
e8344e668915a74 majianpeng 2013-09-12 1577 if (ret < 0)
e8344e668915a74 majianpeng 2013-09-12 1578 return ret;
e8344e668915a74 majianpeng 2013-09-12 1579
400e1286c0ec3fd Jeff Layton 2021-12-07 1580 ceph_fscache_invalidate(inode, false);
e8344e668915a74 majianpeng 2013-09-12 1581 ret = invalidate_inode_pages2_range(inode->i_mapping,
09cbfeaf1a5a67b Kirill A. Shutemov 2016-04-01 1582 pos >> PAGE_SHIFT,
e450f4d1a5d633d zhengbin 2019-02-01 1583 (pos + count - 1) >> PAGE_SHIFT);
e8344e668915a74 majianpeng 2013-09-12 1584 if (ret < 0)
e8344e668915a74 majianpeng 2013-09-12 1585 dout("invalidate_inode_pages2_range returned %d\n", ret);
e8344e668915a74 majianpeng 2013-09-12 1586
4908b822b300d2d Al Viro 2014-04-03 1587 while ((len = iov_iter_count(from)) > 0) {
e8344e668915a74 majianpeng 2013-09-12 1588 size_t left;
e8344e668915a74 majianpeng 2013-09-12 1589 int n;
6341655663fe166 Jeff Layton 2021-01-27 1590 u64 write_pos = pos;
6341655663fe166 Jeff Layton 2021-01-27 1591 u64 write_len = len;
6341655663fe166 Jeff Layton 2021-01-27 1592 u64 objnum, objoff;
6341655663fe166 Jeff Layton 2021-01-27 1593 u32 xlen;
6341655663fe166 Jeff Layton 2021-01-27 1594 u64 assert_ver;
6341655663fe166 Jeff Layton 2021-01-27 1595 bool rmw;
6341655663fe166 Jeff Layton 2021-01-27 1596 bool first, last;
6341655663fe166 Jeff Layton 2021-01-27 1597 struct iov_iter saved_iter = *from;
6341655663fe166 Jeff Layton 2021-01-27 1598 size_t off;
e8344e668915a74 majianpeng 2013-09-12 1599
6341655663fe166 Jeff Layton 2021-01-27 1600 ceph_fscrypt_adjust_off_and_len(inode, &write_pos, &write_len);
6341655663fe166 Jeff Layton 2021-01-27 1601
6341655663fe166 Jeff Layton 2021-01-27 1602 /* clamp the length to the end of first object */
6341655663fe166 Jeff Layton 2021-01-27 1603 ceph_calc_file_object_mapping(&ci->i_layout, write_pos,
6341655663fe166 Jeff Layton 2021-01-27 1604 write_len, &objnum, &objoff,
6341655663fe166 Jeff Layton 2021-01-27 1605 &xlen);
6341655663fe166 Jeff Layton 2021-01-27 1606 write_len = xlen;
6341655663fe166 Jeff Layton 2021-01-27 1607
6341655663fe166 Jeff Layton 2021-01-27 1608 /* adjust len downward if it goes beyond current object */
6341655663fe166 Jeff Layton 2021-01-27 1609 if (pos + len > write_pos + write_len)
6341655663fe166 Jeff Layton 2021-01-27 1610 len = write_pos + write_len - pos;
6341655663fe166 Jeff Layton 2021-01-27 1611
6341655663fe166 Jeff Layton 2021-01-27 1612 /*
6341655663fe166 Jeff Layton 2021-01-27 1613 * If we had to adjust the length or position to align with a
6341655663fe166 Jeff Layton 2021-01-27 1614 * crypto block, then we must do a read/modify/write cycle. We
6341655663fe166 Jeff Layton 2021-01-27 1615 * use a version assertion to redrive the thing if something
6341655663fe166 Jeff Layton 2021-01-27 1616 * changes in between.
6341655663fe166 Jeff Layton 2021-01-27 1617 */
6341655663fe166 Jeff Layton 2021-01-27 1618 first = pos != write_pos;
6341655663fe166 Jeff Layton 2021-01-27 1619 last = (pos + len) != (write_pos + write_len);
6341655663fe166 Jeff Layton 2021-01-27 1620 rmw = first || last;
6341655663fe166 Jeff Layton 2021-01-27 1621
6341655663fe166 Jeff Layton 2021-01-27 1622 dout("sync_write ino %llx %lld~%llu adjusted %lld~%llu -- %srmw\n",
6341655663fe166 Jeff Layton 2021-01-27 1623 ci->i_vino.ino, pos, len, write_pos, write_len, rmw ? "" : "no ");
6341655663fe166 Jeff Layton 2021-01-27 1624
6341655663fe166 Jeff Layton 2021-01-27 1625 /*
6341655663fe166 Jeff Layton 2021-01-27 1626 * The data is emplaced into the page as it would be if it were in
6341655663fe166 Jeff Layton 2021-01-27 1627 * an array of pagecache pages.
6341655663fe166 Jeff Layton 2021-01-27 1628 */
6341655663fe166 Jeff Layton 2021-01-27 1629 num_pages = calc_pages_for(write_pos, write_len);
6341655663fe166 Jeff Layton 2021-01-27 1630 pages = ceph_alloc_page_vector(num_pages, GFP_KERNEL);
6341655663fe166 Jeff Layton 2021-01-27 1631 if (IS_ERR(pages)) {
6341655663fe166 Jeff Layton 2021-01-27 1632 ret = PTR_ERR(pages);
6341655663fe166 Jeff Layton 2021-01-27 1633 break;
6341655663fe166 Jeff Layton 2021-01-27 1634 }
6341655663fe166 Jeff Layton 2021-01-27 1635
6341655663fe166 Jeff Layton 2021-01-27 1636 /* Do we need to preload the pages? */
6341655663fe166 Jeff Layton 2021-01-27 1637 if (rmw) {
"assert_ver" is only initialized when "rmw" is true.
6341655663fe166 Jeff Layton 2021-01-27 1638 u64 first_pos = write_pos;
6341655663fe166 Jeff Layton 2021-01-27 1639 u64 last_pos = (write_pos + write_len) - CEPH_FSCRYPT_BLOCK_SIZE;
6341655663fe166 Jeff Layton 2021-01-27 1640 u64 read_len = CEPH_FSCRYPT_BLOCK_SIZE;
6341655663fe166 Jeff Layton 2021-01-27 1641 struct ceph_osd_req_op *op;
6341655663fe166 Jeff Layton 2021-01-27 1642
6341655663fe166 Jeff Layton 2021-01-27 1643 /* We should only need to do this for encrypted inodes */
6341655663fe166 Jeff Layton 2021-01-27 1644 WARN_ON_ONCE(!IS_ENCRYPTED(inode));
6341655663fe166 Jeff Layton 2021-01-27 1645
6341655663fe166 Jeff Layton 2021-01-27 1646 /* No need to do two reads if first and last blocks are same */
6341655663fe166 Jeff Layton 2021-01-27 1647 if (first && last_pos == first_pos)
6341655663fe166 Jeff Layton 2021-01-27 1648 last = false;
6341655663fe166 Jeff Layton 2021-01-27 1649
6341655663fe166 Jeff Layton 2021-01-27 1650 /*
6341655663fe166 Jeff Layton 2021-01-27 1651 * Allocate a read request for one or two extents, depending
6341655663fe166 Jeff Layton 2021-01-27 1652 * on how the request was aligned.
6341655663fe166 Jeff Layton 2021-01-27 1653 */
6341655663fe166 Jeff Layton 2021-01-27 1654 req = ceph_osdc_new_request(osdc, &ci->i_layout,
6341655663fe166 Jeff Layton 2021-01-27 1655 ci->i_vino, first ? first_pos : last_pos,
6341655663fe166 Jeff Layton 2021-01-27 1656 &read_len, 0, (first && last) ? 2 : 1,
6341655663fe166 Jeff Layton 2021-01-27 1657 CEPH_OSD_OP_SPARSE_READ, CEPH_OSD_FLAG_READ,
6341655663fe166 Jeff Layton 2021-01-27 1658 NULL, ci->i_truncate_seq,
6341655663fe166 Jeff Layton 2021-01-27 1659 ci->i_truncate_size, false);
e8344e668915a74 majianpeng 2013-09-12 1660 if (IS_ERR(req)) {
6341655663fe166 Jeff Layton 2021-01-27 1661 ceph_release_page_vector(pages, num_pages);
e8344e668915a74 majianpeng 2013-09-12 1662 ret = PTR_ERR(req);
eab87235c0f5979 Al Viro 2014-04-03 1663 break;
e8344e668915a74 majianpeng 2013-09-12 1664 }
e8344e668915a74 majianpeng 2013-09-12 1665
6341655663fe166 Jeff Layton 2021-01-27 1666 /* Something is misaligned! */
6341655663fe166 Jeff Layton 2021-01-27 1667 if (read_len != CEPH_FSCRYPT_BLOCK_SIZE) {
6341655663fe166 Jeff Layton 2021-01-27 1668 ceph_osdc_put_request(req);
6341655663fe166 Jeff Layton 2021-01-27 1669 ceph_release_page_vector(pages, num_pages);
6341655663fe166 Jeff Layton 2021-01-27 1670 ret = -EIO;
6341655663fe166 Jeff Layton 2021-01-27 1671 break;
6341655663fe166 Jeff Layton 2021-01-27 1672 }
6341655663fe166 Jeff Layton 2021-01-27 1673
6341655663fe166 Jeff Layton 2021-01-27 1674 /* Add extent for first block? */
6341655663fe166 Jeff Layton 2021-01-27 1675 op = &req->r_ops[0];
6341655663fe166 Jeff Layton 2021-01-27 1676
6341655663fe166 Jeff Layton 2021-01-27 1677 if (first) {
6341655663fe166 Jeff Layton 2021-01-27 1678 osd_req_op_extent_osd_data_pages(req, 0, pages,
6341655663fe166 Jeff Layton 2021-01-27 1679 CEPH_FSCRYPT_BLOCK_SIZE,
6341655663fe166 Jeff Layton 2021-01-27 1680 offset_in_page(first_pos),
6341655663fe166 Jeff Layton 2021-01-27 1681 false, false);
6341655663fe166 Jeff Layton 2021-01-27 1682 /* We only expect a single extent here */
6341655663fe166 Jeff Layton 2021-01-27 1683 ret = __ceph_alloc_sparse_ext_map(op, 1);
6341655663fe166 Jeff Layton 2021-01-27 1684 if (ret) {
6341655663fe166 Jeff Layton 2021-01-27 1685 ceph_osdc_put_request(req);
6341655663fe166 Jeff Layton 2021-01-27 1686 ceph_release_page_vector(pages, num_pages);
6341655663fe166 Jeff Layton 2021-01-27 1687 break;
6341655663fe166 Jeff Layton 2021-01-27 1688 }
6341655663fe166 Jeff Layton 2021-01-27 1689 }
6341655663fe166 Jeff Layton 2021-01-27 1690
6341655663fe166 Jeff Layton 2021-01-27 1691 /* Add extent for last block */
6341655663fe166 Jeff Layton 2021-01-27 1692 if (last) {
6341655663fe166 Jeff Layton 2021-01-27 1693 /* Init the other extent if first extent has been used */
6341655663fe166 Jeff Layton 2021-01-27 1694 if (first) {
6341655663fe166 Jeff Layton 2021-01-27 1695 op = &req->r_ops[1];
6341655663fe166 Jeff Layton 2021-01-27 1696 osd_req_op_extent_init(req, 1, CEPH_OSD_OP_SPARSE_READ,
6341655663fe166 Jeff Layton 2021-01-27 1697 last_pos, CEPH_FSCRYPT_BLOCK_SIZE,
6341655663fe166 Jeff Layton 2021-01-27 1698 ci->i_truncate_size,
6341655663fe166 Jeff Layton 2021-01-27 1699 ci->i_truncate_seq);
6341655663fe166 Jeff Layton 2021-01-27 1700 }
6341655663fe166 Jeff Layton 2021-01-27 1701
6341655663fe166 Jeff Layton 2021-01-27 1702 ret = __ceph_alloc_sparse_ext_map(op, 1);
6341655663fe166 Jeff Layton 2021-01-27 1703 if (ret) {
6341655663fe166 Jeff Layton 2021-01-27 1704 ceph_osdc_put_request(req);
6341655663fe166 Jeff Layton 2021-01-27 1705 ceph_release_page_vector(pages, num_pages);
6341655663fe166 Jeff Layton 2021-01-27 1706 break;
6341655663fe166 Jeff Layton 2021-01-27 1707 }
6341655663fe166 Jeff Layton 2021-01-27 1708
6341655663fe166 Jeff Layton 2021-01-27 1709 osd_req_op_extent_osd_data_pages(req, first ? 1 : 0,
6341655663fe166 Jeff Layton 2021-01-27 1710 &pages[num_pages - 1],
6341655663fe166 Jeff Layton 2021-01-27 1711 CEPH_FSCRYPT_BLOCK_SIZE,
6341655663fe166 Jeff Layton 2021-01-27 1712 offset_in_page(last_pos),
6341655663fe166 Jeff Layton 2021-01-27 1713 false, false);
6341655663fe166 Jeff Layton 2021-01-27 1714 }
6341655663fe166 Jeff Layton 2021-01-27 1715
6341655663fe166 Jeff Layton 2021-01-27 1716 ret = ceph_osdc_start_request(osdc, req, false);
6341655663fe166 Jeff Layton 2021-01-27 1717 if (!ret)
6341655663fe166 Jeff Layton 2021-01-27 1718 ret = ceph_osdc_wait_request(osdc, req);
6341655663fe166 Jeff Layton 2021-01-27 1719
6341655663fe166 Jeff Layton 2021-01-27 1720 /* FIXME: length field is wrong if there are 2 extents */
6341655663fe166 Jeff Layton 2021-01-27 1721 ceph_update_read_metrics(&fsc->mdsc->metric,
6341655663fe166 Jeff Layton 2021-01-27 1722 req->r_start_latency,
6341655663fe166 Jeff Layton 2021-01-27 1723 req->r_end_latency,
6341655663fe166 Jeff Layton 2021-01-27 1724 read_len, ret);
6341655663fe166 Jeff Layton 2021-01-27 1725
6341655663fe166 Jeff Layton 2021-01-27 1726 /* Ok if object is not already present */
6341655663fe166 Jeff Layton 2021-01-27 1727 if (ret == -ENOENT) {
6341655663fe166 Jeff Layton 2021-01-27 1728 /*
6341655663fe166 Jeff Layton 2021-01-27 1729 * If there is no object, then we can't assert
6341655663fe166 Jeff Layton 2021-01-27 1730 * on its version. Set it to 0, and we'll use an
6341655663fe166 Jeff Layton 2021-01-27 1731 * exclusive create instead.
6341655663fe166 Jeff Layton 2021-01-27 1732 */
6341655663fe166 Jeff Layton 2021-01-27 1733 ceph_osdc_put_request(req);
6341655663fe166 Jeff Layton 2021-01-27 1734 assert_ver = 0;
6341655663fe166 Jeff Layton 2021-01-27 1735 ret = 0;
6341655663fe166 Jeff Layton 2021-01-27 1736
6341655663fe166 Jeff Layton 2021-01-27 1737 /*
6341655663fe166 Jeff Layton 2021-01-27 1738 * zero out the soon-to-be uncopied parts of the
6341655663fe166 Jeff Layton 2021-01-27 1739 * first and last pages.
6341655663fe166 Jeff Layton 2021-01-27 1740 */
6341655663fe166 Jeff Layton 2021-01-27 1741 if (first)
6341655663fe166 Jeff Layton 2021-01-27 1742 zero_user_segment(pages[0], 0,
6341655663fe166 Jeff Layton 2021-01-27 1743 offset_in_page(first_pos));
6341655663fe166 Jeff Layton 2021-01-27 1744 if (last)
6341655663fe166 Jeff Layton 2021-01-27 1745 zero_user_segment(pages[num_pages - 1],
6341655663fe166 Jeff Layton 2021-01-27 1746 offset_in_page(last_pos),
6341655663fe166 Jeff Layton 2021-01-27 1747 PAGE_SIZE);
6341655663fe166 Jeff Layton 2021-01-27 1748 } else {
6341655663fe166 Jeff Layton 2021-01-27 1749 if (ret < 0) {
6341655663fe166 Jeff Layton 2021-01-27 1750 ceph_osdc_put_request(req);
6341655663fe166 Jeff Layton 2021-01-27 1751 ceph_release_page_vector(pages, num_pages);
6341655663fe166 Jeff Layton 2021-01-27 1752 break;
6341655663fe166 Jeff Layton 2021-01-27 1753 }
6341655663fe166 Jeff Layton 2021-01-27 1754
6341655663fe166 Jeff Layton 2021-01-27 1755 op = &req->r_ops[0];
6341655663fe166 Jeff Layton 2021-01-27 1756 if (op->extent.sparse_ext_cnt == 0) {
6341655663fe166 Jeff Layton 2021-01-27 1757 if (first)
6341655663fe166 Jeff Layton 2021-01-27 1758 zero_user_segment(pages[0], 0,
6341655663fe166 Jeff Layton 2021-01-27 1759 offset_in_page(first_pos));
6341655663fe166 Jeff Layton 2021-01-27 1760 else
6341655663fe166 Jeff Layton 2021-01-27 1761 zero_user_segment(pages[num_pages - 1],
6341655663fe166 Jeff Layton 2021-01-27 1762 offset_in_page(last_pos),
6341655663fe166 Jeff Layton 2021-01-27 1763 PAGE_SIZE);
6341655663fe166 Jeff Layton 2021-01-27 1764 } else if (op->extent.sparse_ext_cnt != 1 ||
6341655663fe166 Jeff Layton 2021-01-27 1765 ceph_sparse_ext_map_end(op) !=
6341655663fe166 Jeff Layton 2021-01-27 1766 CEPH_FSCRYPT_BLOCK_SIZE) {
6341655663fe166 Jeff Layton 2021-01-27 1767 ret = -EIO;
6341655663fe166 Jeff Layton 2021-01-27 1768 ceph_osdc_put_request(req);
6341655663fe166 Jeff Layton 2021-01-27 1769 ceph_release_page_vector(pages, num_pages);
6341655663fe166 Jeff Layton 2021-01-27 1770 break;
6341655663fe166 Jeff Layton 2021-01-27 1771 }
6341655663fe166 Jeff Layton 2021-01-27 1772
6341655663fe166 Jeff Layton 2021-01-27 1773 if (first && last) {
6341655663fe166 Jeff Layton 2021-01-27 1774 op = &req->r_ops[1];
6341655663fe166 Jeff Layton 2021-01-27 1775 if (op->extent.sparse_ext_cnt == 0) {
6341655663fe166 Jeff Layton 2021-01-27 1776 zero_user_segment(pages[num_pages - 1],
6341655663fe166 Jeff Layton 2021-01-27 1777 offset_in_page(last_pos),
6341655663fe166 Jeff Layton 2021-01-27 1778 PAGE_SIZE);
6341655663fe166 Jeff Layton 2021-01-27 1779 } else if (op->extent.sparse_ext_cnt != 1 ||
6341655663fe166 Jeff Layton 2021-01-27 1780 ceph_sparse_ext_map_end(op) !=
6341655663fe166 Jeff Layton 2021-01-27 1781 CEPH_FSCRYPT_BLOCK_SIZE) {
6341655663fe166 Jeff Layton 2021-01-27 1782 ret = -EIO;
6341655663fe166 Jeff Layton 2021-01-27 1783 ceph_osdc_put_request(req);
6341655663fe166 Jeff Layton 2021-01-27 1784 ceph_release_page_vector(pages, num_pages);
6341655663fe166 Jeff Layton 2021-01-27 1785 break;
6341655663fe166 Jeff Layton 2021-01-27 1786 }
6341655663fe166 Jeff Layton 2021-01-27 1787 }
6341655663fe166 Jeff Layton 2021-01-27 1788
6341655663fe166 Jeff Layton 2021-01-27 1789 /* Grab assert version. It must be non-zero. */
6341655663fe166 Jeff Layton 2021-01-27 1790 assert_ver = req->r_version;
6341655663fe166 Jeff Layton 2021-01-27 1791 WARN_ON_ONCE(ret > 0 && assert_ver == 0);
6341655663fe166 Jeff Layton 2021-01-27 1792
6341655663fe166 Jeff Layton 2021-01-27 1793 ceph_osdc_put_request(req);
6341655663fe166 Jeff Layton 2021-01-27 1794 if (first) {
6341655663fe166 Jeff Layton 2021-01-27 1795 ret = ceph_fscrypt_decrypt_block_inplace(inode,
6341655663fe166 Jeff Layton 2021-01-27 1796 pages[0],
6341655663fe166 Jeff Layton 2021-01-27 1797 CEPH_FSCRYPT_BLOCK_SIZE,
6341655663fe166 Jeff Layton 2021-01-27 1798 offset_in_page(first_pos),
6341655663fe166 Jeff Layton 2021-01-27 1799 first_pos >> CEPH_FSCRYPT_BLOCK_SHIFT);
6341655663fe166 Jeff Layton 2021-01-27 1800 if (ret < 0) {
6341655663fe166 Jeff Layton 2021-01-27 1801 ceph_release_page_vector(pages, num_pages);
6341655663fe166 Jeff Layton 2021-01-27 1802 break;
6341655663fe166 Jeff Layton 2021-01-27 1803 }
6341655663fe166 Jeff Layton 2021-01-27 1804 }
6341655663fe166 Jeff Layton 2021-01-27 1805 if (last) {
6341655663fe166 Jeff Layton 2021-01-27 1806 ret = ceph_fscrypt_decrypt_block_inplace(inode,
6341655663fe166 Jeff Layton 2021-01-27 1807 pages[num_pages - 1],
6341655663fe166 Jeff Layton 2021-01-27 1808 CEPH_FSCRYPT_BLOCK_SIZE,
6341655663fe166 Jeff Layton 2021-01-27 1809 offset_in_page(last_pos),
6341655663fe166 Jeff Layton 2021-01-27 1810 last_pos >> CEPH_FSCRYPT_BLOCK_SHIFT);
6341655663fe166 Jeff Layton 2021-01-27 1811 if (ret < 0) {
6341655663fe166 Jeff Layton 2021-01-27 1812 ceph_release_page_vector(pages, num_pages);
6341655663fe166 Jeff Layton 2021-01-27 1813 break;
6341655663fe166 Jeff Layton 2021-01-27 1814 }
6341655663fe166 Jeff Layton 2021-01-27 1815 }
6341655663fe166 Jeff Layton 2021-01-27 1816 }
124e68e74099090 Sage Weil 2009-10-06 1817 }
e8344e668915a74 majianpeng 2013-09-12 1818
e8344e668915a74 majianpeng 2013-09-12 1819 left = len;
54f371cad7e715f Jeff Layton 2021-01-25 1820 off = offset_in_page(pos);
e8344e668915a74 majianpeng 2013-09-12 1821 for (n = 0; n < num_pages; n++) {
54f371cad7e715f Jeff Layton 2021-01-25 1822 size_t plen = min_t(size_t, left, PAGE_SIZE - off);
54f371cad7e715f Jeff Layton 2021-01-25 1823
6341655663fe166 Jeff Layton 2021-01-27 1824 /* copy the data */
54f371cad7e715f Jeff Layton 2021-01-25 1825 ret = copy_page_from_iter(pages[n], off, plen, from);
e8344e668915a74 majianpeng 2013-09-12 1826 if (ret != plen) {
e8344e668915a74 majianpeng 2013-09-12 1827 ret = -EFAULT;
e8344e668915a74 majianpeng 2013-09-12 1828 break;
e8344e668915a74 majianpeng 2013-09-12 1829 }
6341655663fe166 Jeff Layton 2021-01-27 1830 off = 0;
e8344e668915a74 majianpeng 2013-09-12 1831 left -= ret;
e8344e668915a74 majianpeng 2013-09-12 1832 }
6341655663fe166 Jeff Layton 2021-01-27 1833 if (ret < 0) {
6341655663fe166 Jeff Layton 2021-01-27 1834 dout("sync_write write failed with %d\n", ret);
6341655663fe166 Jeff Layton 2021-01-27 1835 ceph_release_page_vector(pages, num_pages);
6341655663fe166 Jeff Layton 2021-01-27 1836 break;
6341655663fe166 Jeff Layton 2021-01-27 1837 }
e8344e668915a74 majianpeng 2013-09-12 1838
6341655663fe166 Jeff Layton 2021-01-27 1839 if (IS_ENCRYPTED(inode)) {
6341655663fe166 Jeff Layton 2021-01-27 1840 ret = ceph_fscrypt_encrypt_pages(inode, pages,
6341655663fe166 Jeff Layton 2021-01-27 1841 write_pos, write_len,
6341655663fe166 Jeff Layton 2021-01-27 1842 GFP_KERNEL);
124e68e74099090 Sage Weil 2009-10-06 1843 if (ret < 0) {
6341655663fe166 Jeff Layton 2021-01-27 1844 dout("encryption failed with %d\n", ret);
124e68e74099090 Sage Weil 2009-10-06 1845 ceph_release_page_vector(pages, num_pages);
6341655663fe166 Jeff Layton 2021-01-27 1846 break;
6341655663fe166 Jeff Layton 2021-01-27 1847 }
124e68e74099090 Sage Weil 2009-10-06 1848 }
124e68e74099090 Sage Weil 2009-10-06 1849
6341655663fe166 Jeff Layton 2021-01-27 1850 req = ceph_osdc_new_request(osdc, &ci->i_layout,
6341655663fe166 Jeff Layton 2021-01-27 1851 ci->i_vino, write_pos, &write_len,
6341655663fe166 Jeff Layton 2021-01-27 1852 rmw ? 1 : 0, rmw ? 2 : 1,
6341655663fe166 Jeff Layton 2021-01-27 1853 CEPH_OSD_OP_WRITE,
6341655663fe166 Jeff Layton 2021-01-27 1854 CEPH_OSD_FLAG_WRITE,
6341655663fe166 Jeff Layton 2021-01-27 1855 snapc, ci->i_truncate_seq,
6341655663fe166 Jeff Layton 2021-01-27 1856 ci->i_truncate_size, false);
6341655663fe166 Jeff Layton 2021-01-27 1857 if (IS_ERR(req)) {
6341655663fe166 Jeff Layton 2021-01-27 1858 ret = PTR_ERR(req);
6341655663fe166 Jeff Layton 2021-01-27 1859 ceph_release_page_vector(pages, num_pages);
6341655663fe166 Jeff Layton 2021-01-27 1860 break;
6341655663fe166 Jeff Layton 2021-01-27 1861 }
6341655663fe166 Jeff Layton 2021-01-27 1862
6341655663fe166 Jeff Layton 2021-01-27 1863 dout("sync_write write op %lld~%llu\n", write_pos, write_len);
6341655663fe166 Jeff Layton 2021-01-27 1864 osd_req_op_extent_osd_data_pages(req, rmw ? 1 : 0, pages, write_len,
6341655663fe166 Jeff Layton 2021-01-27 1865 offset_in_page(write_pos), false,
6341655663fe166 Jeff Layton 2021-01-27 1866 true);
26be88087ae8a04 Alex Elder 2013-04-15 1867 req->r_inode = inode;
6341655663fe166 Jeff Layton 2021-01-27 1868 req->r_mtime = mtime;
e8344e668915a74 majianpeng 2013-09-12 1869
6341655663fe166 Jeff Layton 2021-01-27 1870 /* Set up the assertion */
6341655663fe166 Jeff Layton 2021-01-27 1871 if (rmw) {
6341655663fe166 Jeff Layton 2021-01-27 1872 /*
6341655663fe166 Jeff Layton 2021-01-27 1873 * Set up the assertion. If we don't have a version number,
6341655663fe166 Jeff Layton 2021-01-27 1874 * then the object doesn't exist yet. Use an exclusive create
6341655663fe166 Jeff Layton 2021-01-27 1875 * instead of a version assertion in that case.
6341655663fe166 Jeff Layton 2021-01-27 1876 */
6341655663fe166 Jeff Layton 2021-01-27 1877 if (assert_ver) {
6341655663fe166 Jeff Layton 2021-01-27 1878 osd_req_op_init(req, 0, CEPH_OSD_OP_ASSERT_VER, 0);
6341655663fe166 Jeff Layton 2021-01-27 1879 req->r_ops[0].assert_ver.ver = assert_ver;
6341655663fe166 Jeff Layton 2021-01-27 1880 } else {
6341655663fe166 Jeff Layton 2021-01-27 1881 osd_req_op_init(req, 0, CEPH_OSD_OP_CREATE,
6341655663fe166 Jeff Layton 2021-01-27 1882 CEPH_OSD_OP_FLAG_EXCL);
6341655663fe166 Jeff Layton 2021-01-27 1883 }
6341655663fe166 Jeff Layton 2021-01-27 1884 }
124e68e74099090 Sage Weil 2009-10-06 1885
6341655663fe166 Jeff Layton 2021-01-27 1886 ret = ceph_osdc_start_request(osdc, req, false);
26be88087ae8a04 Alex Elder 2013-04-15 1887 if (!ret)
6341655663fe166 Jeff Layton 2021-01-27 1888 ret = ceph_osdc_wait_request(osdc, req);
124e68e74099090 Sage Weil 2009-10-06 1889
8ae99ae2b40766a Xiubo Li 2021-03-22 1890 ceph_update_write_metrics(&fsc->mdsc->metric, req->r_start_latency,
903f4fec78dd05a Xiubo Li 2021-05-13 1891 req->r_end_latency, len, ret);
124e68e74099090 Sage Weil 2009-10-06 1892 ceph_osdc_put_request(req);
26544c623e741ac Jeff Layton 2017-04-04 1893 if (ret != 0) {
6341655663fe166 Jeff Layton 2021-01-27 1894 dout("sync_write osd write returned %d\n", ret);
6341655663fe166 Jeff Layton 2021-01-27 1895 /* Version changed! Must re-do the rmw cycle */
6341655663fe166 Jeff Layton 2021-01-27 @1896 if ((assert_ver && (ret == -ERANGE || ret == -EOVERFLOW)) ||
How do we know "rmw" is true at this point?
6341655663fe166 Jeff Layton 2021-01-27 1897 (!assert_ver && ret == -EEXIST)) {
6341655663fe166 Jeff Layton 2021-01-27 1898 /* We should only ever see this on a rmw */
6341655663fe166 Jeff Layton 2021-01-27 1899 WARN_ON_ONCE(!rmw);
Although this WARN_ON() suggests that it *is* true...
6341655663fe166 Jeff Layton 2021-01-27 1900
6341655663fe166 Jeff Layton 2021-01-27 1901 /* The version should never go backward */
6341655663fe166 Jeff Layton 2021-01-27 1902 WARN_ON_ONCE(ret == -EOVERFLOW);
6341655663fe166 Jeff Layton 2021-01-27 1903
6341655663fe166 Jeff Layton 2021-01-27 1904 *from = saved_iter;
6341655663fe166 Jeff Layton 2021-01-27 1905
6341655663fe166 Jeff Layton 2021-01-27 1906 /* FIXME: limit number of times we loop? */
6341655663fe166 Jeff Layton 2021-01-27 1907 continue;
6341655663fe166 Jeff Layton 2021-01-27 1908 }
26544c623e741ac Jeff Layton 2017-04-04 1909 ceph_set_error_write(ci);
26544c623e741ac Jeff Layton 2017-04-04 1910 break;
26544c623e741ac Jeff Layton 2017-04-04 1911 }
26544c623e741ac Jeff Layton 2017-04-04 1912 ceph_clear_error_write(ci);
124e68e74099090 Sage Weil 2009-10-06 1913 pos += len;
124e68e74099090 Sage Weil 2009-10-06 1914 written += len;
6341655663fe166 Jeff Layton 2021-01-27 1915 dout("sync_write written %d\n", written);
e8344e668915a74 majianpeng 2013-09-12 1916 if (pos > i_size_read(inode)) {
124e68e74099090 Sage Weil 2009-10-06 1917 check_caps = ceph_inode_set_size(inode, pos);
124e68e74099090 Sage Weil 2009-10-06 1918 if (check_caps)
e8344e668915a74 majianpeng 2013-09-12 1919 ceph_check_caps(ceph_inode(inode),
e8344e668915a74 majianpeng 2013-09-12 1920 CHECK_CAPS_AUTHONLY,
124e68e74099090 Sage Weil 2009-10-06 1921 NULL);
e8344e668915a74 majianpeng 2013-09-12 1922 }
26544c623e741ac Jeff Layton 2017-04-04 1923
e8344e668915a74 majianpeng 2013-09-12 1924 }
e8344e668915a74 majianpeng 2013-09-12 1925
e8344e668915a74 majianpeng 2013-09-12 1926 if (ret != -EOLDSNAPC && written > 0) {
ee7289bfadda5f4 majianpeng 2013-08-21 1927 ret = written;
e8344e668915a74 majianpeng 2013-09-12 1928 iocb->ki_pos = pos;
124e68e74099090 Sage Weil 2009-10-06 1929 }
6341655663fe166 Jeff Layton 2021-01-27 1930 dout("sync_write returning %d\n", ret);
124e68e74099090 Sage Weil 2009-10-06 1931 return ret;
124e68e74099090 Sage Weil 2009-10-06 1932 }
--
0-DAY CI Kernel Test Service
https://01.org/lkp
WARNING: multiple messages have this Message-ID (diff)
From: kernel test robot <lkp@intel.com>
To: kbuild@lists.01.org
Subject: [ceph-client:wip-fscrypt 53/64] fs/ceph/file.c:1896 ceph_sync_write() error: uninitialized symbol 'assert_ver'.
Date: Wed, 25 May 2022 00:24:27 +0800 [thread overview]
Message-ID: <202205250038.pULlmpTX-lkp@intel.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 33118 bytes --]
CC: kbuild-all(a)lists.01.org
BCC: lkp(a)intel.com
CC: ceph-devel(a)vger.kernel.org
TO: Jeff Layton <jlayton@kernel.org>
CC: Xiubo Li <xiubli@redhat.com>
tree: https://github.com/ceph/ceph-client.git wip-fscrypt
head: 9ab30a676da19ce5d83364306a03d643dd446aca
commit: 6341655663fe166fd30acca6b4e692d2fafb02e5 [53/64] ceph: add read/modify/write to ceph_sync_write
:::::: branch date: 29 hours ago
:::::: commit date: 29 hours ago
config: microblaze-randconfig-m031-20220524 (https://download.01.org/0day-ci/archive/20220525/202205250038.pULlmpTX-lkp(a)intel.com/config)
compiler: microblaze-linux-gcc (GCC) 11.3.0
If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
New smatch warnings:
fs/ceph/file.c:1896 ceph_sync_write() error: uninitialized symbol 'assert_ver'.
Old smatch warnings:
fs/ceph/file.c:146 iter_get_bvecs_alloc() warn: Please consider using kvcalloc instead of kvmalloc_array
arch/microblaze/include/asm/thread_info.h:85 current_thread_info() error: uninitialized symbol 'sp'.
vim +/assert_ver +1896 fs/ceph/file.c
e8344e668915a74 majianpeng 2013-09-12 1542
e8344e668915a74 majianpeng 2013-09-12 1543 /*
e8344e668915a74 majianpeng 2013-09-12 1544 * Synchronous write, straight from __user pointer or user pages.
e8344e668915a74 majianpeng 2013-09-12 1545 *
e8344e668915a74 majianpeng 2013-09-12 1546 * If write spans object boundary, just do multiple writes. (For a
e8344e668915a74 majianpeng 2013-09-12 1547 * correct atomic write, we should e.g. take write locks on all
e8344e668915a74 majianpeng 2013-09-12 1548 * objects, rollback on failure, etc.)
e8344e668915a74 majianpeng 2013-09-12 1549 */
06fee30f6a31f10 Yan, Zheng 2014-07-28 1550 static ssize_t
5dda377cf0a6bd4 Yan, Zheng 2015-04-30 1551 ceph_sync_write(struct kiocb *iocb, struct iov_iter *from, loff_t pos,
5dda377cf0a6bd4 Yan, Zheng 2015-04-30 1552 struct ceph_snap_context *snapc)
e8344e668915a74 majianpeng 2013-09-12 1553 {
e8344e668915a74 majianpeng 2013-09-12 1554 struct file *file = iocb->ki_filp;
e8344e668915a74 majianpeng 2013-09-12 1555 struct inode *inode = file_inode(file);
e8344e668915a74 majianpeng 2013-09-12 1556 struct ceph_inode_info *ci = ceph_inode(inode);
e8344e668915a74 majianpeng 2013-09-12 1557 struct ceph_fs_client *fsc = ceph_inode_to_client(inode);
6341655663fe166 Jeff Layton 2021-01-27 1558 struct ceph_osd_client *osdc = &fsc->client->osdc;
e8344e668915a74 majianpeng 2013-09-12 1559 struct ceph_osd_request *req;
e8344e668915a74 majianpeng 2013-09-12 1560 struct page **pages;
e8344e668915a74 majianpeng 2013-09-12 1561 u64 len;
e8344e668915a74 majianpeng 2013-09-12 1562 int num_pages;
e8344e668915a74 majianpeng 2013-09-12 1563 int written = 0;
e8344e668915a74 majianpeng 2013-09-12 1564 int ret;
efb0ca765ac6f49 Yan, Zheng 2017-05-22 1565 bool check_caps = false;
fac02ddf910814c Arnd Bergmann 2018-07-13 1566 struct timespec64 mtime = current_time(inode);
4908b822b300d2d Al Viro 2014-04-03 1567 size_t count = iov_iter_count(from);
e8344e668915a74 majianpeng 2013-09-12 1568
e8344e668915a74 majianpeng 2013-09-12 1569 if (ceph_snap(file_inode(file)) != CEPH_NOSNAP)
e8344e668915a74 majianpeng 2013-09-12 1570 return -EROFS;
e8344e668915a74 majianpeng 2013-09-12 1571
1c0a9c2d9783604 Yan, Zheng 2017-08-16 1572 dout("sync_write on file %p %lld~%u snapc %p seq %lld\n",
1c0a9c2d9783604 Yan, Zheng 2017-08-16 1573 file, pos, (unsigned)count, snapc, snapc->seq);
e8344e668915a74 majianpeng 2013-09-12 1574
e450f4d1a5d633d zhengbin 2019-02-01 1575 ret = filemap_write_and_wait_range(inode->i_mapping,
e450f4d1a5d633d zhengbin 2019-02-01 1576 pos, pos + count - 1);
e8344e668915a74 majianpeng 2013-09-12 1577 if (ret < 0)
e8344e668915a74 majianpeng 2013-09-12 1578 return ret;
e8344e668915a74 majianpeng 2013-09-12 1579
400e1286c0ec3fd Jeff Layton 2021-12-07 1580 ceph_fscache_invalidate(inode, false);
e8344e668915a74 majianpeng 2013-09-12 1581 ret = invalidate_inode_pages2_range(inode->i_mapping,
09cbfeaf1a5a67b Kirill A. Shutemov 2016-04-01 1582 pos >> PAGE_SHIFT,
e450f4d1a5d633d zhengbin 2019-02-01 1583 (pos + count - 1) >> PAGE_SHIFT);
e8344e668915a74 majianpeng 2013-09-12 1584 if (ret < 0)
e8344e668915a74 majianpeng 2013-09-12 1585 dout("invalidate_inode_pages2_range returned %d\n", ret);
e8344e668915a74 majianpeng 2013-09-12 1586
4908b822b300d2d Al Viro 2014-04-03 1587 while ((len = iov_iter_count(from)) > 0) {
e8344e668915a74 majianpeng 2013-09-12 1588 size_t left;
e8344e668915a74 majianpeng 2013-09-12 1589 int n;
6341655663fe166 Jeff Layton 2021-01-27 1590 u64 write_pos = pos;
6341655663fe166 Jeff Layton 2021-01-27 1591 u64 write_len = len;
6341655663fe166 Jeff Layton 2021-01-27 1592 u64 objnum, objoff;
6341655663fe166 Jeff Layton 2021-01-27 1593 u32 xlen;
6341655663fe166 Jeff Layton 2021-01-27 1594 u64 assert_ver;
6341655663fe166 Jeff Layton 2021-01-27 1595 bool rmw;
6341655663fe166 Jeff Layton 2021-01-27 1596 bool first, last;
6341655663fe166 Jeff Layton 2021-01-27 1597 struct iov_iter saved_iter = *from;
6341655663fe166 Jeff Layton 2021-01-27 1598 size_t off;
e8344e668915a74 majianpeng 2013-09-12 1599
6341655663fe166 Jeff Layton 2021-01-27 1600 ceph_fscrypt_adjust_off_and_len(inode, &write_pos, &write_len);
6341655663fe166 Jeff Layton 2021-01-27 1601
6341655663fe166 Jeff Layton 2021-01-27 1602 /* clamp the length to the end of first object */
6341655663fe166 Jeff Layton 2021-01-27 1603 ceph_calc_file_object_mapping(&ci->i_layout, write_pos,
6341655663fe166 Jeff Layton 2021-01-27 1604 write_len, &objnum, &objoff,
6341655663fe166 Jeff Layton 2021-01-27 1605 &xlen);
6341655663fe166 Jeff Layton 2021-01-27 1606 write_len = xlen;
6341655663fe166 Jeff Layton 2021-01-27 1607
6341655663fe166 Jeff Layton 2021-01-27 1608 /* adjust len downward if it goes beyond current object */
6341655663fe166 Jeff Layton 2021-01-27 1609 if (pos + len > write_pos + write_len)
6341655663fe166 Jeff Layton 2021-01-27 1610 len = write_pos + write_len - pos;
6341655663fe166 Jeff Layton 2021-01-27 1611
6341655663fe166 Jeff Layton 2021-01-27 1612 /*
6341655663fe166 Jeff Layton 2021-01-27 1613 * If we had to adjust the length or position to align with a
6341655663fe166 Jeff Layton 2021-01-27 1614 * crypto block, then we must do a read/modify/write cycle. We
6341655663fe166 Jeff Layton 2021-01-27 1615 * use a version assertion to redrive the thing if something
6341655663fe166 Jeff Layton 2021-01-27 1616 * changes in between.
6341655663fe166 Jeff Layton 2021-01-27 1617 */
6341655663fe166 Jeff Layton 2021-01-27 1618 first = pos != write_pos;
6341655663fe166 Jeff Layton 2021-01-27 1619 last = (pos + len) != (write_pos + write_len);
6341655663fe166 Jeff Layton 2021-01-27 1620 rmw = first || last;
6341655663fe166 Jeff Layton 2021-01-27 1621
6341655663fe166 Jeff Layton 2021-01-27 1622 dout("sync_write ino %llx %lld~%llu adjusted %lld~%llu -- %srmw\n",
6341655663fe166 Jeff Layton 2021-01-27 1623 ci->i_vino.ino, pos, len, write_pos, write_len, rmw ? "" : "no ");
6341655663fe166 Jeff Layton 2021-01-27 1624
6341655663fe166 Jeff Layton 2021-01-27 1625 /*
6341655663fe166 Jeff Layton 2021-01-27 1626 * The data is emplaced into the page as it would be if it were in
6341655663fe166 Jeff Layton 2021-01-27 1627 * an array of pagecache pages.
6341655663fe166 Jeff Layton 2021-01-27 1628 */
6341655663fe166 Jeff Layton 2021-01-27 1629 num_pages = calc_pages_for(write_pos, write_len);
6341655663fe166 Jeff Layton 2021-01-27 1630 pages = ceph_alloc_page_vector(num_pages, GFP_KERNEL);
6341655663fe166 Jeff Layton 2021-01-27 1631 if (IS_ERR(pages)) {
6341655663fe166 Jeff Layton 2021-01-27 1632 ret = PTR_ERR(pages);
6341655663fe166 Jeff Layton 2021-01-27 1633 break;
6341655663fe166 Jeff Layton 2021-01-27 1634 }
6341655663fe166 Jeff Layton 2021-01-27 1635
6341655663fe166 Jeff Layton 2021-01-27 1636 /* Do we need to preload the pages? */
6341655663fe166 Jeff Layton 2021-01-27 1637 if (rmw) {
6341655663fe166 Jeff Layton 2021-01-27 1638 u64 first_pos = write_pos;
6341655663fe166 Jeff Layton 2021-01-27 1639 u64 last_pos = (write_pos + write_len) - CEPH_FSCRYPT_BLOCK_SIZE;
6341655663fe166 Jeff Layton 2021-01-27 1640 u64 read_len = CEPH_FSCRYPT_BLOCK_SIZE;
6341655663fe166 Jeff Layton 2021-01-27 1641 struct ceph_osd_req_op *op;
6341655663fe166 Jeff Layton 2021-01-27 1642
6341655663fe166 Jeff Layton 2021-01-27 1643 /* We should only need to do this for encrypted inodes */
6341655663fe166 Jeff Layton 2021-01-27 1644 WARN_ON_ONCE(!IS_ENCRYPTED(inode));
6341655663fe166 Jeff Layton 2021-01-27 1645
6341655663fe166 Jeff Layton 2021-01-27 1646 /* No need to do two reads if first and last blocks are same */
6341655663fe166 Jeff Layton 2021-01-27 1647 if (first && last_pos == first_pos)
6341655663fe166 Jeff Layton 2021-01-27 1648 last = false;
6341655663fe166 Jeff Layton 2021-01-27 1649
6341655663fe166 Jeff Layton 2021-01-27 1650 /*
6341655663fe166 Jeff Layton 2021-01-27 1651 * Allocate a read request for one or two extents, depending
6341655663fe166 Jeff Layton 2021-01-27 1652 * on how the request was aligned.
6341655663fe166 Jeff Layton 2021-01-27 1653 */
6341655663fe166 Jeff Layton 2021-01-27 1654 req = ceph_osdc_new_request(osdc, &ci->i_layout,
6341655663fe166 Jeff Layton 2021-01-27 1655 ci->i_vino, first ? first_pos : last_pos,
6341655663fe166 Jeff Layton 2021-01-27 1656 &read_len, 0, (first && last) ? 2 : 1,
6341655663fe166 Jeff Layton 2021-01-27 1657 CEPH_OSD_OP_SPARSE_READ, CEPH_OSD_FLAG_READ,
6341655663fe166 Jeff Layton 2021-01-27 1658 NULL, ci->i_truncate_seq,
6341655663fe166 Jeff Layton 2021-01-27 1659 ci->i_truncate_size, false);
e8344e668915a74 majianpeng 2013-09-12 1660 if (IS_ERR(req)) {
6341655663fe166 Jeff Layton 2021-01-27 1661 ceph_release_page_vector(pages, num_pages);
e8344e668915a74 majianpeng 2013-09-12 1662 ret = PTR_ERR(req);
eab87235c0f5979 Al Viro 2014-04-03 1663 break;
e8344e668915a74 majianpeng 2013-09-12 1664 }
e8344e668915a74 majianpeng 2013-09-12 1665
6341655663fe166 Jeff Layton 2021-01-27 1666 /* Something is misaligned! */
6341655663fe166 Jeff Layton 2021-01-27 1667 if (read_len != CEPH_FSCRYPT_BLOCK_SIZE) {
6341655663fe166 Jeff Layton 2021-01-27 1668 ceph_osdc_put_request(req);
6341655663fe166 Jeff Layton 2021-01-27 1669 ceph_release_page_vector(pages, num_pages);
6341655663fe166 Jeff Layton 2021-01-27 1670 ret = -EIO;
6341655663fe166 Jeff Layton 2021-01-27 1671 break;
6341655663fe166 Jeff Layton 2021-01-27 1672 }
6341655663fe166 Jeff Layton 2021-01-27 1673
6341655663fe166 Jeff Layton 2021-01-27 1674 /* Add extent for first block? */
6341655663fe166 Jeff Layton 2021-01-27 1675 op = &req->r_ops[0];
6341655663fe166 Jeff Layton 2021-01-27 1676
6341655663fe166 Jeff Layton 2021-01-27 1677 if (first) {
6341655663fe166 Jeff Layton 2021-01-27 1678 osd_req_op_extent_osd_data_pages(req, 0, pages,
6341655663fe166 Jeff Layton 2021-01-27 1679 CEPH_FSCRYPT_BLOCK_SIZE,
6341655663fe166 Jeff Layton 2021-01-27 1680 offset_in_page(first_pos),
6341655663fe166 Jeff Layton 2021-01-27 1681 false, false);
6341655663fe166 Jeff Layton 2021-01-27 1682 /* We only expect a single extent here */
6341655663fe166 Jeff Layton 2021-01-27 1683 ret = __ceph_alloc_sparse_ext_map(op, 1);
6341655663fe166 Jeff Layton 2021-01-27 1684 if (ret) {
6341655663fe166 Jeff Layton 2021-01-27 1685 ceph_osdc_put_request(req);
6341655663fe166 Jeff Layton 2021-01-27 1686 ceph_release_page_vector(pages, num_pages);
6341655663fe166 Jeff Layton 2021-01-27 1687 break;
6341655663fe166 Jeff Layton 2021-01-27 1688 }
6341655663fe166 Jeff Layton 2021-01-27 1689 }
6341655663fe166 Jeff Layton 2021-01-27 1690
6341655663fe166 Jeff Layton 2021-01-27 1691 /* Add extent for last block */
6341655663fe166 Jeff Layton 2021-01-27 1692 if (last) {
6341655663fe166 Jeff Layton 2021-01-27 1693 /* Init the other extent if first extent has been used */
6341655663fe166 Jeff Layton 2021-01-27 1694 if (first) {
6341655663fe166 Jeff Layton 2021-01-27 1695 op = &req->r_ops[1];
6341655663fe166 Jeff Layton 2021-01-27 1696 osd_req_op_extent_init(req, 1, CEPH_OSD_OP_SPARSE_READ,
6341655663fe166 Jeff Layton 2021-01-27 1697 last_pos, CEPH_FSCRYPT_BLOCK_SIZE,
6341655663fe166 Jeff Layton 2021-01-27 1698 ci->i_truncate_size,
6341655663fe166 Jeff Layton 2021-01-27 1699 ci->i_truncate_seq);
6341655663fe166 Jeff Layton 2021-01-27 1700 }
6341655663fe166 Jeff Layton 2021-01-27 1701
6341655663fe166 Jeff Layton 2021-01-27 1702 ret = __ceph_alloc_sparse_ext_map(op, 1);
6341655663fe166 Jeff Layton 2021-01-27 1703 if (ret) {
6341655663fe166 Jeff Layton 2021-01-27 1704 ceph_osdc_put_request(req);
6341655663fe166 Jeff Layton 2021-01-27 1705 ceph_release_page_vector(pages, num_pages);
6341655663fe166 Jeff Layton 2021-01-27 1706 break;
6341655663fe166 Jeff Layton 2021-01-27 1707 }
6341655663fe166 Jeff Layton 2021-01-27 1708
6341655663fe166 Jeff Layton 2021-01-27 1709 osd_req_op_extent_osd_data_pages(req, first ? 1 : 0,
6341655663fe166 Jeff Layton 2021-01-27 1710 &pages[num_pages - 1],
6341655663fe166 Jeff Layton 2021-01-27 1711 CEPH_FSCRYPT_BLOCK_SIZE,
6341655663fe166 Jeff Layton 2021-01-27 1712 offset_in_page(last_pos),
6341655663fe166 Jeff Layton 2021-01-27 1713 false, false);
6341655663fe166 Jeff Layton 2021-01-27 1714 }
6341655663fe166 Jeff Layton 2021-01-27 1715
6341655663fe166 Jeff Layton 2021-01-27 1716 ret = ceph_osdc_start_request(osdc, req, false);
6341655663fe166 Jeff Layton 2021-01-27 1717 if (!ret)
6341655663fe166 Jeff Layton 2021-01-27 1718 ret = ceph_osdc_wait_request(osdc, req);
6341655663fe166 Jeff Layton 2021-01-27 1719
6341655663fe166 Jeff Layton 2021-01-27 1720 /* FIXME: length field is wrong if there are 2 extents */
6341655663fe166 Jeff Layton 2021-01-27 1721 ceph_update_read_metrics(&fsc->mdsc->metric,
6341655663fe166 Jeff Layton 2021-01-27 1722 req->r_start_latency,
6341655663fe166 Jeff Layton 2021-01-27 1723 req->r_end_latency,
6341655663fe166 Jeff Layton 2021-01-27 1724 read_len, ret);
6341655663fe166 Jeff Layton 2021-01-27 1725
6341655663fe166 Jeff Layton 2021-01-27 1726 /* Ok if object is not already present */
6341655663fe166 Jeff Layton 2021-01-27 1727 if (ret == -ENOENT) {
6341655663fe166 Jeff Layton 2021-01-27 1728 /*
6341655663fe166 Jeff Layton 2021-01-27 1729 * If there is no object, then we can't assert
6341655663fe166 Jeff Layton 2021-01-27 1730 * on its version. Set it to 0, and we'll use an
6341655663fe166 Jeff Layton 2021-01-27 1731 * exclusive create instead.
6341655663fe166 Jeff Layton 2021-01-27 1732 */
6341655663fe166 Jeff Layton 2021-01-27 1733 ceph_osdc_put_request(req);
6341655663fe166 Jeff Layton 2021-01-27 1734 assert_ver = 0;
6341655663fe166 Jeff Layton 2021-01-27 1735 ret = 0;
6341655663fe166 Jeff Layton 2021-01-27 1736
6341655663fe166 Jeff Layton 2021-01-27 1737 /*
6341655663fe166 Jeff Layton 2021-01-27 1738 * zero out the soon-to-be uncopied parts of the
6341655663fe166 Jeff Layton 2021-01-27 1739 * first and last pages.
6341655663fe166 Jeff Layton 2021-01-27 1740 */
6341655663fe166 Jeff Layton 2021-01-27 1741 if (first)
6341655663fe166 Jeff Layton 2021-01-27 1742 zero_user_segment(pages[0], 0,
6341655663fe166 Jeff Layton 2021-01-27 1743 offset_in_page(first_pos));
6341655663fe166 Jeff Layton 2021-01-27 1744 if (last)
6341655663fe166 Jeff Layton 2021-01-27 1745 zero_user_segment(pages[num_pages - 1],
6341655663fe166 Jeff Layton 2021-01-27 1746 offset_in_page(last_pos),
6341655663fe166 Jeff Layton 2021-01-27 1747 PAGE_SIZE);
6341655663fe166 Jeff Layton 2021-01-27 1748 } else {
6341655663fe166 Jeff Layton 2021-01-27 1749 if (ret < 0) {
6341655663fe166 Jeff Layton 2021-01-27 1750 ceph_osdc_put_request(req);
6341655663fe166 Jeff Layton 2021-01-27 1751 ceph_release_page_vector(pages, num_pages);
6341655663fe166 Jeff Layton 2021-01-27 1752 break;
6341655663fe166 Jeff Layton 2021-01-27 1753 }
6341655663fe166 Jeff Layton 2021-01-27 1754
6341655663fe166 Jeff Layton 2021-01-27 1755 op = &req->r_ops[0];
6341655663fe166 Jeff Layton 2021-01-27 1756 if (op->extent.sparse_ext_cnt == 0) {
6341655663fe166 Jeff Layton 2021-01-27 1757 if (first)
6341655663fe166 Jeff Layton 2021-01-27 1758 zero_user_segment(pages[0], 0,
6341655663fe166 Jeff Layton 2021-01-27 1759 offset_in_page(first_pos));
6341655663fe166 Jeff Layton 2021-01-27 1760 else
6341655663fe166 Jeff Layton 2021-01-27 1761 zero_user_segment(pages[num_pages - 1],
6341655663fe166 Jeff Layton 2021-01-27 1762 offset_in_page(last_pos),
6341655663fe166 Jeff Layton 2021-01-27 1763 PAGE_SIZE);
6341655663fe166 Jeff Layton 2021-01-27 1764 } else if (op->extent.sparse_ext_cnt != 1 ||
6341655663fe166 Jeff Layton 2021-01-27 1765 ceph_sparse_ext_map_end(op) !=
6341655663fe166 Jeff Layton 2021-01-27 1766 CEPH_FSCRYPT_BLOCK_SIZE) {
6341655663fe166 Jeff Layton 2021-01-27 1767 ret = -EIO;
6341655663fe166 Jeff Layton 2021-01-27 1768 ceph_osdc_put_request(req);
6341655663fe166 Jeff Layton 2021-01-27 1769 ceph_release_page_vector(pages, num_pages);
6341655663fe166 Jeff Layton 2021-01-27 1770 break;
6341655663fe166 Jeff Layton 2021-01-27 1771 }
6341655663fe166 Jeff Layton 2021-01-27 1772
6341655663fe166 Jeff Layton 2021-01-27 1773 if (first && last) {
6341655663fe166 Jeff Layton 2021-01-27 1774 op = &req->r_ops[1];
6341655663fe166 Jeff Layton 2021-01-27 1775 if (op->extent.sparse_ext_cnt == 0) {
6341655663fe166 Jeff Layton 2021-01-27 1776 zero_user_segment(pages[num_pages - 1],
6341655663fe166 Jeff Layton 2021-01-27 1777 offset_in_page(last_pos),
6341655663fe166 Jeff Layton 2021-01-27 1778 PAGE_SIZE);
6341655663fe166 Jeff Layton 2021-01-27 1779 } else if (op->extent.sparse_ext_cnt != 1 ||
6341655663fe166 Jeff Layton 2021-01-27 1780 ceph_sparse_ext_map_end(op) !=
6341655663fe166 Jeff Layton 2021-01-27 1781 CEPH_FSCRYPT_BLOCK_SIZE) {
6341655663fe166 Jeff Layton 2021-01-27 1782 ret = -EIO;
6341655663fe166 Jeff Layton 2021-01-27 1783 ceph_osdc_put_request(req);
6341655663fe166 Jeff Layton 2021-01-27 1784 ceph_release_page_vector(pages, num_pages);
6341655663fe166 Jeff Layton 2021-01-27 1785 break;
6341655663fe166 Jeff Layton 2021-01-27 1786 }
6341655663fe166 Jeff Layton 2021-01-27 1787 }
6341655663fe166 Jeff Layton 2021-01-27 1788
6341655663fe166 Jeff Layton 2021-01-27 1789 /* Grab assert version. It must be non-zero. */
6341655663fe166 Jeff Layton 2021-01-27 1790 assert_ver = req->r_version;
6341655663fe166 Jeff Layton 2021-01-27 1791 WARN_ON_ONCE(ret > 0 && assert_ver == 0);
6341655663fe166 Jeff Layton 2021-01-27 1792
6341655663fe166 Jeff Layton 2021-01-27 1793 ceph_osdc_put_request(req);
6341655663fe166 Jeff Layton 2021-01-27 1794 if (first) {
6341655663fe166 Jeff Layton 2021-01-27 1795 ret = ceph_fscrypt_decrypt_block_inplace(inode,
6341655663fe166 Jeff Layton 2021-01-27 1796 pages[0],
6341655663fe166 Jeff Layton 2021-01-27 1797 CEPH_FSCRYPT_BLOCK_SIZE,
6341655663fe166 Jeff Layton 2021-01-27 1798 offset_in_page(first_pos),
6341655663fe166 Jeff Layton 2021-01-27 1799 first_pos >> CEPH_FSCRYPT_BLOCK_SHIFT);
6341655663fe166 Jeff Layton 2021-01-27 1800 if (ret < 0) {
6341655663fe166 Jeff Layton 2021-01-27 1801 ceph_release_page_vector(pages, num_pages);
6341655663fe166 Jeff Layton 2021-01-27 1802 break;
6341655663fe166 Jeff Layton 2021-01-27 1803 }
6341655663fe166 Jeff Layton 2021-01-27 1804 }
6341655663fe166 Jeff Layton 2021-01-27 1805 if (last) {
6341655663fe166 Jeff Layton 2021-01-27 1806 ret = ceph_fscrypt_decrypt_block_inplace(inode,
6341655663fe166 Jeff Layton 2021-01-27 1807 pages[num_pages - 1],
6341655663fe166 Jeff Layton 2021-01-27 1808 CEPH_FSCRYPT_BLOCK_SIZE,
6341655663fe166 Jeff Layton 2021-01-27 1809 offset_in_page(last_pos),
6341655663fe166 Jeff Layton 2021-01-27 1810 last_pos >> CEPH_FSCRYPT_BLOCK_SHIFT);
6341655663fe166 Jeff Layton 2021-01-27 1811 if (ret < 0) {
6341655663fe166 Jeff Layton 2021-01-27 1812 ceph_release_page_vector(pages, num_pages);
6341655663fe166 Jeff Layton 2021-01-27 1813 break;
6341655663fe166 Jeff Layton 2021-01-27 1814 }
6341655663fe166 Jeff Layton 2021-01-27 1815 }
6341655663fe166 Jeff Layton 2021-01-27 1816 }
124e68e74099090 Sage Weil 2009-10-06 1817 }
e8344e668915a74 majianpeng 2013-09-12 1818
e8344e668915a74 majianpeng 2013-09-12 1819 left = len;
54f371cad7e715f Jeff Layton 2021-01-25 1820 off = offset_in_page(pos);
e8344e668915a74 majianpeng 2013-09-12 1821 for (n = 0; n < num_pages; n++) {
54f371cad7e715f Jeff Layton 2021-01-25 1822 size_t plen = min_t(size_t, left, PAGE_SIZE - off);
54f371cad7e715f Jeff Layton 2021-01-25 1823
6341655663fe166 Jeff Layton 2021-01-27 1824 /* copy the data */
54f371cad7e715f Jeff Layton 2021-01-25 1825 ret = copy_page_from_iter(pages[n], off, plen, from);
e8344e668915a74 majianpeng 2013-09-12 1826 if (ret != plen) {
e8344e668915a74 majianpeng 2013-09-12 1827 ret = -EFAULT;
e8344e668915a74 majianpeng 2013-09-12 1828 break;
e8344e668915a74 majianpeng 2013-09-12 1829 }
6341655663fe166 Jeff Layton 2021-01-27 1830 off = 0;
e8344e668915a74 majianpeng 2013-09-12 1831 left -= ret;
e8344e668915a74 majianpeng 2013-09-12 1832 }
6341655663fe166 Jeff Layton 2021-01-27 1833 if (ret < 0) {
6341655663fe166 Jeff Layton 2021-01-27 1834 dout("sync_write write failed with %d\n", ret);
6341655663fe166 Jeff Layton 2021-01-27 1835 ceph_release_page_vector(pages, num_pages);
6341655663fe166 Jeff Layton 2021-01-27 1836 break;
6341655663fe166 Jeff Layton 2021-01-27 1837 }
e8344e668915a74 majianpeng 2013-09-12 1838
6341655663fe166 Jeff Layton 2021-01-27 1839 if (IS_ENCRYPTED(inode)) {
6341655663fe166 Jeff Layton 2021-01-27 1840 ret = ceph_fscrypt_encrypt_pages(inode, pages,
6341655663fe166 Jeff Layton 2021-01-27 1841 write_pos, write_len,
6341655663fe166 Jeff Layton 2021-01-27 1842 GFP_KERNEL);
124e68e74099090 Sage Weil 2009-10-06 1843 if (ret < 0) {
6341655663fe166 Jeff Layton 2021-01-27 1844 dout("encryption failed with %d\n", ret);
124e68e74099090 Sage Weil 2009-10-06 1845 ceph_release_page_vector(pages, num_pages);
6341655663fe166 Jeff Layton 2021-01-27 1846 break;
6341655663fe166 Jeff Layton 2021-01-27 1847 }
124e68e74099090 Sage Weil 2009-10-06 1848 }
124e68e74099090 Sage Weil 2009-10-06 1849
6341655663fe166 Jeff Layton 2021-01-27 1850 req = ceph_osdc_new_request(osdc, &ci->i_layout,
6341655663fe166 Jeff Layton 2021-01-27 1851 ci->i_vino, write_pos, &write_len,
6341655663fe166 Jeff Layton 2021-01-27 1852 rmw ? 1 : 0, rmw ? 2 : 1,
6341655663fe166 Jeff Layton 2021-01-27 1853 CEPH_OSD_OP_WRITE,
6341655663fe166 Jeff Layton 2021-01-27 1854 CEPH_OSD_FLAG_WRITE,
6341655663fe166 Jeff Layton 2021-01-27 1855 snapc, ci->i_truncate_seq,
6341655663fe166 Jeff Layton 2021-01-27 1856 ci->i_truncate_size, false);
6341655663fe166 Jeff Layton 2021-01-27 1857 if (IS_ERR(req)) {
6341655663fe166 Jeff Layton 2021-01-27 1858 ret = PTR_ERR(req);
6341655663fe166 Jeff Layton 2021-01-27 1859 ceph_release_page_vector(pages, num_pages);
6341655663fe166 Jeff Layton 2021-01-27 1860 break;
6341655663fe166 Jeff Layton 2021-01-27 1861 }
6341655663fe166 Jeff Layton 2021-01-27 1862
6341655663fe166 Jeff Layton 2021-01-27 1863 dout("sync_write write op %lld~%llu\n", write_pos, write_len);
6341655663fe166 Jeff Layton 2021-01-27 1864 osd_req_op_extent_osd_data_pages(req, rmw ? 1 : 0, pages, write_len,
6341655663fe166 Jeff Layton 2021-01-27 1865 offset_in_page(write_pos), false,
6341655663fe166 Jeff Layton 2021-01-27 1866 true);
26be88087ae8a04 Alex Elder 2013-04-15 1867 req->r_inode = inode;
6341655663fe166 Jeff Layton 2021-01-27 1868 req->r_mtime = mtime;
e8344e668915a74 majianpeng 2013-09-12 1869
6341655663fe166 Jeff Layton 2021-01-27 1870 /* Set up the assertion */
6341655663fe166 Jeff Layton 2021-01-27 1871 if (rmw) {
6341655663fe166 Jeff Layton 2021-01-27 1872 /*
6341655663fe166 Jeff Layton 2021-01-27 1873 * Set up the assertion. If we don't have a version number,
6341655663fe166 Jeff Layton 2021-01-27 1874 * then the object doesn't exist yet. Use an exclusive create
6341655663fe166 Jeff Layton 2021-01-27 1875 * instead of a version assertion in that case.
6341655663fe166 Jeff Layton 2021-01-27 1876 */
6341655663fe166 Jeff Layton 2021-01-27 1877 if (assert_ver) {
6341655663fe166 Jeff Layton 2021-01-27 1878 osd_req_op_init(req, 0, CEPH_OSD_OP_ASSERT_VER, 0);
6341655663fe166 Jeff Layton 2021-01-27 1879 req->r_ops[0].assert_ver.ver = assert_ver;
6341655663fe166 Jeff Layton 2021-01-27 1880 } else {
6341655663fe166 Jeff Layton 2021-01-27 1881 osd_req_op_init(req, 0, CEPH_OSD_OP_CREATE,
6341655663fe166 Jeff Layton 2021-01-27 1882 CEPH_OSD_OP_FLAG_EXCL);
6341655663fe166 Jeff Layton 2021-01-27 1883 }
6341655663fe166 Jeff Layton 2021-01-27 1884 }
124e68e74099090 Sage Weil 2009-10-06 1885
6341655663fe166 Jeff Layton 2021-01-27 1886 ret = ceph_osdc_start_request(osdc, req, false);
26be88087ae8a04 Alex Elder 2013-04-15 1887 if (!ret)
6341655663fe166 Jeff Layton 2021-01-27 1888 ret = ceph_osdc_wait_request(osdc, req);
124e68e74099090 Sage Weil 2009-10-06 1889
8ae99ae2b40766a Xiubo Li 2021-03-22 1890 ceph_update_write_metrics(&fsc->mdsc->metric, req->r_start_latency,
903f4fec78dd05a Xiubo Li 2021-05-13 1891 req->r_end_latency, len, ret);
124e68e74099090 Sage Weil 2009-10-06 1892 ceph_osdc_put_request(req);
26544c623e741ac Jeff Layton 2017-04-04 1893 if (ret != 0) {
6341655663fe166 Jeff Layton 2021-01-27 1894 dout("sync_write osd write returned %d\n", ret);
6341655663fe166 Jeff Layton 2021-01-27 1895 /* Version changed! Must re-do the rmw cycle */
6341655663fe166 Jeff Layton 2021-01-27 @1896 if ((assert_ver && (ret == -ERANGE || ret == -EOVERFLOW)) ||
6341655663fe166 Jeff Layton 2021-01-27 1897 (!assert_ver && ret == -EEXIST)) {
6341655663fe166 Jeff Layton 2021-01-27 1898 /* We should only ever see this on a rmw */
6341655663fe166 Jeff Layton 2021-01-27 1899 WARN_ON_ONCE(!rmw);
6341655663fe166 Jeff Layton 2021-01-27 1900
6341655663fe166 Jeff Layton 2021-01-27 1901 /* The version should never go backward */
6341655663fe166 Jeff Layton 2021-01-27 1902 WARN_ON_ONCE(ret == -EOVERFLOW);
6341655663fe166 Jeff Layton 2021-01-27 1903
6341655663fe166 Jeff Layton 2021-01-27 1904 *from = saved_iter;
6341655663fe166 Jeff Layton 2021-01-27 1905
6341655663fe166 Jeff Layton 2021-01-27 1906 /* FIXME: limit number of times we loop? */
6341655663fe166 Jeff Layton 2021-01-27 1907 continue;
6341655663fe166 Jeff Layton 2021-01-27 1908 }
26544c623e741ac Jeff Layton 2017-04-04 1909 ceph_set_error_write(ci);
26544c623e741ac Jeff Layton 2017-04-04 1910 break;
26544c623e741ac Jeff Layton 2017-04-04 1911 }
26544c623e741ac Jeff Layton 2017-04-04 1912 ceph_clear_error_write(ci);
124e68e74099090 Sage Weil 2009-10-06 1913 pos += len;
124e68e74099090 Sage Weil 2009-10-06 1914 written += len;
6341655663fe166 Jeff Layton 2021-01-27 1915 dout("sync_write written %d\n", written);
e8344e668915a74 majianpeng 2013-09-12 1916 if (pos > i_size_read(inode)) {
124e68e74099090 Sage Weil 2009-10-06 1917 check_caps = ceph_inode_set_size(inode, pos);
124e68e74099090 Sage Weil 2009-10-06 1918 if (check_caps)
e8344e668915a74 majianpeng 2013-09-12 1919 ceph_check_caps(ceph_inode(inode),
e8344e668915a74 majianpeng 2013-09-12 1920 CHECK_CAPS_AUTHONLY,
124e68e74099090 Sage Weil 2009-10-06 1921 NULL);
e8344e668915a74 majianpeng 2013-09-12 1922 }
26544c623e741ac Jeff Layton 2017-04-04 1923
e8344e668915a74 majianpeng 2013-09-12 1924 }
e8344e668915a74 majianpeng 2013-09-12 1925
e8344e668915a74 majianpeng 2013-09-12 1926 if (ret != -EOLDSNAPC && written > 0) {
ee7289bfadda5f4 majianpeng 2013-08-21 1927 ret = written;
e8344e668915a74 majianpeng 2013-09-12 1928 iocb->ki_pos = pos;
124e68e74099090 Sage Weil 2009-10-06 1929 }
6341655663fe166 Jeff Layton 2021-01-27 1930 dout("sync_write returning %d\n", ret);
124e68e74099090 Sage Weil 2009-10-06 1931 return ret;
124e68e74099090 Sage Weil 2009-10-06 1932 }
124e68e74099090 Sage Weil 2009-10-06 1933
--
0-DAY CI Kernel Test Service
https://01.org/lkp
WARNING: multiple messages have this Message-ID (diff)
From: Dan Carpenter <dan.carpenter@oracle.com>
To: kbuild-all@lists.01.org
Subject: [ceph-client:wip-fscrypt 53/64] fs/ceph/file.c:1896 ceph_sync_write() error: uninitialized symbol 'assert_ver'.
Date: Tue, 24 May 2022 21:39:08 +0300 [thread overview]
Message-ID: <202205250038.pULlmpTX-lkp@intel.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 32222 bytes --]
tree: https://github.com/ceph/ceph-client.git wip-fscrypt
head: 9ab30a676da19ce5d83364306a03d643dd446aca
commit: 6341655663fe166fd30acca6b4e692d2fafb02e5 [53/64] ceph: add read/modify/write to ceph_sync_write
config: microblaze-randconfig-m031-20220524 (https://download.01.org/0day-ci/archive/20220525/202205250038.pULlmpTX-lkp(a)intel.com/config)
compiler: microblaze-linux-gcc (GCC) 11.3.0
If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
New smatch warnings:
fs/ceph/file.c:1896 ceph_sync_write() error: uninitialized symbol 'assert_ver'.
Old smatch warnings:
fs/ceph/file.c:146 iter_get_bvecs_alloc() warn: Please consider using kvcalloc instead of kvmalloc_array
vim +/assert_ver +1896 fs/ceph/file.c
06fee30f6a31f10 Yan, Zheng 2014-07-28 1550 static ssize_t
5dda377cf0a6bd4 Yan, Zheng 2015-04-30 1551 ceph_sync_write(struct kiocb *iocb, struct iov_iter *from, loff_t pos,
5dda377cf0a6bd4 Yan, Zheng 2015-04-30 1552 struct ceph_snap_context *snapc)
e8344e668915a74 majianpeng 2013-09-12 1553 {
e8344e668915a74 majianpeng 2013-09-12 1554 struct file *file = iocb->ki_filp;
e8344e668915a74 majianpeng 2013-09-12 1555 struct inode *inode = file_inode(file);
e8344e668915a74 majianpeng 2013-09-12 1556 struct ceph_inode_info *ci = ceph_inode(inode);
e8344e668915a74 majianpeng 2013-09-12 1557 struct ceph_fs_client *fsc = ceph_inode_to_client(inode);
6341655663fe166 Jeff Layton 2021-01-27 1558 struct ceph_osd_client *osdc = &fsc->client->osdc;
e8344e668915a74 majianpeng 2013-09-12 1559 struct ceph_osd_request *req;
e8344e668915a74 majianpeng 2013-09-12 1560 struct page **pages;
e8344e668915a74 majianpeng 2013-09-12 1561 u64 len;
e8344e668915a74 majianpeng 2013-09-12 1562 int num_pages;
e8344e668915a74 majianpeng 2013-09-12 1563 int written = 0;
e8344e668915a74 majianpeng 2013-09-12 1564 int ret;
efb0ca765ac6f49 Yan, Zheng 2017-05-22 1565 bool check_caps = false;
fac02ddf910814c Arnd Bergmann 2018-07-13 1566 struct timespec64 mtime = current_time(inode);
4908b822b300d2d Al Viro 2014-04-03 1567 size_t count = iov_iter_count(from);
e8344e668915a74 majianpeng 2013-09-12 1568
e8344e668915a74 majianpeng 2013-09-12 1569 if (ceph_snap(file_inode(file)) != CEPH_NOSNAP)
e8344e668915a74 majianpeng 2013-09-12 1570 return -EROFS;
e8344e668915a74 majianpeng 2013-09-12 1571
1c0a9c2d9783604 Yan, Zheng 2017-08-16 1572 dout("sync_write on file %p %lld~%u snapc %p seq %lld\n",
1c0a9c2d9783604 Yan, Zheng 2017-08-16 1573 file, pos, (unsigned)count, snapc, snapc->seq);
e8344e668915a74 majianpeng 2013-09-12 1574
e450f4d1a5d633d zhengbin 2019-02-01 1575 ret = filemap_write_and_wait_range(inode->i_mapping,
e450f4d1a5d633d zhengbin 2019-02-01 1576 pos, pos + count - 1);
e8344e668915a74 majianpeng 2013-09-12 1577 if (ret < 0)
e8344e668915a74 majianpeng 2013-09-12 1578 return ret;
e8344e668915a74 majianpeng 2013-09-12 1579
400e1286c0ec3fd Jeff Layton 2021-12-07 1580 ceph_fscache_invalidate(inode, false);
e8344e668915a74 majianpeng 2013-09-12 1581 ret = invalidate_inode_pages2_range(inode->i_mapping,
09cbfeaf1a5a67b Kirill A. Shutemov 2016-04-01 1582 pos >> PAGE_SHIFT,
e450f4d1a5d633d zhengbin 2019-02-01 1583 (pos + count - 1) >> PAGE_SHIFT);
e8344e668915a74 majianpeng 2013-09-12 1584 if (ret < 0)
e8344e668915a74 majianpeng 2013-09-12 1585 dout("invalidate_inode_pages2_range returned %d\n", ret);
e8344e668915a74 majianpeng 2013-09-12 1586
4908b822b300d2d Al Viro 2014-04-03 1587 while ((len = iov_iter_count(from)) > 0) {
e8344e668915a74 majianpeng 2013-09-12 1588 size_t left;
e8344e668915a74 majianpeng 2013-09-12 1589 int n;
6341655663fe166 Jeff Layton 2021-01-27 1590 u64 write_pos = pos;
6341655663fe166 Jeff Layton 2021-01-27 1591 u64 write_len = len;
6341655663fe166 Jeff Layton 2021-01-27 1592 u64 objnum, objoff;
6341655663fe166 Jeff Layton 2021-01-27 1593 u32 xlen;
6341655663fe166 Jeff Layton 2021-01-27 1594 u64 assert_ver;
6341655663fe166 Jeff Layton 2021-01-27 1595 bool rmw;
6341655663fe166 Jeff Layton 2021-01-27 1596 bool first, last;
6341655663fe166 Jeff Layton 2021-01-27 1597 struct iov_iter saved_iter = *from;
6341655663fe166 Jeff Layton 2021-01-27 1598 size_t off;
e8344e668915a74 majianpeng 2013-09-12 1599
6341655663fe166 Jeff Layton 2021-01-27 1600 ceph_fscrypt_adjust_off_and_len(inode, &write_pos, &write_len);
6341655663fe166 Jeff Layton 2021-01-27 1601
6341655663fe166 Jeff Layton 2021-01-27 1602 /* clamp the length to the end of first object */
6341655663fe166 Jeff Layton 2021-01-27 1603 ceph_calc_file_object_mapping(&ci->i_layout, write_pos,
6341655663fe166 Jeff Layton 2021-01-27 1604 write_len, &objnum, &objoff,
6341655663fe166 Jeff Layton 2021-01-27 1605 &xlen);
6341655663fe166 Jeff Layton 2021-01-27 1606 write_len = xlen;
6341655663fe166 Jeff Layton 2021-01-27 1607
6341655663fe166 Jeff Layton 2021-01-27 1608 /* adjust len downward if it goes beyond current object */
6341655663fe166 Jeff Layton 2021-01-27 1609 if (pos + len > write_pos + write_len)
6341655663fe166 Jeff Layton 2021-01-27 1610 len = write_pos + write_len - pos;
6341655663fe166 Jeff Layton 2021-01-27 1611
6341655663fe166 Jeff Layton 2021-01-27 1612 /*
6341655663fe166 Jeff Layton 2021-01-27 1613 * If we had to adjust the length or position to align with a
6341655663fe166 Jeff Layton 2021-01-27 1614 * crypto block, then we must do a read/modify/write cycle. We
6341655663fe166 Jeff Layton 2021-01-27 1615 * use a version assertion to redrive the thing if something
6341655663fe166 Jeff Layton 2021-01-27 1616 * changes in between.
6341655663fe166 Jeff Layton 2021-01-27 1617 */
6341655663fe166 Jeff Layton 2021-01-27 1618 first = pos != write_pos;
6341655663fe166 Jeff Layton 2021-01-27 1619 last = (pos + len) != (write_pos + write_len);
6341655663fe166 Jeff Layton 2021-01-27 1620 rmw = first || last;
6341655663fe166 Jeff Layton 2021-01-27 1621
6341655663fe166 Jeff Layton 2021-01-27 1622 dout("sync_write ino %llx %lld~%llu adjusted %lld~%llu -- %srmw\n",
6341655663fe166 Jeff Layton 2021-01-27 1623 ci->i_vino.ino, pos, len, write_pos, write_len, rmw ? "" : "no ");
6341655663fe166 Jeff Layton 2021-01-27 1624
6341655663fe166 Jeff Layton 2021-01-27 1625 /*
6341655663fe166 Jeff Layton 2021-01-27 1626 * The data is emplaced into the page as it would be if it were in
6341655663fe166 Jeff Layton 2021-01-27 1627 * an array of pagecache pages.
6341655663fe166 Jeff Layton 2021-01-27 1628 */
6341655663fe166 Jeff Layton 2021-01-27 1629 num_pages = calc_pages_for(write_pos, write_len);
6341655663fe166 Jeff Layton 2021-01-27 1630 pages = ceph_alloc_page_vector(num_pages, GFP_KERNEL);
6341655663fe166 Jeff Layton 2021-01-27 1631 if (IS_ERR(pages)) {
6341655663fe166 Jeff Layton 2021-01-27 1632 ret = PTR_ERR(pages);
6341655663fe166 Jeff Layton 2021-01-27 1633 break;
6341655663fe166 Jeff Layton 2021-01-27 1634 }
6341655663fe166 Jeff Layton 2021-01-27 1635
6341655663fe166 Jeff Layton 2021-01-27 1636 /* Do we need to preload the pages? */
6341655663fe166 Jeff Layton 2021-01-27 1637 if (rmw) {
"assert_ver" is only initialized when "rmw" is true.
6341655663fe166 Jeff Layton 2021-01-27 1638 u64 first_pos = write_pos;
6341655663fe166 Jeff Layton 2021-01-27 1639 u64 last_pos = (write_pos + write_len) - CEPH_FSCRYPT_BLOCK_SIZE;
6341655663fe166 Jeff Layton 2021-01-27 1640 u64 read_len = CEPH_FSCRYPT_BLOCK_SIZE;
6341655663fe166 Jeff Layton 2021-01-27 1641 struct ceph_osd_req_op *op;
6341655663fe166 Jeff Layton 2021-01-27 1642
6341655663fe166 Jeff Layton 2021-01-27 1643 /* We should only need to do this for encrypted inodes */
6341655663fe166 Jeff Layton 2021-01-27 1644 WARN_ON_ONCE(!IS_ENCRYPTED(inode));
6341655663fe166 Jeff Layton 2021-01-27 1645
6341655663fe166 Jeff Layton 2021-01-27 1646 /* No need to do two reads if first and last blocks are same */
6341655663fe166 Jeff Layton 2021-01-27 1647 if (first && last_pos == first_pos)
6341655663fe166 Jeff Layton 2021-01-27 1648 last = false;
6341655663fe166 Jeff Layton 2021-01-27 1649
6341655663fe166 Jeff Layton 2021-01-27 1650 /*
6341655663fe166 Jeff Layton 2021-01-27 1651 * Allocate a read request for one or two extents, depending
6341655663fe166 Jeff Layton 2021-01-27 1652 * on how the request was aligned.
6341655663fe166 Jeff Layton 2021-01-27 1653 */
6341655663fe166 Jeff Layton 2021-01-27 1654 req = ceph_osdc_new_request(osdc, &ci->i_layout,
6341655663fe166 Jeff Layton 2021-01-27 1655 ci->i_vino, first ? first_pos : last_pos,
6341655663fe166 Jeff Layton 2021-01-27 1656 &read_len, 0, (first && last) ? 2 : 1,
6341655663fe166 Jeff Layton 2021-01-27 1657 CEPH_OSD_OP_SPARSE_READ, CEPH_OSD_FLAG_READ,
6341655663fe166 Jeff Layton 2021-01-27 1658 NULL, ci->i_truncate_seq,
6341655663fe166 Jeff Layton 2021-01-27 1659 ci->i_truncate_size, false);
e8344e668915a74 majianpeng 2013-09-12 1660 if (IS_ERR(req)) {
6341655663fe166 Jeff Layton 2021-01-27 1661 ceph_release_page_vector(pages, num_pages);
e8344e668915a74 majianpeng 2013-09-12 1662 ret = PTR_ERR(req);
eab87235c0f5979 Al Viro 2014-04-03 1663 break;
e8344e668915a74 majianpeng 2013-09-12 1664 }
e8344e668915a74 majianpeng 2013-09-12 1665
6341655663fe166 Jeff Layton 2021-01-27 1666 /* Something is misaligned! */
6341655663fe166 Jeff Layton 2021-01-27 1667 if (read_len != CEPH_FSCRYPT_BLOCK_SIZE) {
6341655663fe166 Jeff Layton 2021-01-27 1668 ceph_osdc_put_request(req);
6341655663fe166 Jeff Layton 2021-01-27 1669 ceph_release_page_vector(pages, num_pages);
6341655663fe166 Jeff Layton 2021-01-27 1670 ret = -EIO;
6341655663fe166 Jeff Layton 2021-01-27 1671 break;
6341655663fe166 Jeff Layton 2021-01-27 1672 }
6341655663fe166 Jeff Layton 2021-01-27 1673
6341655663fe166 Jeff Layton 2021-01-27 1674 /* Add extent for first block? */
6341655663fe166 Jeff Layton 2021-01-27 1675 op = &req->r_ops[0];
6341655663fe166 Jeff Layton 2021-01-27 1676
6341655663fe166 Jeff Layton 2021-01-27 1677 if (first) {
6341655663fe166 Jeff Layton 2021-01-27 1678 osd_req_op_extent_osd_data_pages(req, 0, pages,
6341655663fe166 Jeff Layton 2021-01-27 1679 CEPH_FSCRYPT_BLOCK_SIZE,
6341655663fe166 Jeff Layton 2021-01-27 1680 offset_in_page(first_pos),
6341655663fe166 Jeff Layton 2021-01-27 1681 false, false);
6341655663fe166 Jeff Layton 2021-01-27 1682 /* We only expect a single extent here */
6341655663fe166 Jeff Layton 2021-01-27 1683 ret = __ceph_alloc_sparse_ext_map(op, 1);
6341655663fe166 Jeff Layton 2021-01-27 1684 if (ret) {
6341655663fe166 Jeff Layton 2021-01-27 1685 ceph_osdc_put_request(req);
6341655663fe166 Jeff Layton 2021-01-27 1686 ceph_release_page_vector(pages, num_pages);
6341655663fe166 Jeff Layton 2021-01-27 1687 break;
6341655663fe166 Jeff Layton 2021-01-27 1688 }
6341655663fe166 Jeff Layton 2021-01-27 1689 }
6341655663fe166 Jeff Layton 2021-01-27 1690
6341655663fe166 Jeff Layton 2021-01-27 1691 /* Add extent for last block */
6341655663fe166 Jeff Layton 2021-01-27 1692 if (last) {
6341655663fe166 Jeff Layton 2021-01-27 1693 /* Init the other extent if first extent has been used */
6341655663fe166 Jeff Layton 2021-01-27 1694 if (first) {
6341655663fe166 Jeff Layton 2021-01-27 1695 op = &req->r_ops[1];
6341655663fe166 Jeff Layton 2021-01-27 1696 osd_req_op_extent_init(req, 1, CEPH_OSD_OP_SPARSE_READ,
6341655663fe166 Jeff Layton 2021-01-27 1697 last_pos, CEPH_FSCRYPT_BLOCK_SIZE,
6341655663fe166 Jeff Layton 2021-01-27 1698 ci->i_truncate_size,
6341655663fe166 Jeff Layton 2021-01-27 1699 ci->i_truncate_seq);
6341655663fe166 Jeff Layton 2021-01-27 1700 }
6341655663fe166 Jeff Layton 2021-01-27 1701
6341655663fe166 Jeff Layton 2021-01-27 1702 ret = __ceph_alloc_sparse_ext_map(op, 1);
6341655663fe166 Jeff Layton 2021-01-27 1703 if (ret) {
6341655663fe166 Jeff Layton 2021-01-27 1704 ceph_osdc_put_request(req);
6341655663fe166 Jeff Layton 2021-01-27 1705 ceph_release_page_vector(pages, num_pages);
6341655663fe166 Jeff Layton 2021-01-27 1706 break;
6341655663fe166 Jeff Layton 2021-01-27 1707 }
6341655663fe166 Jeff Layton 2021-01-27 1708
6341655663fe166 Jeff Layton 2021-01-27 1709 osd_req_op_extent_osd_data_pages(req, first ? 1 : 0,
6341655663fe166 Jeff Layton 2021-01-27 1710 &pages[num_pages - 1],
6341655663fe166 Jeff Layton 2021-01-27 1711 CEPH_FSCRYPT_BLOCK_SIZE,
6341655663fe166 Jeff Layton 2021-01-27 1712 offset_in_page(last_pos),
6341655663fe166 Jeff Layton 2021-01-27 1713 false, false);
6341655663fe166 Jeff Layton 2021-01-27 1714 }
6341655663fe166 Jeff Layton 2021-01-27 1715
6341655663fe166 Jeff Layton 2021-01-27 1716 ret = ceph_osdc_start_request(osdc, req, false);
6341655663fe166 Jeff Layton 2021-01-27 1717 if (!ret)
6341655663fe166 Jeff Layton 2021-01-27 1718 ret = ceph_osdc_wait_request(osdc, req);
6341655663fe166 Jeff Layton 2021-01-27 1719
6341655663fe166 Jeff Layton 2021-01-27 1720 /* FIXME: length field is wrong if there are 2 extents */
6341655663fe166 Jeff Layton 2021-01-27 1721 ceph_update_read_metrics(&fsc->mdsc->metric,
6341655663fe166 Jeff Layton 2021-01-27 1722 req->r_start_latency,
6341655663fe166 Jeff Layton 2021-01-27 1723 req->r_end_latency,
6341655663fe166 Jeff Layton 2021-01-27 1724 read_len, ret);
6341655663fe166 Jeff Layton 2021-01-27 1725
6341655663fe166 Jeff Layton 2021-01-27 1726 /* Ok if object is not already present */
6341655663fe166 Jeff Layton 2021-01-27 1727 if (ret == -ENOENT) {
6341655663fe166 Jeff Layton 2021-01-27 1728 /*
6341655663fe166 Jeff Layton 2021-01-27 1729 * If there is no object, then we can't assert
6341655663fe166 Jeff Layton 2021-01-27 1730 * on its version. Set it to 0, and we'll use an
6341655663fe166 Jeff Layton 2021-01-27 1731 * exclusive create instead.
6341655663fe166 Jeff Layton 2021-01-27 1732 */
6341655663fe166 Jeff Layton 2021-01-27 1733 ceph_osdc_put_request(req);
6341655663fe166 Jeff Layton 2021-01-27 1734 assert_ver = 0;
6341655663fe166 Jeff Layton 2021-01-27 1735 ret = 0;
6341655663fe166 Jeff Layton 2021-01-27 1736
6341655663fe166 Jeff Layton 2021-01-27 1737 /*
6341655663fe166 Jeff Layton 2021-01-27 1738 * zero out the soon-to-be uncopied parts of the
6341655663fe166 Jeff Layton 2021-01-27 1739 * first and last pages.
6341655663fe166 Jeff Layton 2021-01-27 1740 */
6341655663fe166 Jeff Layton 2021-01-27 1741 if (first)
6341655663fe166 Jeff Layton 2021-01-27 1742 zero_user_segment(pages[0], 0,
6341655663fe166 Jeff Layton 2021-01-27 1743 offset_in_page(first_pos));
6341655663fe166 Jeff Layton 2021-01-27 1744 if (last)
6341655663fe166 Jeff Layton 2021-01-27 1745 zero_user_segment(pages[num_pages - 1],
6341655663fe166 Jeff Layton 2021-01-27 1746 offset_in_page(last_pos),
6341655663fe166 Jeff Layton 2021-01-27 1747 PAGE_SIZE);
6341655663fe166 Jeff Layton 2021-01-27 1748 } else {
6341655663fe166 Jeff Layton 2021-01-27 1749 if (ret < 0) {
6341655663fe166 Jeff Layton 2021-01-27 1750 ceph_osdc_put_request(req);
6341655663fe166 Jeff Layton 2021-01-27 1751 ceph_release_page_vector(pages, num_pages);
6341655663fe166 Jeff Layton 2021-01-27 1752 break;
6341655663fe166 Jeff Layton 2021-01-27 1753 }
6341655663fe166 Jeff Layton 2021-01-27 1754
6341655663fe166 Jeff Layton 2021-01-27 1755 op = &req->r_ops[0];
6341655663fe166 Jeff Layton 2021-01-27 1756 if (op->extent.sparse_ext_cnt == 0) {
6341655663fe166 Jeff Layton 2021-01-27 1757 if (first)
6341655663fe166 Jeff Layton 2021-01-27 1758 zero_user_segment(pages[0], 0,
6341655663fe166 Jeff Layton 2021-01-27 1759 offset_in_page(first_pos));
6341655663fe166 Jeff Layton 2021-01-27 1760 else
6341655663fe166 Jeff Layton 2021-01-27 1761 zero_user_segment(pages[num_pages - 1],
6341655663fe166 Jeff Layton 2021-01-27 1762 offset_in_page(last_pos),
6341655663fe166 Jeff Layton 2021-01-27 1763 PAGE_SIZE);
6341655663fe166 Jeff Layton 2021-01-27 1764 } else if (op->extent.sparse_ext_cnt != 1 ||
6341655663fe166 Jeff Layton 2021-01-27 1765 ceph_sparse_ext_map_end(op) !=
6341655663fe166 Jeff Layton 2021-01-27 1766 CEPH_FSCRYPT_BLOCK_SIZE) {
6341655663fe166 Jeff Layton 2021-01-27 1767 ret = -EIO;
6341655663fe166 Jeff Layton 2021-01-27 1768 ceph_osdc_put_request(req);
6341655663fe166 Jeff Layton 2021-01-27 1769 ceph_release_page_vector(pages, num_pages);
6341655663fe166 Jeff Layton 2021-01-27 1770 break;
6341655663fe166 Jeff Layton 2021-01-27 1771 }
6341655663fe166 Jeff Layton 2021-01-27 1772
6341655663fe166 Jeff Layton 2021-01-27 1773 if (first && last) {
6341655663fe166 Jeff Layton 2021-01-27 1774 op = &req->r_ops[1];
6341655663fe166 Jeff Layton 2021-01-27 1775 if (op->extent.sparse_ext_cnt == 0) {
6341655663fe166 Jeff Layton 2021-01-27 1776 zero_user_segment(pages[num_pages - 1],
6341655663fe166 Jeff Layton 2021-01-27 1777 offset_in_page(last_pos),
6341655663fe166 Jeff Layton 2021-01-27 1778 PAGE_SIZE);
6341655663fe166 Jeff Layton 2021-01-27 1779 } else if (op->extent.sparse_ext_cnt != 1 ||
6341655663fe166 Jeff Layton 2021-01-27 1780 ceph_sparse_ext_map_end(op) !=
6341655663fe166 Jeff Layton 2021-01-27 1781 CEPH_FSCRYPT_BLOCK_SIZE) {
6341655663fe166 Jeff Layton 2021-01-27 1782 ret = -EIO;
6341655663fe166 Jeff Layton 2021-01-27 1783 ceph_osdc_put_request(req);
6341655663fe166 Jeff Layton 2021-01-27 1784 ceph_release_page_vector(pages, num_pages);
6341655663fe166 Jeff Layton 2021-01-27 1785 break;
6341655663fe166 Jeff Layton 2021-01-27 1786 }
6341655663fe166 Jeff Layton 2021-01-27 1787 }
6341655663fe166 Jeff Layton 2021-01-27 1788
6341655663fe166 Jeff Layton 2021-01-27 1789 /* Grab assert version. It must be non-zero. */
6341655663fe166 Jeff Layton 2021-01-27 1790 assert_ver = req->r_version;
6341655663fe166 Jeff Layton 2021-01-27 1791 WARN_ON_ONCE(ret > 0 && assert_ver == 0);
6341655663fe166 Jeff Layton 2021-01-27 1792
6341655663fe166 Jeff Layton 2021-01-27 1793 ceph_osdc_put_request(req);
6341655663fe166 Jeff Layton 2021-01-27 1794 if (first) {
6341655663fe166 Jeff Layton 2021-01-27 1795 ret = ceph_fscrypt_decrypt_block_inplace(inode,
6341655663fe166 Jeff Layton 2021-01-27 1796 pages[0],
6341655663fe166 Jeff Layton 2021-01-27 1797 CEPH_FSCRYPT_BLOCK_SIZE,
6341655663fe166 Jeff Layton 2021-01-27 1798 offset_in_page(first_pos),
6341655663fe166 Jeff Layton 2021-01-27 1799 first_pos >> CEPH_FSCRYPT_BLOCK_SHIFT);
6341655663fe166 Jeff Layton 2021-01-27 1800 if (ret < 0) {
6341655663fe166 Jeff Layton 2021-01-27 1801 ceph_release_page_vector(pages, num_pages);
6341655663fe166 Jeff Layton 2021-01-27 1802 break;
6341655663fe166 Jeff Layton 2021-01-27 1803 }
6341655663fe166 Jeff Layton 2021-01-27 1804 }
6341655663fe166 Jeff Layton 2021-01-27 1805 if (last) {
6341655663fe166 Jeff Layton 2021-01-27 1806 ret = ceph_fscrypt_decrypt_block_inplace(inode,
6341655663fe166 Jeff Layton 2021-01-27 1807 pages[num_pages - 1],
6341655663fe166 Jeff Layton 2021-01-27 1808 CEPH_FSCRYPT_BLOCK_SIZE,
6341655663fe166 Jeff Layton 2021-01-27 1809 offset_in_page(last_pos),
6341655663fe166 Jeff Layton 2021-01-27 1810 last_pos >> CEPH_FSCRYPT_BLOCK_SHIFT);
6341655663fe166 Jeff Layton 2021-01-27 1811 if (ret < 0) {
6341655663fe166 Jeff Layton 2021-01-27 1812 ceph_release_page_vector(pages, num_pages);
6341655663fe166 Jeff Layton 2021-01-27 1813 break;
6341655663fe166 Jeff Layton 2021-01-27 1814 }
6341655663fe166 Jeff Layton 2021-01-27 1815 }
6341655663fe166 Jeff Layton 2021-01-27 1816 }
124e68e74099090 Sage Weil 2009-10-06 1817 }
e8344e668915a74 majianpeng 2013-09-12 1818
e8344e668915a74 majianpeng 2013-09-12 1819 left = len;
54f371cad7e715f Jeff Layton 2021-01-25 1820 off = offset_in_page(pos);
e8344e668915a74 majianpeng 2013-09-12 1821 for (n = 0; n < num_pages; n++) {
54f371cad7e715f Jeff Layton 2021-01-25 1822 size_t plen = min_t(size_t, left, PAGE_SIZE - off);
54f371cad7e715f Jeff Layton 2021-01-25 1823
6341655663fe166 Jeff Layton 2021-01-27 1824 /* copy the data */
54f371cad7e715f Jeff Layton 2021-01-25 1825 ret = copy_page_from_iter(pages[n], off, plen, from);
e8344e668915a74 majianpeng 2013-09-12 1826 if (ret != plen) {
e8344e668915a74 majianpeng 2013-09-12 1827 ret = -EFAULT;
e8344e668915a74 majianpeng 2013-09-12 1828 break;
e8344e668915a74 majianpeng 2013-09-12 1829 }
6341655663fe166 Jeff Layton 2021-01-27 1830 off = 0;
e8344e668915a74 majianpeng 2013-09-12 1831 left -= ret;
e8344e668915a74 majianpeng 2013-09-12 1832 }
6341655663fe166 Jeff Layton 2021-01-27 1833 if (ret < 0) {
6341655663fe166 Jeff Layton 2021-01-27 1834 dout("sync_write write failed with %d\n", ret);
6341655663fe166 Jeff Layton 2021-01-27 1835 ceph_release_page_vector(pages, num_pages);
6341655663fe166 Jeff Layton 2021-01-27 1836 break;
6341655663fe166 Jeff Layton 2021-01-27 1837 }
e8344e668915a74 majianpeng 2013-09-12 1838
6341655663fe166 Jeff Layton 2021-01-27 1839 if (IS_ENCRYPTED(inode)) {
6341655663fe166 Jeff Layton 2021-01-27 1840 ret = ceph_fscrypt_encrypt_pages(inode, pages,
6341655663fe166 Jeff Layton 2021-01-27 1841 write_pos, write_len,
6341655663fe166 Jeff Layton 2021-01-27 1842 GFP_KERNEL);
124e68e74099090 Sage Weil 2009-10-06 1843 if (ret < 0) {
6341655663fe166 Jeff Layton 2021-01-27 1844 dout("encryption failed with %d\n", ret);
124e68e74099090 Sage Weil 2009-10-06 1845 ceph_release_page_vector(pages, num_pages);
6341655663fe166 Jeff Layton 2021-01-27 1846 break;
6341655663fe166 Jeff Layton 2021-01-27 1847 }
124e68e74099090 Sage Weil 2009-10-06 1848 }
124e68e74099090 Sage Weil 2009-10-06 1849
6341655663fe166 Jeff Layton 2021-01-27 1850 req = ceph_osdc_new_request(osdc, &ci->i_layout,
6341655663fe166 Jeff Layton 2021-01-27 1851 ci->i_vino, write_pos, &write_len,
6341655663fe166 Jeff Layton 2021-01-27 1852 rmw ? 1 : 0, rmw ? 2 : 1,
6341655663fe166 Jeff Layton 2021-01-27 1853 CEPH_OSD_OP_WRITE,
6341655663fe166 Jeff Layton 2021-01-27 1854 CEPH_OSD_FLAG_WRITE,
6341655663fe166 Jeff Layton 2021-01-27 1855 snapc, ci->i_truncate_seq,
6341655663fe166 Jeff Layton 2021-01-27 1856 ci->i_truncate_size, false);
6341655663fe166 Jeff Layton 2021-01-27 1857 if (IS_ERR(req)) {
6341655663fe166 Jeff Layton 2021-01-27 1858 ret = PTR_ERR(req);
6341655663fe166 Jeff Layton 2021-01-27 1859 ceph_release_page_vector(pages, num_pages);
6341655663fe166 Jeff Layton 2021-01-27 1860 break;
6341655663fe166 Jeff Layton 2021-01-27 1861 }
6341655663fe166 Jeff Layton 2021-01-27 1862
6341655663fe166 Jeff Layton 2021-01-27 1863 dout("sync_write write op %lld~%llu\n", write_pos, write_len);
6341655663fe166 Jeff Layton 2021-01-27 1864 osd_req_op_extent_osd_data_pages(req, rmw ? 1 : 0, pages, write_len,
6341655663fe166 Jeff Layton 2021-01-27 1865 offset_in_page(write_pos), false,
6341655663fe166 Jeff Layton 2021-01-27 1866 true);
26be88087ae8a04 Alex Elder 2013-04-15 1867 req->r_inode = inode;
6341655663fe166 Jeff Layton 2021-01-27 1868 req->r_mtime = mtime;
e8344e668915a74 majianpeng 2013-09-12 1869
6341655663fe166 Jeff Layton 2021-01-27 1870 /* Set up the assertion */
6341655663fe166 Jeff Layton 2021-01-27 1871 if (rmw) {
6341655663fe166 Jeff Layton 2021-01-27 1872 /*
6341655663fe166 Jeff Layton 2021-01-27 1873 * Set up the assertion. If we don't have a version number,
6341655663fe166 Jeff Layton 2021-01-27 1874 * then the object doesn't exist yet. Use an exclusive create
6341655663fe166 Jeff Layton 2021-01-27 1875 * instead of a version assertion in that case.
6341655663fe166 Jeff Layton 2021-01-27 1876 */
6341655663fe166 Jeff Layton 2021-01-27 1877 if (assert_ver) {
6341655663fe166 Jeff Layton 2021-01-27 1878 osd_req_op_init(req, 0, CEPH_OSD_OP_ASSERT_VER, 0);
6341655663fe166 Jeff Layton 2021-01-27 1879 req->r_ops[0].assert_ver.ver = assert_ver;
6341655663fe166 Jeff Layton 2021-01-27 1880 } else {
6341655663fe166 Jeff Layton 2021-01-27 1881 osd_req_op_init(req, 0, CEPH_OSD_OP_CREATE,
6341655663fe166 Jeff Layton 2021-01-27 1882 CEPH_OSD_OP_FLAG_EXCL);
6341655663fe166 Jeff Layton 2021-01-27 1883 }
6341655663fe166 Jeff Layton 2021-01-27 1884 }
124e68e74099090 Sage Weil 2009-10-06 1885
6341655663fe166 Jeff Layton 2021-01-27 1886 ret = ceph_osdc_start_request(osdc, req, false);
26be88087ae8a04 Alex Elder 2013-04-15 1887 if (!ret)
6341655663fe166 Jeff Layton 2021-01-27 1888 ret = ceph_osdc_wait_request(osdc, req);
124e68e74099090 Sage Weil 2009-10-06 1889
8ae99ae2b40766a Xiubo Li 2021-03-22 1890 ceph_update_write_metrics(&fsc->mdsc->metric, req->r_start_latency,
903f4fec78dd05a Xiubo Li 2021-05-13 1891 req->r_end_latency, len, ret);
124e68e74099090 Sage Weil 2009-10-06 1892 ceph_osdc_put_request(req);
26544c623e741ac Jeff Layton 2017-04-04 1893 if (ret != 0) {
6341655663fe166 Jeff Layton 2021-01-27 1894 dout("sync_write osd write returned %d\n", ret);
6341655663fe166 Jeff Layton 2021-01-27 1895 /* Version changed! Must re-do the rmw cycle */
6341655663fe166 Jeff Layton 2021-01-27 @1896 if ((assert_ver && (ret == -ERANGE || ret == -EOVERFLOW)) ||
How do we know "rmw" is true at this point?
6341655663fe166 Jeff Layton 2021-01-27 1897 (!assert_ver && ret == -EEXIST)) {
6341655663fe166 Jeff Layton 2021-01-27 1898 /* We should only ever see this on a rmw */
6341655663fe166 Jeff Layton 2021-01-27 1899 WARN_ON_ONCE(!rmw);
Although this WARN_ON() suggests that it *is* true...
6341655663fe166 Jeff Layton 2021-01-27 1900
6341655663fe166 Jeff Layton 2021-01-27 1901 /* The version should never go backward */
6341655663fe166 Jeff Layton 2021-01-27 1902 WARN_ON_ONCE(ret == -EOVERFLOW);
6341655663fe166 Jeff Layton 2021-01-27 1903
6341655663fe166 Jeff Layton 2021-01-27 1904 *from = saved_iter;
6341655663fe166 Jeff Layton 2021-01-27 1905
6341655663fe166 Jeff Layton 2021-01-27 1906 /* FIXME: limit number of times we loop? */
6341655663fe166 Jeff Layton 2021-01-27 1907 continue;
6341655663fe166 Jeff Layton 2021-01-27 1908 }
26544c623e741ac Jeff Layton 2017-04-04 1909 ceph_set_error_write(ci);
26544c623e741ac Jeff Layton 2017-04-04 1910 break;
26544c623e741ac Jeff Layton 2017-04-04 1911 }
26544c623e741ac Jeff Layton 2017-04-04 1912 ceph_clear_error_write(ci);
124e68e74099090 Sage Weil 2009-10-06 1913 pos += len;
124e68e74099090 Sage Weil 2009-10-06 1914 written += len;
6341655663fe166 Jeff Layton 2021-01-27 1915 dout("sync_write written %d\n", written);
e8344e668915a74 majianpeng 2013-09-12 1916 if (pos > i_size_read(inode)) {
124e68e74099090 Sage Weil 2009-10-06 1917 check_caps = ceph_inode_set_size(inode, pos);
124e68e74099090 Sage Weil 2009-10-06 1918 if (check_caps)
e8344e668915a74 majianpeng 2013-09-12 1919 ceph_check_caps(ceph_inode(inode),
e8344e668915a74 majianpeng 2013-09-12 1920 CHECK_CAPS_AUTHONLY,
124e68e74099090 Sage Weil 2009-10-06 1921 NULL);
e8344e668915a74 majianpeng 2013-09-12 1922 }
26544c623e741ac Jeff Layton 2017-04-04 1923
e8344e668915a74 majianpeng 2013-09-12 1924 }
e8344e668915a74 majianpeng 2013-09-12 1925
e8344e668915a74 majianpeng 2013-09-12 1926 if (ret != -EOLDSNAPC && written > 0) {
ee7289bfadda5f4 majianpeng 2013-08-21 1927 ret = written;
e8344e668915a74 majianpeng 2013-09-12 1928 iocb->ki_pos = pos;
124e68e74099090 Sage Weil 2009-10-06 1929 }
6341655663fe166 Jeff Layton 2021-01-27 1930 dout("sync_write returning %d\n", ret);
124e68e74099090 Sage Weil 2009-10-06 1931 return ret;
124e68e74099090 Sage Weil 2009-10-06 1932 }
--
0-DAY CI Kernel Test Service
https://01.org/lkp
next reply other threads:[~2022-05-24 18:39 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-05-24 16:24 kernel test robot [this message]
2022-05-24 18:39 ` [ceph-client:wip-fscrypt 53/64] fs/ceph/file.c:1896 ceph_sync_write() error: uninitialized symbol 'assert_ver' Dan Carpenter
2022-05-24 18:39 ` Dan Carpenter
2022-05-25 16:49 ` Jeff Layton
2022-05-25 16:49 ` Jeff Layton
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=202205250038.pULlmpTX-lkp@intel.com \
--to=dan.carpenter@oracle.com \
--cc=ceph-devel@vger.kernel.org \
--cc=jlayton@kernel.org \
--cc=kbuild-all@lists.01.org \
--cc=kbuild@lists.01.org \
--cc=lkp@intel.com \
--cc=xiubli@redhat.com \
/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.