lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [day] [month] [year] [list]
Message-ID: <202108122336.Mr6f0gLF-lkp@intel.com>
Date:   Thu, 12 Aug 2021 23:17:37 +0800
From:   kernel test robot <lkp@...el.com>
To:     David Howells <dhowells@...hat.com>
Cc:     kbuild-all@...ts.01.org, linux-kernel@...r.kernel.org
Subject: [dhowells-fs:netfs-folio 3/3] fs/ceph/addr.c:553:2: warning:
 #warning ^^^ which page?

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs.git netfs-folio
head:   bd62d82fbd1b69357ba3c0d8dffc62fd861f6d3e
commit: bd62d82fbd1b69357ba3c0d8dffc62fd861f6d3e [3/3] ceph: Use folios
config: arm-randconfig-s031-20210812 (attached as .config)
compiler: arm-linux-gnueabi-gcc (GCC) 10.3.0
reproduce:
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # apt-get install sparse
        # sparse version: v0.6.3-348-gf0e6938b-dirty
        # https://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs.git/commit/?id=bd62d82fbd1b69357ba3c0d8dffc62fd861f6d3e
        git remote add dhowells-fs https://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs.git
        git fetch --no-tags dhowells-fs netfs-folio
        git checkout bd62d82fbd1b69357ba3c0d8dffc62fd861f6d3e
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-10.3.0 make.cross C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' ARCH=arm 

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

All warnings (new ones prefixed by >>):

   fs/ceph/addr.c: In function 'writepage_nounlock':
>> fs/ceph/addr.c:553:2: warning: #warning ^^^ which page? [-Wcpp]
     553 | #warning ^^^ which page?
         |  ^~~~~~~
   fs/ceph/addr.c: In function 'writepages_finish':
