diff mbox series

[5/5] ceph: Use a folio in ceph_writepages_start()

Message ID 20241129055058.858940-6-willy@infradead.org
State New
Headers show
Series Remove accesses to page->index from ceph | expand

Commit Message

Matthew Wilcox Nov. 29, 2024, 5:50 a.m. UTC
We currently convert the folio returned from filemap_get_folios_tag()
to a page and operate on that page.  Remove this and operate on the
folio.  Removes a lot of calls to obsolete functions and references
to page->index and page->mapping.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
---
 fs/ceph/addr.c | 55 +++++++++++++++++++++++++-------------------------
 1 file changed, 27 insertions(+), 28 deletions(-)

Comments

kernel test robot Nov. 29, 2024, 3:42 p.m. UTC | #1
Hi Matthew,

kernel test robot noticed the following build warnings:

[auto build test WARNING on linus/master]
[also build test WARNING on next-20241128]
[cannot apply to ceph-client/testing ceph-client/for-linus v6.12]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Matthew-Wilcox-Oracle/ceph-Do-not-look-at-the-index-of-an-encrypted-page/20241129-135252
base:   linus/master
patch link:    https://lore.kernel.org/r/20241129055058.858940-6-willy%40infradead.org
patch subject: [PATCH 5/5] ceph: Use a folio in ceph_writepages_start()
config: x86_64-buildonly-randconfig-002-20241129 (https://download.01.org/0day-ci/archive/20241129/202411292322.iv4hDiEQ-lkp@intel.com/config)
compiler: clang version 19.1.3 (https://github.com/llvm/llvm-project ab51eccf88f5321e7c60591c5546b254b6afab99)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241129/202411292322.iv4hDiEQ-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202411292322.iv4hDiEQ-lkp@intel.com/

All warnings (new ones prefixed by >>):

   In file included from fs/ceph/addr.c:4:
   In file included from include/linux/backing-dev.h:16:
   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:8:
   In file included from include/linux/cacheflush.h:5:
   In file included from arch/x86/include/asm/cacheflush.h:5:
   In file included from include/linux/mm.h:2223:
   include/linux/vmstat.h:504:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
     504 |         return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~ ^
     505 |                            item];
         |                            ~~~~
   include/linux/vmstat.h:511:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
     511 |         return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~ ^
     512 |                            NR_VM_NUMA_EVENT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~~
   include/linux/vmstat.h:518:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
     518 |         return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_"
         |                               ~~~~~~~~~~~ ^ ~~~
>> fs/ceph/addr.c:1178:39: warning: variable 'page' is uninitialized when used here [-Wuninitialized]
    1178 |                                         fscrypt_encrypt_pagecache_blocks(page,
         |                                                                          ^~~~
   fs/ceph/addr.c:1043:20: note: initialize the variable 'page' to silence this warning
    1043 |                 struct page *page;
         |                                  ^
         |                                   = NULL
   4 warnings generated.


vim +/page +1178 fs/ceph/addr.c

1d3576fd10f0d7a Sage Weil               2009-10-06   941  
1d3576fd10f0d7a Sage Weil               2009-10-06   942  /*
1d3576fd10f0d7a Sage Weil               2009-10-06   943   * initiate async writeback
1d3576fd10f0d7a Sage Weil               2009-10-06   944   */
1d3576fd10f0d7a Sage Weil               2009-10-06   945  static int ceph_writepages_start(struct address_space *mapping,
1d3576fd10f0d7a Sage Weil               2009-10-06   946  				 struct writeback_control *wbc)
1d3576fd10f0d7a Sage Weil               2009-10-06   947  {
1d3576fd10f0d7a Sage Weil               2009-10-06   948  	struct inode *inode = mapping->host;
1d3576fd10f0d7a Sage Weil               2009-10-06   949  	struct ceph_inode_info *ci = ceph_inode(inode);
5995d90d2d19f33 Xiubo Li                2023-06-12   950  	struct ceph_fs_client *fsc = ceph_inode_to_fs_client(inode);
38d46409c4639a1 Xiubo Li                2023-06-12   951  	struct ceph_client *cl = fsc->client;
fc2744aa12da718 Yan, Zheng              2013-05-31   952  	struct ceph_vino vino = ceph_vino(inode);
2a2d927e35dd8dc Yan, Zheng              2017-09-01   953  	pgoff_t index, start_index, end = -1;
80e755fedebc8de Sage Weil               2010-03-31   954  	struct ceph_snap_context *snapc = NULL, *last_snapc = NULL, *pgsnapc;
590a2b5f0a9b740 Vishal Moola (Oracle    2023-01-04   955) 	struct folio_batch fbatch;
1d3576fd10f0d7a Sage Weil               2009-10-06   956  	int rc = 0;
93407472a21b82f Fabian Frederick        2017-02-27   957  	unsigned int wsize = i_blocksize(inode);
1d3576fd10f0d7a Sage Weil               2009-10-06   958  	struct ceph_osd_request *req = NULL;
1f934b00e907527 Yan, Zheng              2017-08-30   959  	struct ceph_writeback_ctl ceph_wbc;
590e9d9861f5f21 Yan, Zheng              2017-09-03   960  	bool should_loop, range_whole = false;
af9cc401ce7452f Yan, Zheng              2018-03-04   961  	bool done = false;
1702e79734104d7 Jeff Layton             2021-12-07   962  	bool caching = ceph_is_cache_enabled(inode);
7d41870d65db028 Xiubo Li                2023-03-08   963  	xa_mark_t tag;
1d3576fd10f0d7a Sage Weil               2009-10-06   964  
503d4fa6ee28e8d NeilBrown               2022-03-22   965  	if (wbc->sync_mode == WB_SYNC_NONE &&
503d4fa6ee28e8d NeilBrown               2022-03-22   966  	    fsc->write_congested)
503d4fa6ee28e8d NeilBrown               2022-03-22   967  		return 0;
503d4fa6ee28e8d NeilBrown               2022-03-22   968  
38d46409c4639a1 Xiubo Li                2023-06-12   969  	doutc(cl, "%llx.%llx (mode=%s)\n", ceph_vinop(inode),
1d3576fd10f0d7a Sage Weil               2009-10-06   970  	      wbc->sync_mode == WB_SYNC_NONE ? "NONE" :
1d3576fd10f0d7a Sage Weil               2009-10-06   971  	      (wbc->sync_mode == WB_SYNC_ALL ? "ALL" : "HOLD"));
1d3576fd10f0d7a Sage Weil               2009-10-06   972  
5d6451b1489ad17 Jeff Layton             2021-08-31   973  	if (ceph_inode_is_shutdown(inode)) {
6c93df5db628e71 Yan, Zheng              2016-04-15   974  		if (ci->i_wrbuffer_ref > 0) {
38d46409c4639a1 Xiubo Li                2023-06-12   975  			pr_warn_ratelimited_client(cl,
38d46409c4639a1 Xiubo Li                2023-06-12   976  				"%llx.%llx %lld forced umount\n",
38d46409c4639a1 Xiubo Li                2023-06-12   977  				ceph_vinop(inode), ceph_ino(inode));
6c93df5db628e71 Yan, Zheng              2016-04-15   978  		}
a341d4df87487ae Yan, Zheng              2015-07-01   979  		mapping_set_error(mapping, -EIO);
1d3576fd10f0d7a Sage Weil               2009-10-06   980  		return -EIO; /* we're in a forced umount, don't write! */
1d3576fd10f0d7a Sage Weil               2009-10-06   981  	}
95cca2b44e54b00 Yan, Zheng              2017-07-11   982  	if (fsc->mount_options->wsize < wsize)
3d14c5d2b6e15c2 Yehuda Sadeh            2010-04-06   983  		wsize = fsc->mount_options->wsize;
1d3576fd10f0d7a Sage Weil               2009-10-06   984  
590a2b5f0a9b740 Vishal Moola (Oracle    2023-01-04   985) 	folio_batch_init(&fbatch);
1d3576fd10f0d7a Sage Weil               2009-10-06   986  
590e9d9861f5f21 Yan, Zheng              2017-09-03   987  	start_index = wbc->range_cyclic ? mapping->writeback_index : 0;
590e9d9861f5f21 Yan, Zheng              2017-09-03   988  	index = start_index;
1d3576fd10f0d7a Sage Weil               2009-10-06   989  
7d41870d65db028 Xiubo Li                2023-03-08   990  	if (wbc->sync_mode == WB_SYNC_ALL || wbc->tagged_writepages) {
7d41870d65db028 Xiubo Li                2023-03-08   991  		tag = PAGECACHE_TAG_TOWRITE;
7d41870d65db028 Xiubo Li                2023-03-08   992  	} else {
7d41870d65db028 Xiubo Li                2023-03-08   993  		tag = PAGECACHE_TAG_DIRTY;
7d41870d65db028 Xiubo Li                2023-03-08   994  	}
1d3576fd10f0d7a Sage Weil               2009-10-06   995  retry:
1d3576fd10f0d7a Sage Weil               2009-10-06   996  	/* find oldest snap context with dirty data */
05455e1177f7684 Yan, Zheng              2017-09-02   997  	snapc = get_oldest_context(inode, &ceph_wbc, NULL);
1d3576fd10f0d7a Sage Weil               2009-10-06   998  	if (!snapc) {
1d3576fd10f0d7a Sage Weil               2009-10-06   999  		/* hmm, why does writepages get called when there
1d3576fd10f0d7a Sage Weil               2009-10-06  1000  		   is no dirty data? */
38d46409c4639a1 Xiubo Li                2023-06-12  1001  		doutc(cl, " no snap context with dirty data?\n");
1d3576fd10f0d7a Sage Weil               2009-10-06  1002  		goto out;
1d3576fd10f0d7a Sage Weil               2009-10-06  1003  	}
38d46409c4639a1 Xiubo Li                2023-06-12  1004  	doutc(cl, " oldest snapc is %p seq %lld (%d snaps)\n", snapc,
38d46409c4639a1 Xiubo Li                2023-06-12  1005  	      snapc->seq, snapc->num_snaps);
fc2744aa12da718 Yan, Zheng              2013-05-31  1006  
2a2d927e35dd8dc Yan, Zheng              2017-09-01  1007  	should_loop = false;
2a2d927e35dd8dc Yan, Zheng              2017-09-01  1008  	if (ceph_wbc.head_snapc && snapc != last_snapc) {
2a2d927e35dd8dc Yan, Zheng              2017-09-01  1009  		/* where to start/end? */
2a2d927e35dd8dc Yan, Zheng              2017-09-01  1010  		if (wbc->range_cyclic) {
2a2d927e35dd8dc Yan, Zheng              2017-09-01  1011  			index = start_index;
2a2d927e35dd8dc Yan, Zheng              2017-09-01  1012  			end = -1;
2a2d927e35dd8dc Yan, Zheng              2017-09-01  1013  			if (index > 0)
2a2d927e35dd8dc Yan, Zheng              2017-09-01  1014  				should_loop = true;
38d46409c4639a1 Xiubo Li                2023-06-12  1015  			doutc(cl, " cyclic, start at %lu\n", index);
2a2d927e35dd8dc Yan, Zheng              2017-09-01  1016  		} else {
2a2d927e35dd8dc Yan, Zheng              2017-09-01  1017  			index = wbc->range_start >> PAGE_SHIFT;
2a2d927e35dd8dc Yan, Zheng              2017-09-01  1018  			end = wbc->range_end >> PAGE_SHIFT;
2a2d927e35dd8dc Yan, Zheng              2017-09-01  1019  			if (wbc->range_start == 0 && wbc->range_end == LLONG_MAX)
2a2d927e35dd8dc Yan, Zheng              2017-09-01  1020  				range_whole = true;
38d46409c4639a1 Xiubo Li                2023-06-12  1021  			doutc(cl, " not cyclic, %lu to %lu\n", index, end);
2a2d927e35dd8dc Yan, Zheng              2017-09-01  1022  		}
2a2d927e35dd8dc Yan, Zheng              2017-09-01  1023  	} else if (!ceph_wbc.head_snapc) {
2a2d927e35dd8dc Yan, Zheng              2017-09-01  1024  		/* Do not respect wbc->range_{start,end}. Dirty pages
2a2d927e35dd8dc Yan, Zheng              2017-09-01  1025  		 * in that range can be associated with newer snapc.
2a2d927e35dd8dc Yan, Zheng              2017-09-01  1026  		 * They are not writeable until we write all dirty pages
2a2d927e35dd8dc Yan, Zheng              2017-09-01  1027  		 * associated with 'snapc' get written */
1582af2eaaf17cb Yan, Zheng              2018-03-06  1028  		if (index > 0)
2a2d927e35dd8dc Yan, Zheng              2017-09-01  1029  			should_loop = true;
38d46409c4639a1 Xiubo Li                2023-06-12  1030  		doutc(cl, " non-head snapc, range whole\n");
1d3576fd10f0d7a Sage Weil               2009-10-06  1031  	}
2a2d927e35dd8dc Yan, Zheng              2017-09-01  1032  
7d41870d65db028 Xiubo Li                2023-03-08  1033  	if (wbc->sync_mode == WB_SYNC_ALL || wbc->tagged_writepages)
7d41870d65db028 Xiubo Li                2023-03-08  1034  		tag_pages_for_writeback(mapping, index, end);
7d41870d65db028 Xiubo Li                2023-03-08  1035  
2a2d927e35dd8dc Yan, Zheng              2017-09-01  1036  	ceph_put_snap_context(last_snapc);
1d3576fd10f0d7a Sage Weil               2009-10-06  1037  	last_snapc = snapc;
1d3576fd10f0d7a Sage Weil               2009-10-06  1038  
af9cc401ce7452f Yan, Zheng              2018-03-04  1039  	while (!done && index <= end) {
5b64640cf65be4a Yan, Zheng              2016-01-07  1040  		int num_ops = 0, op_idx;
590a2b5f0a9b740 Vishal Moola (Oracle    2023-01-04  1041) 		unsigned i, nr_folios, max_pages, locked_pages = 0;
5b64640cf65be4a Yan, Zheng              2016-01-07  1042  		struct page **pages = NULL, **data_pages;
1d3576fd10f0d7a Sage Weil               2009-10-06  1043  		struct page *page;
0e5ecac71683665 Yan, Zheng              2017-08-31  1044  		pgoff_t strip_unit_end = 0;
5b64640cf65be4a Yan, Zheng              2016-01-07  1045  		u64 offset = 0, len = 0;
a0102bda5bc0991 Jeff Layton             2020-07-30  1046  		bool from_pool = false;
1d3576fd10f0d7a Sage Weil               2009-10-06  1047  
0e5ecac71683665 Yan, Zheng              2017-08-31  1048  		max_pages = wsize >> PAGE_SHIFT;
1d3576fd10f0d7a Sage Weil               2009-10-06  1049  
1d3576fd10f0d7a Sage Weil               2009-10-06  1050  get_more_pages:
590a2b5f0a9b740 Vishal Moola (Oracle    2023-01-04  1051) 		nr_folios = filemap_get_folios_tag(mapping, &index,
7d41870d65db028 Xiubo Li                2023-03-08  1052  						   end, tag, &fbatch);
38d46409c4639a1 Xiubo Li                2023-06-12  1053  		doutc(cl, "pagevec_lookup_range_tag got %d\n", nr_folios);
590a2b5f0a9b740 Vishal Moola (Oracle    2023-01-04  1054) 		if (!nr_folios && !locked_pages)
1d3576fd10f0d7a Sage Weil               2009-10-06  1055  			break;
590a2b5f0a9b740 Vishal Moola (Oracle    2023-01-04  1056) 		for (i = 0; i < nr_folios && locked_pages < max_pages; i++) {
fd15ba4cb00a43f Matthew Wilcox (Oracle  2024-10-02  1057) 			struct folio *folio = fbatch.folios[i];
fd15ba4cb00a43f Matthew Wilcox (Oracle  2024-10-02  1058) 
a38da1eafb17612 Matthew Wilcox (Oracle  2024-11-29  1059) 			doutc(cl, "? %p idx %lu\n", folio, folio->index);
1d3576fd10f0d7a Sage Weil               2009-10-06  1060  			if (locked_pages == 0)
a38da1eafb17612 Matthew Wilcox (Oracle  2024-11-29  1061) 				folio_lock(folio);  /* first page */
a38da1eafb17612 Matthew Wilcox (Oracle  2024-11-29  1062) 			else if (!folio_trylock(folio))
1d3576fd10f0d7a Sage Weil               2009-10-06  1063  				break;
1d3576fd10f0d7a Sage Weil               2009-10-06  1064  
1d3576fd10f0d7a Sage Weil               2009-10-06  1065  			/* only dirty pages, or our accounting breaks */
a38da1eafb17612 Matthew Wilcox (Oracle  2024-11-29  1066) 			if (unlikely(!folio_test_dirty(folio)) ||
a38da1eafb17612 Matthew Wilcox (Oracle  2024-11-29  1067) 			    unlikely(folio->mapping != mapping)) {
a38da1eafb17612 Matthew Wilcox (Oracle  2024-11-29  1068) 				doutc(cl, "!dirty or !mapping %p\n", folio);
a38da1eafb17612 Matthew Wilcox (Oracle  2024-11-29  1069) 				folio_unlock(folio);
0713e5f24b7deb8 Yan, Zheng              2017-08-31  1070  				continue;
1d3576fd10f0d7a Sage Weil               2009-10-06  1071  			}
af9cc401ce7452f Yan, Zheng              2018-03-04  1072  			/* only if matching snap context */
a38da1eafb17612 Matthew Wilcox (Oracle  2024-11-29  1073) 			pgsnapc = page_snap_context(&folio->page);
af9cc401ce7452f Yan, Zheng              2018-03-04  1074  			if (pgsnapc != snapc) {
38d46409c4639a1 Xiubo Li                2023-06-12  1075  				doutc(cl, "page snapc %p %lld != oldest %p %lld\n",
af9cc401ce7452f Yan, Zheng              2018-03-04  1076  				      pgsnapc, pgsnapc->seq, snapc, snapc->seq);
1582af2eaaf17cb Yan, Zheng              2018-03-06  1077  				if (!should_loop &&
1582af2eaaf17cb Yan, Zheng              2018-03-06  1078  				    !ceph_wbc.head_snapc &&
1582af2eaaf17cb Yan, Zheng              2018-03-06  1079  				    wbc->sync_mode != WB_SYNC_NONE)
1582af2eaaf17cb Yan, Zheng              2018-03-06  1080  					should_loop = true;
a38da1eafb17612 Matthew Wilcox (Oracle  2024-11-29  1081) 				folio_unlock(folio);
af9cc401ce7452f Yan, Zheng              2018-03-04  1082  				continue;
1d3576fd10f0d7a Sage Weil               2009-10-06  1083  			}
a38da1eafb17612 Matthew Wilcox (Oracle  2024-11-29  1084) 			if (folio_pos(folio) >= ceph_wbc.i_size) {
38d46409c4639a1 Xiubo Li                2023-06-12  1085  				doutc(cl, "folio at %lu beyond eof %llu\n",
a628304ebe6ab02 Matthew Wilcox (Oracle  2022-02-09  1086) 				      folio->index, ceph_wbc.i_size);
c95f1c5f436badb Erqi Chen               2019-07-24  1087  				if ((ceph_wbc.size_stable ||
a628304ebe6ab02 Matthew Wilcox (Oracle  2022-02-09  1088) 				    folio_pos(folio) >= i_size_read(inode)) &&
a628304ebe6ab02 Matthew Wilcox (Oracle  2022-02-09  1089) 				    folio_clear_dirty_for_io(folio))
a628304ebe6ab02 Matthew Wilcox (Oracle  2022-02-09  1090) 					folio_invalidate(folio, 0,
a628304ebe6ab02 Matthew Wilcox (Oracle  2022-02-09  1091) 							folio_size(folio));
a628304ebe6ab02 Matthew Wilcox (Oracle  2022-02-09  1092) 				folio_unlock(folio);
af9cc401ce7452f Yan, Zheng              2018-03-04  1093  				continue;
af9cc401ce7452f Yan, Zheng              2018-03-04  1094  			}
a38da1eafb17612 Matthew Wilcox (Oracle  2024-11-29  1095) 			if (strip_unit_end && (folio->index > strip_unit_end)) {
a38da1eafb17612 Matthew Wilcox (Oracle  2024-11-29  1096) 				doutc(cl, "end of strip unit %p\n", folio);
a38da1eafb17612 Matthew Wilcox (Oracle  2024-11-29  1097) 				folio_unlock(folio);
1d3576fd10f0d7a Sage Weil               2009-10-06  1098  				break;
1d3576fd10f0d7a Sage Weil               2009-10-06  1099  			}
fd15ba4cb00a43f Matthew Wilcox (Oracle  2024-10-02  1100) 			if (folio_test_writeback(folio) ||
fd15ba4cb00a43f Matthew Wilcox (Oracle  2024-10-02  1101) 			    folio_test_private_2(folio) /* [DEPRECATED] */) {
0713e5f24b7deb8 Yan, Zheng              2017-08-31  1102  				if (wbc->sync_mode == WB_SYNC_NONE) {
fd15ba4cb00a43f Matthew Wilcox (Oracle  2024-10-02  1103) 					doutc(cl, "%p under writeback\n", folio);
fd15ba4cb00a43f Matthew Wilcox (Oracle  2024-10-02  1104) 					folio_unlock(folio);
0713e5f24b7deb8 Yan, Zheng              2017-08-31  1105  					continue;
0713e5f24b7deb8 Yan, Zheng              2017-08-31  1106  				}
fd15ba4cb00a43f Matthew Wilcox (Oracle  2024-10-02  1107) 				doutc(cl, "waiting on writeback %p\n", folio);
fd15ba4cb00a43f Matthew Wilcox (Oracle  2024-10-02  1108) 				folio_wait_writeback(folio);
fd15ba4cb00a43f Matthew Wilcox (Oracle  2024-10-02  1109) 				folio_wait_private_2(folio); /* [DEPRECATED] */
1d3576fd10f0d7a Sage Weil               2009-10-06  1110  			}
1d3576fd10f0d7a Sage Weil               2009-10-06  1111  
a38da1eafb17612 Matthew Wilcox (Oracle  2024-11-29  1112) 			if (!folio_clear_dirty_for_io(folio)) {
a38da1eafb17612 Matthew Wilcox (Oracle  2024-11-29  1113) 				doutc(cl, "%p !clear_page_dirty_for_io\n", folio);
a38da1eafb17612 Matthew Wilcox (Oracle  2024-11-29  1114) 				folio_unlock(folio);
0713e5f24b7deb8 Yan, Zheng              2017-08-31  1115  				continue;
1d3576fd10f0d7a Sage Weil               2009-10-06  1116  			}
1d3576fd10f0d7a Sage Weil               2009-10-06  1117  
e5975c7c8eb6aea Alex Elder              2013-03-14  1118  			/*
e5975c7c8eb6aea Alex Elder              2013-03-14  1119  			 * We have something to write.  If this is
e5975c7c8eb6aea Alex Elder              2013-03-14  1120  			 * the first locked page this time through,
5b64640cf65be4a Yan, Zheng              2016-01-07  1121  			 * calculate max possinle write size and
5b64640cf65be4a Yan, Zheng              2016-01-07  1122  			 * allocate a page array
e5975c7c8eb6aea Alex Elder              2013-03-14  1123  			 */
1d3576fd10f0d7a Sage Weil               2009-10-06  1124  			if (locked_pages == 0) {
5b64640cf65be4a Yan, Zheng              2016-01-07  1125  				u64 objnum;
5b64640cf65be4a Yan, Zheng              2016-01-07  1126  				u64 objoff;
dccbf08005df800 Ilya Dryomov            2018-02-17  1127  				u32 xlen;
5b64640cf65be4a Yan, Zheng              2016-01-07  1128  
1d3576fd10f0d7a Sage Weil               2009-10-06  1129  				/* prepare async write request */
a38da1eafb17612 Matthew Wilcox (Oracle  2024-11-29  1130) 				offset = folio_pos(folio);
dccbf08005df800 Ilya Dryomov            2018-02-17  1131  				ceph_calc_file_object_mapping(&ci->i_layout,
dccbf08005df800 Ilya Dryomov            2018-02-17  1132  							      offset, wsize,
5b64640cf65be4a Yan, Zheng              2016-01-07  1133  							      &objnum, &objoff,
dccbf08005df800 Ilya Dryomov            2018-02-17  1134  							      &xlen);
dccbf08005df800 Ilya Dryomov            2018-02-17  1135  				len = xlen;
8c71897be2ddfd8 Henry C Chang           2011-05-03  1136  
3fb99d483e614bc Yanhu Cao               2017-07-21  1137  				num_ops = 1;
a38da1eafb17612 Matthew Wilcox (Oracle  2024-11-29  1138) 				strip_unit_end = folio->index +
09cbfeaf1a5a67b Kirill A. Shutemov      2016-04-01  1139  					((len - 1) >> PAGE_SHIFT);
88486957f9fbf52 Alex Elder              2013-03-14  1140  
5b64640cf65be4a Yan, Zheng              2016-01-07  1141  				BUG_ON(pages);
88486957f9fbf52 Alex Elder              2013-03-14  1142  				max_pages = calc_pages_for(0, (u64)len);
6da2ec56059c3c7 Kees Cook               2018-06-12  1143  				pages = kmalloc_array(max_pages,
6da2ec56059c3c7 Kees Cook               2018-06-12  1144  						      sizeof(*pages),
fc2744aa12da718 Yan, Zheng              2013-05-31  1145  						      GFP_NOFS);
88486957f9fbf52 Alex Elder              2013-03-14  1146  				if (!pages) {
a0102bda5bc0991 Jeff Layton             2020-07-30  1147  					from_pool = true;
a0102bda5bc0991 Jeff Layton             2020-07-30  1148  					pages = mempool_alloc(ceph_wb_pagevec_pool, GFP_NOFS);
e5975c7c8eb6aea Alex Elder              2013-03-14  1149  					BUG_ON(!pages);
88486957f9fbf52 Alex Elder              2013-03-14  1150  				}
5b64640cf65be4a Yan, Zheng              2016-01-07  1151  
5b64640cf65be4a Yan, Zheng              2016-01-07  1152  				len = 0;
a38da1eafb17612 Matthew Wilcox (Oracle  2024-11-29  1153) 			} else if (folio->index !=
09cbfeaf1a5a67b Kirill A. Shutemov      2016-04-01  1154  				   (offset + len) >> PAGE_SHIFT) {
a0102bda5bc0991 Jeff Layton             2020-07-30  1155  				if (num_ops >= (from_pool ?  CEPH_OSD_SLAB_OPS :
5b64640cf65be4a Yan, Zheng              2016-01-07  1156  							     CEPH_OSD_MAX_OPS)) {
a38da1eafb17612 Matthew Wilcox (Oracle  2024-11-29  1157) 					folio_redirty_for_writepage(wbc, folio);
a38da1eafb17612 Matthew Wilcox (Oracle  2024-11-29  1158) 					folio_unlock(folio);
5b64640cf65be4a Yan, Zheng              2016-01-07  1159  					break;
5b64640cf65be4a Yan, Zheng              2016-01-07  1160  				}
5b64640cf65be4a Yan, Zheng              2016-01-07  1161  
5b64640cf65be4a Yan, Zheng              2016-01-07  1162  				num_ops++;
a38da1eafb17612 Matthew Wilcox (Oracle  2024-11-29  1163) 				offset = folio_pos(folio);
5b64640cf65be4a Yan, Zheng              2016-01-07  1164  				len = 0;
1d3576fd10f0d7a Sage Weil               2009-10-06  1165  			}
1d3576fd10f0d7a Sage Weil               2009-10-06  1166  
590a2b5f0a9b740 Vishal Moola (Oracle    2023-01-04  1167) 			/* note position of first page in fbatch */
38d46409c4639a1 Xiubo Li                2023-06-12  1168  			doutc(cl, "%llx.%llx will write page %p idx %lu\n",
a38da1eafb17612 Matthew Wilcox (Oracle  2024-11-29  1169) 			      ceph_vinop(inode), folio, folio->index);
2baba25019ec564 Yehuda Sadeh            2009-12-18  1170  
5b64640cf65be4a Yan, Zheng              2016-01-07  1171  			if (atomic_long_inc_return(&fsc->writeback_count) >
5b64640cf65be4a Yan, Zheng              2016-01-07  1172  			    CONGESTION_ON_THRESH(
503d4fa6ee28e8d NeilBrown               2022-03-22  1173  				    fsc->mount_options->congestion_kb))
503d4fa6ee28e8d NeilBrown               2022-03-22  1174  				fsc->write_congested = true;
0713e5f24b7deb8 Yan, Zheng              2017-08-31  1175  
d55207717ded95c Jeff Layton             2022-08-25  1176  			if (IS_ENCRYPTED(inode)) {
d55207717ded95c Jeff Layton             2022-08-25  1177  				pages[locked_pages] =
d55207717ded95c Jeff Layton             2022-08-25 @1178  					fscrypt_encrypt_pagecache_blocks(page,
d55207717ded95c Jeff Layton             2022-08-25  1179  						PAGE_SIZE, 0,
d55207717ded95c Jeff Layton             2022-08-25  1180  						locked_pages ? GFP_NOWAIT : GFP_NOFS);
d55207717ded95c Jeff Layton             2022-08-25  1181  				if (IS_ERR(pages[locked_pages])) {
d55207717ded95c Jeff Layton             2022-08-25  1182  					if (PTR_ERR(pages[locked_pages]) == -EINVAL)
38d46409c4639a1 Xiubo Li                2023-06-12  1183  						pr_err_client(cl,
38d46409c4639a1 Xiubo Li                2023-06-12  1184  							"inode->i_blkbits=%hhu\n",
38d46409c4639a1 Xiubo Li                2023-06-12  1185  							inode->i_blkbits);
d55207717ded95c Jeff Layton             2022-08-25  1186  					/* better not fail on first page! */
d55207717ded95c Jeff Layton             2022-08-25  1187  					BUG_ON(locked_pages == 0);
d55207717ded95c Jeff Layton             2022-08-25  1188  					pages[locked_pages] = NULL;
a38da1eafb17612 Matthew Wilcox (Oracle  2024-11-29  1189) 					folio_redirty_for_writepage(wbc, folio);
a38da1eafb17612 Matthew Wilcox (Oracle  2024-11-29  1190) 					folio_unlock(folio);
d55207717ded95c Jeff Layton             2022-08-25  1191  					break;
d55207717ded95c Jeff Layton             2022-08-25  1192  				}
d55207717ded95c Jeff Layton             2022-08-25  1193  				++locked_pages;
d55207717ded95c Jeff Layton             2022-08-25  1194  			} else {
a38da1eafb17612 Matthew Wilcox (Oracle  2024-11-29  1195) 				pages[locked_pages++] = &folio->page;
d55207717ded95c Jeff Layton             2022-08-25  1196  			}
0713e5f24b7deb8 Yan, Zheng              2017-08-31  1197  
d55207717ded95c Jeff Layton             2022-08-25  1198  			fbatch.folios[i] = NULL;
a38da1eafb17612 Matthew Wilcox (Oracle  2024-11-29  1199) 			len += folio_size(folio);
1d3576fd10f0d7a Sage Weil               2009-10-06  1200  		}
1d3576fd10f0d7a Sage Weil               2009-10-06  1201  
1d3576fd10f0d7a Sage Weil               2009-10-06  1202  		/* did we get anything? */
1d3576fd10f0d7a Sage Weil               2009-10-06  1203  		if (!locked_pages)
590a2b5f0a9b740 Vishal Moola (Oracle    2023-01-04  1204) 			goto release_folios;
1d3576fd10f0d7a Sage Weil               2009-10-06  1205  		if (i) {
0713e5f24b7deb8 Yan, Zheng              2017-08-31  1206  			unsigned j, n = 0;
590a2b5f0a9b740 Vishal Moola (Oracle    2023-01-04  1207) 			/* shift unused page to beginning of fbatch */
590a2b5f0a9b740 Vishal Moola (Oracle    2023-01-04  1208) 			for (j = 0; j < nr_folios; j++) {
590a2b5f0a9b740 Vishal Moola (Oracle    2023-01-04  1209) 				if (!fbatch.folios[j])
0713e5f24b7deb8 Yan, Zheng              2017-08-31  1210  					continue;
0713e5f24b7deb8 Yan, Zheng              2017-08-31  1211  				if (n < j)
590a2b5f0a9b740 Vishal Moola (Oracle    2023-01-04  1212) 					fbatch.folios[n] = fbatch.folios[j];
0713e5f24b7deb8 Yan, Zheng              2017-08-31  1213  				n++;
0713e5f24b7deb8 Yan, Zheng              2017-08-31  1214  			}
590a2b5f0a9b740 Vishal Moola (Oracle    2023-01-04  1215) 			fbatch.nr = n;
1d3576fd10f0d7a Sage Weil               2009-10-06  1216  
590a2b5f0a9b740 Vishal Moola (Oracle    2023-01-04  1217) 			if (nr_folios && i == nr_folios &&
1d3576fd10f0d7a Sage Weil               2009-10-06  1218  			    locked_pages < max_pages) {
38d46409c4639a1 Xiubo Li                2023-06-12  1219  				doutc(cl, "reached end fbatch, trying for more\n");
590a2b5f0a9b740 Vishal Moola (Oracle    2023-01-04  1220) 				folio_batch_release(&fbatch);
1d3576fd10f0d7a Sage Weil               2009-10-06  1221  				goto get_more_pages;
1d3576fd10f0d7a Sage Weil               2009-10-06  1222  			}
1d3576fd10f0d7a Sage Weil               2009-10-06  1223  		}
1d3576fd10f0d7a Sage Weil               2009-10-06  1224  
5b64640cf65be4a Yan, Zheng              2016-01-07  1225  new_request:
d55207717ded95c Jeff Layton             2022-08-25  1226  		offset = ceph_fscrypt_page_offset(pages[0]);
5b64640cf65be4a Yan, Zheng              2016-01-07  1227  		len = wsize;
5b64640cf65be4a Yan, Zheng              2016-01-07  1228  
5b64640cf65be4a Yan, Zheng              2016-01-07  1229  		req = ceph_osdc_new_request(&fsc->client->osdc,
5b64640cf65be4a Yan, Zheng              2016-01-07  1230  					&ci->i_layout, vino,
5b64640cf65be4a Yan, Zheng              2016-01-07  1231  					offset, &len, 0, num_ops,
1f934b00e907527 Yan, Zheng              2017-08-30  1232  					CEPH_OSD_OP_WRITE, CEPH_OSD_FLAG_WRITE,
1f934b00e907527 Yan, Zheng              2017-08-30  1233  					snapc, ceph_wbc.truncate_seq,
1f934b00e907527 Yan, Zheng              2017-08-30  1234  					ceph_wbc.truncate_size, false);
5b64640cf65be4a Yan, Zheng              2016-01-07  1235  		if (IS_ERR(req)) {
5b64640cf65be4a Yan, Zheng              2016-01-07  1236  			req = ceph_osdc_new_request(&fsc->client->osdc,
5b64640cf65be4a Yan, Zheng              2016-01-07  1237  						&ci->i_layout, vino,
5b64640cf65be4a Yan, Zheng              2016-01-07  1238  						offset, &len, 0,
5b64640cf65be4a Yan, Zheng              2016-01-07  1239  						min(num_ops,
5b64640cf65be4a Yan, Zheng              2016-01-07  1240  						    CEPH_OSD_SLAB_OPS),
5b64640cf65be4a Yan, Zheng              2016-01-07  1241  						CEPH_OSD_OP_WRITE,
54ea0046b6fe36e Ilya Dryomov            2017-02-11  1242  						CEPH_OSD_FLAG_WRITE,
1f934b00e907527 Yan, Zheng              2017-08-30  1243  						snapc, ceph_wbc.truncate_seq,
1f934b00e907527 Yan, Zheng              2017-08-30  1244  						ceph_wbc.truncate_size, true);
5b64640cf65be4a Yan, Zheng              2016-01-07  1245  			BUG_ON(IS_ERR(req));
5b64640cf65be4a Yan, Zheng              2016-01-07  1246  		}
d55207717ded95c Jeff Layton             2022-08-25  1247  		BUG_ON(len < ceph_fscrypt_page_offset(pages[locked_pages - 1]) +
d55207717ded95c Jeff Layton             2022-08-25  1248  			     thp_size(pages[locked_pages - 1]) - offset);
5b64640cf65be4a Yan, Zheng              2016-01-07  1249  
1464de9f813e355 Xiubo Li                2023-05-09  1250  		if (!ceph_inc_osd_stopping_blocker(fsc->mdsc)) {
1464de9f813e355 Xiubo Li                2023-05-09  1251  			rc = -EIO;
1464de9f813e355 Xiubo Li                2023-05-09  1252  			goto release_folios;
1464de9f813e355 Xiubo Li                2023-05-09  1253  		}
5b64640cf65be4a Yan, Zheng              2016-01-07  1254  		req->r_callback = writepages_finish;
5b64640cf65be4a Yan, Zheng              2016-01-07  1255  		req->r_inode = inode;
5b64640cf65be4a Yan, Zheng              2016-01-07  1256  
5b64640cf65be4a Yan, Zheng              2016-01-07  1257  		/* Format the osd request message and submit the write */
5b64640cf65be4a Yan, Zheng              2016-01-07  1258  		len = 0;
5b64640cf65be4a Yan, Zheng              2016-01-07  1259  		data_pages = pages;
5b64640cf65be4a Yan, Zheng              2016-01-07  1260  		op_idx = 0;
5b64640cf65be4a Yan, Zheng              2016-01-07  1261  		for (i = 0; i < locked_pages; i++) {
d55207717ded95c Jeff Layton             2022-08-25  1262  			struct page *page = ceph_fscrypt_pagecache_page(pages[i]);
d55207717ded95c Jeff Layton             2022-08-25  1263  
d55207717ded95c Jeff Layton             2022-08-25  1264  			u64 cur_offset = page_offset(page);
1702e79734104d7 Jeff Layton             2021-12-07  1265  			/*
1702e79734104d7 Jeff Layton             2021-12-07  1266  			 * Discontinuity in page range? Ceph can handle that by just passing
1702e79734104d7 Jeff Layton             2021-12-07  1267  			 * multiple extents in the write op.
1702e79734104d7 Jeff Layton             2021-12-07  1268  			 */
5b64640cf65be4a Yan, Zheng              2016-01-07  1269  			if (offset + len != cur_offset) {
1702e79734104d7 Jeff Layton             2021-12-07  1270  				/* If it's full, stop here */
3fb99d483e614bc Yanhu Cao               2017-07-21  1271  				if (op_idx + 1 == req->r_num_ops)
5b64640cf65be4a Yan, Zheng              2016-01-07  1272  					break;
1702e79734104d7 Jeff Layton             2021-12-07  1273  
1702e79734104d7 Jeff Layton             2021-12-07  1274  				/* Kick off an fscache write with what we have so far. */
1702e79734104d7 Jeff Layton             2021-12-07  1275  				ceph_fscache_write_to_cache(inode, offset, len, caching);
1702e79734104d7 Jeff Layton             2021-12-07  1276  
1702e79734104d7 Jeff Layton             2021-12-07  1277  				/* Start a new extent */
5b64640cf65be4a Yan, Zheng              2016-01-07  1278  				osd_req_op_extent_dup_last(req, op_idx,
5b64640cf65be4a Yan, Zheng              2016-01-07  1279  							   cur_offset - offset);
38d46409c4639a1 Xiubo Li                2023-06-12  1280  				doutc(cl, "got pages at %llu~%llu\n", offset,
38d46409c4639a1 Xiubo Li                2023-06-12  1281  				      len);
5b64640cf65be4a Yan, Zheng              2016-01-07  1282  				osd_req_op_extent_osd_data_pages(req, op_idx,
5b64640cf65be4a Yan, Zheng              2016-01-07  1283  							data_pages, len, 0,
a0102bda5bc0991 Jeff Layton             2020-07-30  1284  							from_pool, false);
5b64640cf65be4a Yan, Zheng              2016-01-07  1285  				osd_req_op_extent_update(req, op_idx, len);
5b64640cf65be4a Yan, Zheng              2016-01-07  1286  
5b64640cf65be4a Yan, Zheng              2016-01-07  1287  				len = 0;
5b64640cf65be4a Yan, Zheng              2016-01-07  1288  				offset = cur_offset;
5b64640cf65be4a Yan, Zheng              2016-01-07  1289  				data_pages = pages + i;
5b64640cf65be4a Yan, Zheng              2016-01-07  1290  				op_idx++;
5b64640cf65be4a Yan, Zheng              2016-01-07  1291  			}
5b64640cf65be4a Yan, Zheng              2016-01-07  1292  
d55207717ded95c Jeff Layton             2022-08-25  1293  			set_page_writeback(page);
8e5ced7804cb918 David Howells           2024-07-30  1294  			if (caching)
8e5ced7804cb918 David Howells           2024-07-30  1295  				ceph_set_page_fscache(page);
8ff2d290c8ce77c Jeff Layton             2021-04-05  1296  			len += thp_size(page);
5b64640cf65be4a Yan, Zheng              2016-01-07  1297  		}
1702e79734104d7 Jeff Layton             2021-12-07  1298  		ceph_fscache_write_to_cache(inode, offset, len, caching);
5b64640cf65be4a Yan, Zheng              2016-01-07  1299  
1f934b00e907527 Yan, Zheng              2017-08-30  1300  		if (ceph_wbc.size_stable) {
1f934b00e907527 Yan, Zheng              2017-08-30  1301  			len = min(len, ceph_wbc.i_size - offset);
5b64640cf65be4a Yan, Zheng              2016-01-07  1302  		} else if (i == locked_pages) {
e1966b49446a439 Yan, Zheng              2015-06-18  1303  			/* writepages_finish() clears writeback pages
e1966b49446a439 Yan, Zheng              2015-06-18  1304  			 * according to the data length, so make sure
e1966b49446a439 Yan, Zheng              2015-06-18  1305  			 * data length covers all locked pages */
8ff2d290c8ce77c Jeff Layton             2021-04-05  1306  			u64 min_len = len + 1 - thp_size(page);
1f934b00e907527 Yan, Zheng              2017-08-30  1307  			len = get_writepages_data_length(inode, pages[i - 1],
1f934b00e907527 Yan, Zheng              2017-08-30  1308  							 offset);
5b64640cf65be4a Yan, Zheng              2016-01-07  1309  			len = max(len, min_len);
e1966b49446a439 Yan, Zheng              2015-06-18  1310  		}
d55207717ded95c Jeff Layton             2022-08-25  1311  		if (IS_ENCRYPTED(inode))
d55207717ded95c Jeff Layton             2022-08-25  1312  			len = round_up(len, CEPH_FSCRYPT_BLOCK_SIZE);
d55207717ded95c Jeff Layton             2022-08-25  1313  
38d46409c4639a1 Xiubo Li                2023-06-12  1314  		doutc(cl, "got pages at %llu~%llu\n", offset, len);
1d3576fd10f0d7a Sage Weil               2009-10-06  1315  
d55207717ded95c Jeff Layton             2022-08-25  1316  		if (IS_ENCRYPTED(inode) &&
d55207717ded95c Jeff Layton             2022-08-25  1317  		    ((offset | len) & ~CEPH_FSCRYPT_BLOCK_MASK))
38d46409c4639a1 Xiubo Li                2023-06-12  1318  			pr_warn_client(cl,
38d46409c4639a1 Xiubo Li                2023-06-12  1319  				"bad encrypted write offset=%lld len=%llu\n",
38d46409c4639a1 Xiubo Li                2023-06-12  1320  				offset, len);
d55207717ded95c Jeff Layton             2022-08-25  1321  
5b64640cf65be4a Yan, Zheng              2016-01-07  1322  		osd_req_op_extent_osd_data_pages(req, op_idx, data_pages, len,
a0102bda5bc0991 Jeff Layton             2020-07-30  1323  						 0, from_pool, false);
5b64640cf65be4a Yan, Zheng              2016-01-07  1324  		osd_req_op_extent_update(req, op_idx, len);
e5975c7c8eb6aea Alex Elder              2013-03-14  1325  
5b64640cf65be4a Yan, Zheng              2016-01-07  1326  		BUG_ON(op_idx + 1 != req->r_num_ops);
e5975c7c8eb6aea Alex Elder              2013-03-14  1327  
a0102bda5bc0991 Jeff Layton             2020-07-30  1328  		from_pool = false;
5b64640cf65be4a Yan, Zheng              2016-01-07  1329  		if (i < locked_pages) {
5b64640cf65be4a Yan, Zheng              2016-01-07  1330  			BUG_ON(num_ops <= req->r_num_ops);
5b64640cf65be4a Yan, Zheng              2016-01-07  1331  			num_ops -= req->r_num_ops;
5b64640cf65be4a Yan, Zheng              2016-01-07  1332  			locked_pages -= i;
5b64640cf65be4a Yan, Zheng              2016-01-07  1333  
5b64640cf65be4a Yan, Zheng              2016-01-07  1334  			/* allocate new pages array for next request */
5b64640cf65be4a Yan, Zheng              2016-01-07  1335  			data_pages = pages;
6da2ec56059c3c7 Kees Cook               2018-06-12  1336  			pages = kmalloc_array(locked_pages, sizeof(*pages),
5b64640cf65be4a Yan, Zheng              2016-01-07  1337  					      GFP_NOFS);
5b64640cf65be4a Yan, Zheng              2016-01-07  1338  			if (!pages) {
a0102bda5bc0991 Jeff Layton             2020-07-30  1339  				from_pool = true;
a0102bda5bc0991 Jeff Layton             2020-07-30  1340  				pages = mempool_alloc(ceph_wb_pagevec_pool, GFP_NOFS);
5b64640cf65be4a Yan, Zheng              2016-01-07  1341  				BUG_ON(!pages);
5b64640cf65be4a Yan, Zheng              2016-01-07  1342  			}
5b64640cf65be4a Yan, Zheng              2016-01-07  1343  			memcpy(pages, data_pages + i,
5b64640cf65be4a Yan, Zheng              2016-01-07  1344  			       locked_pages * sizeof(*pages));
5b64640cf65be4a Yan, Zheng              2016-01-07  1345  			memset(data_pages + i, 0,
5b64640cf65be4a Yan, Zheng              2016-01-07  1346  			       locked_pages * sizeof(*pages));
5b64640cf65be4a Yan, Zheng              2016-01-07  1347  		} else {
9182bf4af1f077d Matthew Wilcox (Oracle  2024-11-29  1348) 			struct folio *folio;
9182bf4af1f077d Matthew Wilcox (Oracle  2024-11-29  1349) 
5b64640cf65be4a Yan, Zheng              2016-01-07  1350  			BUG_ON(num_ops != req->r_num_ops);
9182bf4af1f077d Matthew Wilcox (Oracle  2024-11-29  1351) 			folio = ceph_fscrypt_pagecache_folio(pages[i - 1]);
9182bf4af1f077d Matthew Wilcox (Oracle  2024-11-29  1352) 			index = folio->index + 1;
5b64640cf65be4a Yan, Zheng              2016-01-07  1353  			/* request message now owns the pages array */
5b64640cf65be4a Yan, Zheng              2016-01-07  1354  			pages = NULL;
5b64640cf65be4a Yan, Zheng              2016-01-07  1355  		}
e5975c7c8eb6aea Alex Elder              2013-03-14  1356  
c453bdb535341b5 Jeff Layton             2023-10-04  1357  		req->r_mtime = inode_get_mtime(inode);
a8af0d682ae0c9c Jeff Layton             2022-06-30  1358  		ceph_osdc_start_request(&fsc->client->osdc, req);
1d3576fd10f0d7a Sage Weil               2009-10-06  1359  		req = NULL;
1d3576fd10f0d7a Sage Weil               2009-10-06  1360  
5b64640cf65be4a Yan, Zheng              2016-01-07  1361  		wbc->nr_to_write -= i;
5b64640cf65be4a Yan, Zheng              2016-01-07  1362  		if (pages)
5b64640cf65be4a Yan, Zheng              2016-01-07  1363  			goto new_request;
5b64640cf65be4a Yan, Zheng              2016-01-07  1364  
2a2d927e35dd8dc Yan, Zheng              2017-09-01  1365  		/*
2a2d927e35dd8dc Yan, Zheng              2017-09-01  1366  		 * We stop writing back only if we are not doing
2a2d927e35dd8dc Yan, Zheng              2017-09-01  1367  		 * integrity sync. In case of integrity sync we have to
2a2d927e35dd8dc Yan, Zheng              2017-09-01  1368  		 * keep going until we have written all the pages
2a2d927e35dd8dc Yan, Zheng              2017-09-01  1369  		 * we tagged for writeback prior to entering this loop.
2a2d927e35dd8dc Yan, Zheng              2017-09-01  1370  		 */
2a2d927e35dd8dc Yan, Zheng              2017-09-01  1371  		if (wbc->nr_to_write <= 0 && wbc->sync_mode == WB_SYNC_NONE)
af9cc401ce7452f Yan, Zheng              2018-03-04  1372  			done = true;
1d3576fd10f0d7a Sage Weil               2009-10-06  1373  
590a2b5f0a9b740 Vishal Moola (Oracle    2023-01-04  1374) release_folios:
38d46409c4639a1 Xiubo Li                2023-06-12  1375  		doutc(cl, "folio_batch release on %d folios (%p)\n",
38d46409c4639a1 Xiubo Li                2023-06-12  1376  		      (int)fbatch.nr, fbatch.nr ? fbatch.folios[0] : NULL);
590a2b5f0a9b740 Vishal Moola (Oracle    2023-01-04  1377) 		folio_batch_release(&fbatch);
1d3576fd10f0d7a Sage Weil               2009-10-06  1378  	}
1d3576fd10f0d7a Sage Weil               2009-10-06  1379  
1d3576fd10f0d7a Sage Weil               2009-10-06  1380  	if (should_loop && !done) {
1d3576fd10f0d7a Sage Weil               2009-10-06  1381  		/* more to do; loop back to beginning of file */
38d46409c4639a1 Xiubo Li                2023-06-12  1382  		doutc(cl, "looping back to beginning of file\n");
2a2d927e35dd8dc Yan, Zheng              2017-09-01  1383  		end = start_index - 1; /* OK even when start_index == 0 */
f275635ee0b6641 Yan, Zheng              2017-09-01  1384  
f275635ee0b6641 Yan, Zheng              2017-09-01  1385  		/* to write dirty pages associated with next snapc,
f275635ee0b6641 Yan, Zheng              2017-09-01  1386  		 * we need to wait until current writes complete */
f275635ee0b6641 Yan, Zheng              2017-09-01  1387  		if (wbc->sync_mode != WB_SYNC_NONE &&
f275635ee0b6641 Yan, Zheng              2017-09-01  1388  		    start_index == 0 && /* all dirty pages were checked */
f275635ee0b6641 Yan, Zheng              2017-09-01  1389  		    !ceph_wbc.head_snapc) {
f275635ee0b6641 Yan, Zheng              2017-09-01  1390  			struct page *page;
f275635ee0b6641 Yan, Zheng              2017-09-01  1391  			unsigned i, nr;
f275635ee0b6641 Yan, Zheng              2017-09-01  1392  			index = 0;
f275635ee0b6641 Yan, Zheng              2017-09-01  1393  			while ((index <= end) &&
590a2b5f0a9b740 Vishal Moola (Oracle    2023-01-04  1394) 			       (nr = filemap_get_folios_tag(mapping, &index,
590a2b5f0a9b740 Vishal Moola (Oracle    2023-01-04  1395) 						(pgoff_t)-1,
590a2b5f0a9b740 Vishal Moola (Oracle    2023-01-04  1396) 						PAGECACHE_TAG_WRITEBACK,
590a2b5f0a9b740 Vishal Moola (Oracle    2023-01-04  1397) 						&fbatch))) {
f275635ee0b6641 Yan, Zheng              2017-09-01  1398  				for (i = 0; i < nr; i++) {
590a2b5f0a9b740 Vishal Moola (Oracle    2023-01-04  1399) 					page = &fbatch.folios[i]->page;
f275635ee0b6641 Yan, Zheng              2017-09-01  1400  					if (page_snap_context(page) != snapc)
f275635ee0b6641 Yan, Zheng              2017-09-01  1401  						continue;
f275635ee0b6641 Yan, Zheng              2017-09-01  1402  					wait_on_page_writeback(page);
f275635ee0b6641 Yan, Zheng              2017-09-01  1403  				}
590a2b5f0a9b740 Vishal Moola (Oracle    2023-01-04  1404) 				folio_batch_release(&fbatch);
f275635ee0b6641 Yan, Zheng              2017-09-01  1405  				cond_resched();
f275635ee0b6641 Yan, Zheng              2017-09-01  1406  			}
f275635ee0b6641 Yan, Zheng              2017-09-01  1407  		}
f275635ee0b6641 Yan, Zheng              2017-09-01  1408  
2a2d927e35dd8dc Yan, Zheng              2017-09-01  1409  		start_index = 0;
1d3576fd10f0d7a Sage Weil               2009-10-06  1410  		index = 0;
1d3576fd10f0d7a Sage Weil               2009-10-06  1411  		goto retry;
1d3576fd10f0d7a Sage Weil               2009-10-06  1412  	}
1d3576fd10f0d7a Sage Weil               2009-10-06  1413  
1d3576fd10f0d7a Sage Weil               2009-10-06  1414  	if (wbc->range_cyclic || (range_whole && wbc->nr_to_write > 0))
1d3576fd10f0d7a Sage Weil               2009-10-06  1415  		mapping->writeback_index = index;
1d3576fd10f0d7a Sage Weil               2009-10-06  1416  
1d3576fd10f0d7a Sage Weil               2009-10-06  1417  out:
1d3576fd10f0d7a Sage Weil               2009-10-06  1418  	ceph_osdc_put_request(req);
2a2d927e35dd8dc Yan, Zheng              2017-09-01  1419  	ceph_put_snap_context(last_snapc);
38d46409c4639a1 Xiubo Li                2023-06-12  1420  	doutc(cl, "%llx.%llx dend - startone, rc = %d\n", ceph_vinop(inode),
38d46409c4639a1 Xiubo Li                2023-06-12  1421  	      rc);
1d3576fd10f0d7a Sage Weil               2009-10-06  1422  	return rc;
1d3576fd10f0d7a Sage Weil               2009-10-06  1423  }
1d3576fd10f0d7a Sage Weil               2009-10-06  1424
Matthew Wilcox Dec. 2, 2024, 7:04 p.m. UTC | #2
On Fri, Nov 29, 2024 at 11:42:44PM +0800, kernel test robot wrote:
> >> fs/ceph/addr.c:1178:39: warning: variable 'page' is uninitialized when used here [-Wuninitialized]
>     1178 |                                         fscrypt_encrypt_pagecache_blocks(page,

This will fix the bug.  I'll send a v2 with this folded in.

diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c
index 1e0c982f5abe..b065b971a9f0 100644
--- a/fs/ceph/addr.c
+++ b/fs/ceph/addr.c
@@ -1040,7 +1040,7 @@ static int ceph_writepages_start(struct address_space *mapping,
 		int num_ops = 0, op_idx;
 		unsigned i, nr_folios, max_pages, locked_pages = 0;
 		struct page **pages = NULL, **data_pages;
-		struct page *page;
+		struct folio *folio;
 		pgoff_t strip_unit_end = 0;
 		u64 offset = 0, len = 0;
 		bool from_pool = false;
@@ -1054,7 +1054,7 @@ static int ceph_writepages_start(struct address_space *mapping,
 		if (!nr_folios && !locked_pages)
 			break;
 		for (i = 0; i < nr_folios && locked_pages < max_pages; i++) {
-			struct folio *folio = fbatch.folios[i];
+			folio = fbatch.folios[i];
 
 			doutc(cl, "? %p idx %lu\n", folio, folio->index);
 			if (locked_pages == 0)
@@ -1175,7 +1175,7 @@ static int ceph_writepages_start(struct address_space *mapping,
 
 			if (IS_ENCRYPTED(inode)) {
 				pages[locked_pages] =
-					fscrypt_encrypt_pagecache_blocks(page,
+					fscrypt_encrypt_pagecache_blocks(&folio->page,
 						PAGE_SIZE, 0,
 						locked_pages ? GFP_NOWAIT : GFP_NOFS);
 				if (IS_ERR(pages[locked_pages])) {
@@ -1303,7 +1303,7 @@ static int ceph_writepages_start(struct address_space *mapping,
 			/* writepages_finish() clears writeback pages
 			 * according to the data length, so make sure
 			 * data length covers all locked pages */
-			u64 min_len = len + 1 - thp_size(page);
+			u64 min_len = len + 1 - folio_size(folio);
 			len = get_writepages_data_length(inode, pages[i - 1],
 							 offset);
 			len = max(len, min_len);
diff mbox series

Patch

diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c
index aba8d55bd533..1e0c982f5abe 100644
--- a/fs/ceph/addr.c
+++ b/fs/ceph/addr.c
@@ -1056,22 +1056,21 @@  static int ceph_writepages_start(struct address_space *mapping,
 		for (i = 0; i < nr_folios && locked_pages < max_pages; i++) {
 			struct folio *folio = fbatch.folios[i];
 
-			page = &folio->page;
-			doutc(cl, "? %p idx %lu\n", page, page->index);
+			doutc(cl, "? %p idx %lu\n", folio, folio->index);
 			if (locked_pages == 0)
-				lock_page(page);  /* first page */
-			else if (!trylock_page(page))
+				folio_lock(folio);  /* first page */
+			else if (!folio_trylock(folio))
 				break;
 
 			/* only dirty pages, or our accounting breaks */
-			if (unlikely(!PageDirty(page)) ||
-			    unlikely(page->mapping != mapping)) {
-				doutc(cl, "!dirty or !mapping %p\n", page);
-				unlock_page(page);
+			if (unlikely(!folio_test_dirty(folio)) ||
+			    unlikely(folio->mapping != mapping)) {
+				doutc(cl, "!dirty or !mapping %p\n", folio);
+				folio_unlock(folio);
 				continue;
 			}
 			/* only if matching snap context */
-			pgsnapc = page_snap_context(page);
+			pgsnapc = page_snap_context(&folio->page);
 			if (pgsnapc != snapc) {
 				doutc(cl, "page snapc %p %lld != oldest %p %lld\n",
 				      pgsnapc, pgsnapc->seq, snapc, snapc->seq);
@@ -1079,10 +1078,10 @@  static int ceph_writepages_start(struct address_space *mapping,
 				    !ceph_wbc.head_snapc &&
 				    wbc->sync_mode != WB_SYNC_NONE)
 					should_loop = true;
-				unlock_page(page);
+				folio_unlock(folio);
 				continue;
 			}
-			if (page_offset(page) >= ceph_wbc.i_size) {
+			if (folio_pos(folio) >= ceph_wbc.i_size) {
 				doutc(cl, "folio at %lu beyond eof %llu\n",
 				      folio->index, ceph_wbc.i_size);
 				if ((ceph_wbc.size_stable ||
@@ -1093,9 +1092,9 @@  static int ceph_writepages_start(struct address_space *mapping,
 				folio_unlock(folio);
 				continue;
 			}
-			if (strip_unit_end && (page->index > strip_unit_end)) {
-				doutc(cl, "end of strip unit %p\n", page);
-				unlock_page(page);
+			if (strip_unit_end && (folio->index > strip_unit_end)) {
+				doutc(cl, "end of strip unit %p\n", folio);
+				folio_unlock(folio);
 				break;
 			}
 			if (folio_test_writeback(folio) ||
@@ -1110,9 +1109,9 @@  static int ceph_writepages_start(struct address_space *mapping,
 				folio_wait_private_2(folio); /* [DEPRECATED] */
 			}
 
-			if (!clear_page_dirty_for_io(page)) {
-				doutc(cl, "%p !clear_page_dirty_for_io\n", page);
-				unlock_page(page);
+			if (!folio_clear_dirty_for_io(folio)) {
+				doutc(cl, "%p !clear_page_dirty_for_io\n", folio);
+				folio_unlock(folio);
 				continue;
 			}
 
@@ -1128,7 +1127,7 @@  static int ceph_writepages_start(struct address_space *mapping,
 				u32 xlen;
 
 				/* prepare async write request */
-				offset = (u64)page_offset(page);
+				offset = folio_pos(folio);
 				ceph_calc_file_object_mapping(&ci->i_layout,
 							      offset, wsize,
 							      &objnum, &objoff,
@@ -1136,7 +1135,7 @@  static int ceph_writepages_start(struct address_space *mapping,
 				len = xlen;
 
 				num_ops = 1;
-				strip_unit_end = page->index +
+				strip_unit_end = folio->index +
 					((len - 1) >> PAGE_SHIFT);
 
 				BUG_ON(pages);
@@ -1151,23 +1150,23 @@  static int ceph_writepages_start(struct address_space *mapping,
 				}
 
 				len = 0;
-			} else if (page->index !=
+			} else if (folio->index !=
 				   (offset + len) >> PAGE_SHIFT) {
 				if (num_ops >= (from_pool ?  CEPH_OSD_SLAB_OPS :
 							     CEPH_OSD_MAX_OPS)) {
-					redirty_page_for_writepage(wbc, page);
-					unlock_page(page);
+					folio_redirty_for_writepage(wbc, folio);
+					folio_unlock(folio);
 					break;
 				}
 
 				num_ops++;
-				offset = (u64)page_offset(page);
+				offset = folio_pos(folio);
 				len = 0;
 			}
 
 			/* note position of first page in fbatch */
 			doutc(cl, "%llx.%llx will write page %p idx %lu\n",
-			      ceph_vinop(inode), page, page->index);
+			      ceph_vinop(inode), folio, folio->index);
 
 			if (atomic_long_inc_return(&fsc->writeback_count) >
 			    CONGESTION_ON_THRESH(
@@ -1187,17 +1186,17 @@  static int ceph_writepages_start(struct address_space *mapping,
 					/* better not fail on first page! */
 					BUG_ON(locked_pages == 0);
 					pages[locked_pages] = NULL;
-					redirty_page_for_writepage(wbc, page);
-					unlock_page(page);
+					folio_redirty_for_writepage(wbc, folio);
+					folio_unlock(folio);
 					break;
 				}
 				++locked_pages;
 			} else {
-				pages[locked_pages++] = page;
+				pages[locked_pages++] = &folio->page;
 			}
 
 			fbatch.folios[i] = NULL;
-			len += thp_size(page);
+			len += folio_size(folio);
 		}
 
 		/* did we get anything? */