All of lore.kernel.org
 help / color / mirror / Atom feed
From: kernel test robot <lkp@intel.com>
To: Jeff Layton <jlayton@kernel.org>
Cc: llvm@lists.linux.dev, kbuild-all@lists.01.org,
	linux-kernel@vger.kernel.org
Subject: [jlayton:ceph-fscrypt-content 50/51] fs/ceph/file.c:1712:20: error: too many arguments to function call, expected 4, have 5
Date: Fri, 10 Dec 2021 16:01:22 +0800	[thread overview]
Message-ID: <202112101520.wAUVIMOO-lkp@intel.com> (raw)

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: riscv-randconfig-r014-20211210 (https://download.01.org/0day-ci/archive/20211210/202112101520.wAUVIMOO-lkp@intel.com/config)
compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project 097a1cb1d5ebb3a0ec4bcaed8ba3ff6a8e33c00a)
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
        # install riscv cross compiling tool for clang build
        # apt-get install binutils-riscv64-linux-gnu
        # 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=clang make.cross W=1 O=build_dir ARCH=riscv SHELL=/bin/bash drivers/nvme/host/ fs/ceph/

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

   In file included from fs/ceph/file.c:11:
   In file included from include/linux/writeback.h:13:
   In file included from include/linux/blk_types.h:10:
   In file included from include/linux/bvec.h:10:
   In file included from include/linux/highmem.h:11:
   In file included from include/linux/hardirq.h:11:
   In file included from ./arch/riscv/include/generated/asm/hardirq.h:1:
   In file included from include/asm-generic/hardirq.h:17:
   In file included from include/linux/irq.h:20:
   In file included from include/linux/io.h:13:
   In file included from arch/riscv/include/asm/io.h:136:
   include/asm-generic/io.h:464:31: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
           val = __raw_readb(PCI_IOBASE + addr);
                             ~~~~~~~~~~ ^
   include/asm-generic/io.h:477:61: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
           val = __le16_to_cpu((__le16 __force)__raw_readw(PCI_IOBASE + addr));
                                                           ~~~~~~~~~~ ^
   include/uapi/linux/byteorder/little_endian.h:36:51: note: expanded from macro '__le16_to_cpu'
   #define __le16_to_cpu(x) ((__force __u16)(__le16)(x))
                                                     ^
   In file included from fs/ceph/file.c:11:
   In file included from include/linux/writeback.h:13:
   In file included from include/linux/blk_types.h:10:
   In file included from include/linux/bvec.h:10:
   In file included from include/linux/highmem.h:11:
   In file included from include/linux/hardirq.h:11:
   In file included from ./arch/riscv/include/generated/asm/hardirq.h:1:
   In file included from include/asm-generic/hardirq.h:17:
   In file included from include/linux/irq.h:20:
   In file included from include/linux/io.h:13:
   In file included from arch/riscv/include/asm/io.h:136:
   include/asm-generic/io.h:490:61: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
           val = __le32_to_cpu((__le32 __force)__raw_readl(PCI_IOBASE + addr));
                                                           ~~~~~~~~~~ ^
   include/uapi/linux/byteorder/little_endian.h:34:51: note: expanded from macro '__le32_to_cpu'
   #define __le32_to_cpu(x) ((__force __u32)(__le32)(x))
                                                     ^
   In file included from fs/ceph/file.c:11:
   In file included from include/linux/writeback.h:13:
   In file included from include/linux/blk_types.h:10:
   In file included from include/linux/bvec.h:10:
   In file included from include/linux/highmem.h:11:
   In file included from include/linux/hardirq.h:11:
   In file included from ./arch/riscv/include/generated/asm/hardirq.h:1:
   In file included from include/asm-generic/hardirq.h:17:
   In file included from include/linux/irq.h:20:
   In file included from include/linux/io.h:13:
   In file included from arch/riscv/include/asm/io.h:136:
   include/asm-generic/io.h:501:33: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
           __raw_writeb(value, PCI_IOBASE + addr);
                               ~~~~~~~~~~ ^
   include/asm-generic/io.h:511:59: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
           __raw_writew((u16 __force)cpu_to_le16(value), PCI_IOBASE + addr);
                                                         ~~~~~~~~~~ ^
   include/asm-generic/io.h:521:59: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
           __raw_writel((u32 __force)cpu_to_le32(value), PCI_IOBASE + addr);
                                                         ~~~~~~~~~~ ^
   include/asm-generic/io.h:1024:55: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
           return (port > MMIO_UPPER_LIMIT) ? NULL : PCI_IOBASE + port;
                                                     ~~~~~~~~~~ ^