>> fs/ceph/addr.c:674:2: warning: #warning ^^^ page or folio? [-Wcpp]
     674 | #warning ^^^ page or folio?
         |  ^~~~~~~
   fs/ceph/addr.c: In function 'ceph_writepages_start':
   fs/ceph/addr.c:813:4: error: 'page' undeclared (first use in this function)
     813 |    page = pvec.pages[i];
         |    ^~~~
   fs/ceph/addr.c:813:4: note: each undeclared identifier is reported only once for each function it appears in
   In file included from fs/ceph/addr.c:2:
   fs/ceph/addr.c:814:46: error: passing argument 1 of 'folio_index' from incompatible pointer type [-Werror=incompatible-pointer-types]
     814 |    dout("? %p idx %lu\n", folio, folio_index(folio));
         |                                              ^~~~~
         |                                              |
         |                                              struct page *
   include/linux/ceph/ceph_debug.h:26:29: note: in definition of macro 'dout'
      26 |    printk(KERN_DEBUG fmt, ##__VA_ARGS__); \
         |                             ^~~~~~~~~~~
   In file included from fs/ceph/addr.c:7:
   include/linux/pagemap.h:457:49: note: expected 'struct folio *' but argument is of type 'struct page *'
     457 | static inline pgoff_t folio_index(struct folio *folio)
         |                                   ~~~~~~~~~~~~~~^~~~~
   fs/ceph/addr.c:816:16: error: passing argument 1 of 'folio_lock' from incompatible pointer type [-Werror=incompatible-pointer-types]
     816 |     folio_lock(folio);  /* first page */
         |                ^~~~~
         |                |
         |                struct page *
   In file included from fs/ceph/addr.c:7:
   include/linux/pagemap.h:700:45: note: expected 'struct folio *' but argument is of type 'struct page *'
     700 | static inline void folio_lock(struct folio *folio)
         |                               ~~~~~~~~~~~~~~^~~~~
   fs/ceph/addr.c:817:28: error: passing argument 1 of 'folio_trylock' from incompatible pointer type [-Werror=incompatible-pointer-types]
     817 |    else if (!folio_trylock(folio))
         |                            ^~~~~
         |                            |
         |                            struct page *
   In file included from fs/ceph/addr.c:7:
   include/linux/pagemap.h:687:48: note: expected 'struct folio *' but argument is of type 'struct page *'
     687 | static inline bool folio_trylock(struct folio *folio)
         |                                  ~~~~~~~~~~~~~~^~~~~
   In file included from include/linux/string.h:5,
                    from include/linux/ceph/ceph_debug.h:7,
                    from fs/ceph/addr.c:2:
   fs/ceph/addr.c:821:35: error: passing argument 1 of 'folio_test_dirty' from incompatible pointer type [-Werror=incompatible-pointer-types]
     821 |    if (unlikely(!folio_test_dirty(folio)) ||
         |                                   ^~~~~
         |                                   |
         |                                   struct page *
   include/linux/compiler.h:33:34: note: in definition of macro '__branch_check__'
      33 |    ______r = __builtin_expect(!!(x), expect); \
         |                                  ^
   fs/ceph/addr.c:821:8: note: in expansion of macro 'unlikely'
     821 |    if (unlikely(!folio_test_dirty(folio)) ||
         |        ^~~~~~~~
   In file included from include/linux/mmzone.h:22,
                    from include/linux/gfp.h:6,
                    from include/linux/xarray.h:14,
                    from include/linux/radix-tree.h:19,
                    from include/linux/fs.h:15,
                    from include/linux/backing-dev.h:13,
                    from fs/ceph/addr.c:4:
   include/linux/page-flags.h:313:62: note: expected 'struct folio *' but argument is of type 'struct page *'
     313 | static __always_inline bool folio_test_##lname(struct folio *folio) \
         |                                                ~~~~~~~~~~~~~~^~~~~
   include/linux/page-flags.h:361:2: note: in expansion of macro 'TESTPAGEFLAG'
     361 |  TESTPAGEFLAG(uname, lname, policy)    \
         |  ^~~~~~~~~~~~
   include/linux/page-flags.h:412:1: note: in expansion of macro 'PAGEFLAG'
     412 | PAGEFLAG(Dirty, dirty, PF_HEAD) TESTSCFLAG(Dirty, dirty, PF_HEAD)
         | ^~~~~~~~
   In file included from include/linux/string.h:5,
                    from include/linux/ceph/ceph_debug.h:7,
                    from fs/ceph/addr.c:2:
   fs/ceph/addr.c:821:35: error: passing argument 1 of 'folio_test_dirty' from incompatible pointer type [-Werror=incompatible-pointer-types]
     821 |    if (unlikely(!folio_test_dirty(folio)) ||
         |                                   ^~~~~
         |                                   |
         |                                   struct page *
   include/linux/compiler.h:35:19: note: in definition of macro '__branch_check__'
      35 |           expect, is_constant); \
         |                   ^~~~~~~~~~~
   fs/ceph/addr.c:821:8: note: in expansion of macro 'unlikely'
     821 |    if (unlikely(!folio_test_dirty(folio)) ||
         |        ^~~~~~~~
   In file included from include/linux/mmzone.h:22,
                    from include/linux/gfp.h:6,
                    from include/linux/xarray.h:14,
                    from include/linux/radix-tree.h:19,
                    from include/linux/fs.h:15,
                    from include/linux/backing-dev.h:13,
                    from fs/ceph/addr.c:4:
   include/linux/page-flags.h:313:62: note: expected 'struct folio *' but argument is of type 'struct page *'
     313 | static __always_inline bool folio_test_##lname(struct folio *folio) \
         |                                                ~~~~~~~~~~~~~~^~~~~
   include/linux/page-flags.h:361:2: note: in expansion of macro 'TESTPAGEFLAG'
     361 |  TESTPAGEFLAG(uname, lname, policy)    \
         |  ^~~~~~~~~~~~
   include/linux/page-flags.h:412:1: note: in expansion of macro 'PAGEFLAG'
     412 | PAGEFLAG(Dirty, dirty, PF_HEAD) TESTSCFLAG(Dirty, dirty, PF_HEAD)
         | ^~~~~~~~
   In file included from include/linux/string.h:5,
                    from include/linux/ceph/ceph_debug.h:7,


vim +553 fs/ceph/addr.c

   481	
   482	/*
   483	 * Write a single folio, but leave the folio locked.
   484	 *
   485	 * If we get a write error, mark the mapping for error, but still adjust the
   486	 * dirty folio accounting (i.e., folio is no longer dirty).
   487	 */
   488	static int writepage_nounlock(struct folio *folio, struct writeback_control *wbc)
   489	{
   490		struct inode *inode = folio_mapping(folio)->host;
   491		struct ceph_inode_info *ci = ceph_inode(inode);
   492		struct ceph_fs_client *fsc = ceph_inode_to_client(inode);
   493		struct ceph_snap_context *snapc, *oldest;
   494		loff_t page_pos = folio_file_pos(folio);
   495		int err;
   496		loff_t len = folio_size(folio);
   497		struct ceph_writeback_ctl ceph_wbc;
   498		struct ceph_osd_client *osdc = &fsc->client->osdc;
   499		struct ceph_osd_request *req;
   500		struct page *pages[1];
   501	
   502		dout("writepage %p idx %lu\n", folio, folio_index(folio));
   503	
   504		/* verify this is a writeable snap context */
   505		snapc = folio_snap_context(folio);
   506		if (!snapc) {
   507			dout("writepage %p folio %p not dirty?\n", inode, folio);
   508			return 0;
   509		}
   510		oldest = get_oldest_context(inode, &ceph_wbc, snapc);
   511		if (snapc->seq > oldest->seq) {
   512			dout("writepage %p folio %p snapc %p not writeable - noop\n",
   513			     inode, folio, snapc);
   514			/* we should only noop if called by kswapd */
   515			WARN_ON(!(current->flags & PF_MEMALLOC));
   516			ceph_put_snap_context(oldest);
   517			folio_redirty_for_writepage(wbc, folio);
   518			return 0;
   519		}
   520		ceph_put_snap_context(oldest);
   521	
   522		/* is this a partial page at end of file? */
   523		if (page_pos >= ceph_wbc.i_size) {
   524			dout("%p folio eof %llu\n", folio, ceph_wbc.i_size);
   525			folio_mapping(folio)->a_ops->invalidatepage(&folio->page, 0, folio_size(folio));
   526			return 0;
   527		}
   528	
   529		if (ceph_wbc.i_size < page_pos + len)
   530			len = ceph_wbc.i_size - page_pos;
   531	
   532		dout("writepage %p folio %p index %lu on %llu~%llu snapc %p seq %lld\n",
   533		     inode, folio, folio_index(folio), page_pos, len, snapc, snapc->seq);
   534	
   535		if (atomic_long_inc_return(&fsc->writeback_count) >
   536		    CONGESTION_ON_THRESH(fsc->mount_options->congestion_kb))
   537			set_bdi_congested(inode_to_bdi(inode), BLK_RW_ASYNC);
   538	
   539		folio_start_writeback(folio);
   540		req = ceph_osdc_new_request(osdc, &ci->i_layout, ceph_vino(inode), page_pos, &len, 0, 1,
   541					    CEPH_OSD_OP_WRITE, CEPH_OSD_FLAG_WRITE, snapc,
   542					    ceph_wbc.truncate_seq, ceph_wbc.truncate_size,
   543					    true);
   544		if (IS_ERR(req)) {
   545			folio_redirty_for_writepage(wbc, folio);
   546			folio_end_writeback(folio);
   547			return PTR_ERR(req);
   548		}
   549	
   550		/* it may be a short write due to an object boundary */
   551		WARN_ON_ONCE(len > folio_size(folio));
   552		pages[0] = &folio->page;
 > 553	#warning ^^^ which page?
   554		osd_req_op_extent_osd_data_pages(req, 0, pages, len, 0, false, false);
   555		dout("writepage %llu~%llu (%llu bytes)\n", page_pos, len, len);
   556	
   557		req->r_mtime = inode->i_mtime;
   558		err = ceph_osdc_start_request(osdc, req, true);
   559		if (!err)
   560			err = ceph_osdc_wait_request(osdc, req);
   561	
   562		ceph_update_write_metrics(&fsc->mdsc->metric, req->r_start_latency,
   563					  req->r_end_latency, len, err);
   564	
   565		ceph_osdc_put_request(req);
   566		if (err == 0)
   567			err = len;
   568	
   569		if (err < 0) {
   570			struct writeback_control tmp_wbc;
   571			if (!wbc)
   572				wbc = &tmp_wbc;
   573			if (err == -ERESTARTSYS) {
   574				/* killed by SIGKILL */
   575				dout("writepage interrupted folio %p\n", folio);
   576				folio_redirty_for_writepage(wbc, folio);
   577				folio_end_writeback(folio);
   578				return err;
   579			}
   580			if (err == -EBLOCKLISTED)
   581				fsc->blocklisted = true;
   582			dout("writepage setting folio/mapping error %d %p\n",
   583			     err, folio);
   584			mapping_set_error(&inode->i_data, err);
   585			wbc->pages_skipped += folio_nr_pages(folio);
   586		} else {
   587			dout("writepage cleaned folio %p\n", folio);
   588			err = 0;  /* vfs expects us to return 0 */
   589		}
   590		oldest = folio_detach_private(folio);
   591		WARN_ON_ONCE(oldest != snapc);
   592		folio_end_writeback(folio);
   593		ceph_put_wrbuffer_cap_refs(ci, 1, snapc);
   594		ceph_put_snap_context(snapc);  /* folios's reference */
   595	
   596		if (atomic_long_dec_return(&fsc->writeback_count) <
   597		    CONGESTION_OFF_THRESH(fsc->mount_options->congestion_kb))
   598			clear_bdi_congested(inode_to_bdi(inode), BLK_RW_ASYNC);
   599	
   600		return err;
   601	}
   602	
   603	static int ceph_writepage(struct page *subpage, struct writeback_control *wbc)
   604	{
   605		struct folio *folio = page_folio(subpage);
   606		int err;
   607		struct inode *inode = folio_mapping(folio)->host;
   608		BUG_ON(!inode);
   609		ihold(inode);
   610		err = writepage_nounlock(folio, wbc);
   611		if (err == -ERESTARTSYS) {
   612			/* direct memory reclaimer was killed by SIGKILL. return 0
   613			 * to prevent caller from setting mapping/page error */
   614			err = 0;
   615		}
   616		folio_unlock(folio);
   617		iput(inode);
   618		return err;
   619	}
   620	
   621	/*
   622	 * async writeback completion handler.
   623	 *
   624	 * If we get an error, set the mapping error bit, but not the individual
   625	 * page error bits.
   626	 */
   627	static void writepages_finish(struct ceph_osd_request *req)
   628	{
   629		struct inode *inode = req->r_inode;
   630		struct ceph_inode_info *ci = ceph_inode(inode);
   631		struct ceph_osd_data *osd_data;
   632		struct folio *folio;
   633		int num_pages, total_pages = 0;
   634		int i, j;
   635		int rc = req->r_result;
   636		struct ceph_snap_context *snapc = req->r_snapc;
   637		struct address_space *mapping = inode->i_mapping;
   638		struct ceph_fs_client *fsc = ceph_inode_to_client(inode);
   639		unsigned int len = 0;
   640		bool remove_page;
   641	
   642		dout("writepages_finish %p rc %d\n", inode, rc);
   643		if (rc < 0) {
   644			mapping_set_error(mapping, rc);
   645			ceph_set_error_write(ci);
   646			if (rc == -EBLOCKLISTED)
   647				fsc->blocklisted = true;
   648		} else {
   649			ceph_clear_error_write(ci);
   650		}
   651	
   652		/*
   653		 * We lost the cache cap, need to truncate the page before
   654		 * it is unlocked, otherwise we'd truncate it later in the
   655		 * page truncation thread, possibly losing some data that
   656		 * raced its way in
   657		 */
   658		remove_page = !(ceph_caps_issued(ci) &
   659				(CEPH_CAP_FILE_CACHE|CEPH_CAP_FILE_LAZYIO));
   660	
   661		/* clean all pages */
   662		for (i = 0; i < req->r_num_ops; i++) {
   663			if (req->r_ops[i].op != CEPH_OSD_OP_WRITE)
   664				break;
   665	
   666			osd_data = osd_req_op_extent_osd_data(req, i);
   667			BUG_ON(osd_data->type != CEPH_OSD_DATA_TYPE_PAGES);
   668			len += osd_data->length;
   669			num_pages = calc_pages_for((u64)osd_data->alignment,
   670						   (u64)osd_data->length);
   671			total_pages += num_pages;
   672			for (j = 0; j < num_pages; j++) {
   673				folio = page_folio(osd_data->pages[j]);
 > 674	#warning ^^^ page or folio?
   675				BUG_ON(!folio);
   676				WARN_ON(!folio_test_uptodate(folio));
   677	
   678				if (atomic_long_dec_return(&fsc->writeback_count) <
   679				     CONGESTION_OFF_THRESH(
   680						fsc->mount_options->congestion_kb))
   681					clear_bdi_congested(inode_to_bdi(inode),
   682							    BLK_RW_ASYNC);
   683	
   684				ceph_put_snap_context(folio_detach_private(folio));
   685				folio_end_writeback(folio);
   686				dout("unlocking %p\n", folio);
   687	
   688				if (remove_page)
   689					generic_error_remove_page(inode->i_mapping,
   690								  &folio->page);
   691	
   692				folio_unlock(folio);
   693			}
   694			dout("writepages_finish %p wrote %llu bytes cleaned %d pages\n",
   695			     inode, osd_data->length, rc >= 0 ? num_pages : 0);
   696	
   697			release_pages(osd_data->pages, num_pages);
   698		}
   699	
   700		ceph_update_write_metrics(&fsc->mdsc->metric, req->r_start_latency,
   701					  req->r_end_latency, len, rc);
   702	
   703		ceph_put_wrbuffer_cap_refs(ci, total_pages, snapc);
   704	
   705		osd_data = osd_req_op_extent_osd_data(req, 0);
   706		if (osd_data->pages_from_pool)
   707			mempool_free(osd_data->pages, ceph_wb_pagevec_pool);
   708		else
   709			kfree(osd_data->pages);
   710		ceph_osdc_put_request(req);
   711	}
   712	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org

Download attachment ".config.gz" of type "application/gzip" (36719 bytes)

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