>> fs/ceph/file.c:1712:20: error: too many arguments to function call, expected 4, have 5
                                                            write_len, GFP_KERNEL);
                                                                       ^~~~~~~~~~
   include/linux/gfp.h:324:20: note: expanded from macro 'GFP_KERNEL'
   #define GFP_KERNEL      (__GFP_RECLAIM | __GFP_IO | __GFP_FS)
                           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   fs/ceph/crypto.h:213:19: note: 'ceph_fscrypt_encrypt_pages' declared here
   static inline int ceph_fscrypt_encrypt_pages(struct inode *inode, struct page **page,
                     ^
   7 warnings and 1 error generated.


vim +1712 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

WARNING: multiple messages have this Message-ID (diff)
From: kernel test robot <lkp@intel.com>
To: kbuild-all@lists.01.org
Subject: [jlayton:ceph-fscrypt-content 50/51] fs/ceph/file.c:1712:20: error: too many arguments to function call, expected 4, have 5
Date: Fri, 10 Dec 2021 16:01:22 +0800	[thread overview]
Message-ID: <202112101520.wAUVIMOO-lkp@intel.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 17095 bytes --]

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: riscv-randconfig-r014-20211210 (https://download.01.org/0day-ci/archive/20211210/202112101520.wAUVIMOO-lkp(a)intel.com/config)
compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project 097a1cb1d5ebb3a0ec4bcaed8ba3ff6a8e33c00a)
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
        # install riscv cross compiling tool for clang build
        # apt-get install binutils-riscv64-linux-gnu
        # 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=clang make.cross W=1 O=build_dir ARCH=riscv SHELL=/bin/bash drivers/nvme/host/ fs/ceph/

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

   In file included from fs/ceph/file.c:11:
   In file included from include/linux/writeback.h:13:
   In file included from include/linux/blk_types.h:10:
   In file included from include/linux/bvec.h:10:
   In file included from include/linux/highmem.h:11:
   In file included from include/linux/hardirq.h:11:
   In file included from ./arch/riscv/include/generated/asm/hardirq.h:1:
   In file included from include/asm-generic/hardirq.h:17:
   In file included from include/linux/irq.h:20:
   In file included from include/linux/io.h:13:
   In file included from arch/riscv/include/asm/io.h:136:
   include/asm-generic/io.h:464:31: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
           val = __raw_readb(PCI_IOBASE + addr);
                             ~~~~~~~~~~ ^
   include/asm-generic/io.h:477:61: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
           val = __le16_to_cpu((__le16 __force)__raw_readw(PCI_IOBASE + addr));
                                                           ~~~~~~~~~~ ^
   include/uapi/linux/byteorder/little_endian.h:36:51: note: expanded from macro '__le16_to_cpu'
   #define __le16_to_cpu(x) ((__force __u16)(__le16)(x))
                                                     ^
   In file included from fs/ceph/file.c:11:
   In file included from include/linux/writeback.h:13:
   In file included from include/linux/blk_types.h:10:
   In file included from include/linux/bvec.h:10:
   In file included from include/linux/highmem.h:11:
   In file included from include/linux/hardirq.h:11:
   In file included from ./arch/riscv/include/generated/asm/hardirq.h:1:
   In file included from include/asm-generic/hardirq.h:17:
   In file included from include/linux/irq.h:20:
   In file included from include/linux/io.h:13:
   In file included from arch/riscv/include/asm/io.h:136:
   include/asm-generic/io.h:490:61: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
           val = __le32_to_cpu((__le32 __force)__raw_readl(PCI_IOBASE + addr));
                                                           ~~~~~~~~~~ ^
   include/uapi/linux/byteorder/little_endian.h:34:51: note: expanded from macro '__le32_to_cpu'
   #define __le32_to_cpu(x) ((__force __u32)(__le32)(x))
                                                     ^
   In file included from fs/ceph/file.c:11:
   In file included from include/linux/writeback.h:13:
   In file included from include/linux/blk_types.h:10:
   In file included from include/linux/bvec.h:10:
   In file included from include/linux/highmem.h:11:
   In file included from include/linux/hardirq.h:11:
   In file included from ./arch/riscv/include/generated/asm/hardirq.h:1:
   In file included from include/asm-generic/hardirq.h:17:
   In file included from include/linux/irq.h:20:
   In file included from include/linux/io.h:13:
   In file included from arch/riscv/include/asm/io.h:136:
   include/asm-generic/io.h:501:33: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
           __raw_writeb(value, PCI_IOBASE + addr);
                               ~~~~~~~~~~ ^
   include/asm-generic/io.h:511:59: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
           __raw_writew((u16 __force)cpu_to_le16(value), PCI_IOBASE + addr);
                                                         ~~~~~~~~~~ ^
   include/asm-generic/io.h:521:59: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
           __raw_writel((u32 __force)cpu_to_le32(value), PCI_IOBASE + addr);
                                                         ~~~~~~~~~~ ^
   include/asm-generic/io.h:1024:55: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
           return (port > MMIO_UPPER_LIMIT) ? NULL : PCI_IOBASE + port;
                                                     ~~~~~~~~~~ ^
>> fs/ceph/file.c:1712:20: error: too many arguments to function call, expected 4, have 5
                                                            write_len, GFP_KERNEL);
                                                                       ^~~~~~~~~~
   include/linux/gfp.h:324:20: note: expanded from macro 'GFP_KERNEL'
   #define GFP_KERNEL      (__GFP_RECLAIM | __GFP_IO | __GFP_FS)
                           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   fs/ceph/crypto.h:213:19: note: 'ceph_fscrypt_encrypt_pages' declared here
   static inline int ceph_fscrypt_encrypt_pages(struct inode *inode, struct page **page,
                     ^
   7 warnings and 1 error generated.


vim +1712 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(a)lists.01.org

             reply	other threads:[~2021-12-10  8:02 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-12-10  8:01 kernel test robot [this message]
2021-12-10  8:01 ` [jlayton:ceph-fscrypt-content 50/51] fs/ceph/file.c:1712:20: error: too many arguments to function call, expected 4, have 5 kernel test robot

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=202112101520.wAUVIMOO-lkp@intel.com \
    --to=lkp@intel.com \
    --cc=jlayton@kernel.org \
    --cc=kbuild-all@lists.01.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=llvm@lists.linux.dev \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.