Commit d585bdbe authored by Matthew Wilcox (Oracle)'s avatar Matthew Wilcox (Oracle) Committed by Andrew Morton
Browse files

fs: convert writepage_t callback to pass a folio

Patch series "Convert writepage_t to use a folio".

More folioisation.  I split out the mpage work from everything else
because it completely dominated the patch, but some implementations I just
converted outright.


This patch (of 2):

We always write back an entire folio, but that's currently passed as the
head page.  Convert all filesystems that use write_cache_pages() to expect
a folio instead of a page.

Link: https://lkml.kernel.org/r/20230126201255.1681189-1-willy@infradead.org
Link: https://lkml.kernel.org/r/20230126201255.1681189-2-willy@infradead.org


Signed-off-by: default avatarMatthew Wilcox (Oracle) <willy@infradead.org>
Cc: Christoph Hellwig <hch@infradead.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent 00cdf760
Loading
Loading
Loading
Loading
+4 −4
Original line number Original line Diff line number Diff line
@@ -2675,14 +2675,14 @@ wdata_send_pages(struct cifs_writedata *wdata, unsigned int nr_pages,
static int
static int
cifs_writepage_locked(struct page *page, struct writeback_control *wbc);
cifs_writepage_locked(struct page *page, struct writeback_control *wbc);


static int cifs_write_one_page(struct page *page, struct writeback_control *wbc,
static int cifs_write_one_page(struct folio *folio,
		void *data)
		struct writeback_control *wbc, void *data)
{
{
	struct address_space *mapping = data;
	struct address_space *mapping = data;
	int ret;
	int ret;


	ret = cifs_writepage_locked(page, wbc);
	ret = cifs_writepage_locked(&folio->page, wbc);
	unlock_page(page);
	folio_unlock(folio);
	mapping_set_error(mapping, ret);
	mapping_set_error(mapping, ret);
	return ret;
	return ret;
}
}
+2 −2
Original line number Original line Diff line number Diff line
@@ -2711,10 +2711,10 @@ static int mpage_prepare_extent_to_map(struct mpage_da_data *mpd)
	return err;
	return err;
}
}


static int ext4_writepage_cb(struct page *page, struct writeback_control *wbc,
static int ext4_writepage_cb(struct folio *folio, struct writeback_control *wbc,
			     void *data)
			     void *data)
{
{
	return ext4_writepage(page, wbc);
	return ext4_writepage(&folio->page, wbc);
}
}


static int ext4_do_writepages(struct mpage_da_data *mpd)
static int ext4_do_writepages(struct mpage_da_data *mpd)
+3 −3
Original line number Original line Diff line number Diff line
@@ -482,7 +482,7 @@ static void ext4_journal_commit_callback(journal_t *journal, transaction_t *txn)
 *
 *
 * However, we may have to redirty a page (see below.)
 * However, we may have to redirty a page (see below.)
 */
 */
static int ext4_journalled_writepage_callback(struct page *page,
static int ext4_journalled_writepage_callback(struct folio *folio,
					      struct writeback_control *wbc,
					      struct writeback_control *wbc,
					      void *data)
					      void *data)
{
{
@@ -490,7 +490,7 @@ static int ext4_journalled_writepage_callback(struct page *page,
	struct buffer_head *bh, *head;
	struct buffer_head *bh, *head;
	struct journal_head *jh;
	struct journal_head *jh;


	bh = head = page_buffers(page);
	bh = head = folio_buffers(folio);
	do {
	do {
		/*
		/*
		 * We have to redirty a page in these cases:
		 * We have to redirty a page in these cases:
@@ -509,7 +509,7 @@ static int ext4_journalled_writepage_callback(struct page *page,
		if (buffer_dirty(bh) ||
		if (buffer_dirty(bh) ||
		    (jh && (jh->b_transaction != transaction ||
		    (jh && (jh->b_transaction != transaction ||
			    jh->b_next_transaction))) {
			    jh->b_next_transaction))) {
			redirty_page_for_writepage(wbc, page);
			folio_redirty_for_writepage(wbc, folio);
			goto out;
			goto out;
		}
		}
	} while ((bh = bh->b_this_page) != head);
	} while ((bh = bh->b_this_page) != head);
+9 −9
Original line number Original line Diff line number Diff line
@@ -2184,7 +2184,7 @@ static bool fuse_writepage_need_send(struct fuse_conn *fc, struct page *page,
	return false;
	return false;
}
}


static int fuse_writepages_fill(struct page *page,
static int fuse_writepages_fill(struct folio *folio,
		struct writeback_control *wbc, void *_data)
		struct writeback_control *wbc, void *_data)
{
{
	struct fuse_fill_wb_data *data = _data;
	struct fuse_fill_wb_data *data = _data;
@@ -2203,7 +2203,7 @@ static int fuse_writepages_fill(struct page *page,
			goto out_unlock;
			goto out_unlock;
	}
	}


	if (wpa && fuse_writepage_need_send(fc, page, ap, data)) {
	if (wpa && fuse_writepage_need_send(fc, &folio->page, ap, data)) {
		fuse_writepages_send(data);
		fuse_writepages_send(data);
		data->wpa = NULL;
		data->wpa = NULL;
	}
	}
@@ -2238,7 +2238,7 @@ static int fuse_writepages_fill(struct page *page,
		data->max_pages = 1;
		data->max_pages = 1;


		ap = &wpa->ia.ap;
		ap = &wpa->ia.ap;
		fuse_write_args_fill(&wpa->ia, data->ff, page_offset(page), 0);
		fuse_write_args_fill(&wpa->ia, data->ff, folio_pos(folio), 0);
		wpa->ia.write.in.write_flags |= FUSE_WRITE_CACHE;
		wpa->ia.write.in.write_flags |= FUSE_WRITE_CACHE;
		wpa->next = NULL;
		wpa->next = NULL;
		ap->args.in_pages = true;
		ap->args.in_pages = true;
@@ -2246,13 +2246,13 @@ static int fuse_writepages_fill(struct page *page,
		ap->num_pages = 0;
		ap->num_pages = 0;
		wpa->inode = inode;
		wpa->inode = inode;
	}
	}
	set_page_writeback(page);
	folio_start_writeback(folio);


	copy_highpage(tmp_page, page);
	copy_highpage(tmp_page, &folio->page);
	ap->pages[ap->num_pages] = tmp_page;
	ap->pages[ap->num_pages] = tmp_page;
	ap->descs[ap->num_pages].offset = 0;
	ap->descs[ap->num_pages].offset = 0;
	ap->descs[ap->num_pages].length = PAGE_SIZE;
	ap->descs[ap->num_pages].length = PAGE_SIZE;
	data->orig_pages[ap->num_pages] = page;
	data->orig_pages[ap->num_pages] = &folio->page;


	inc_wb_stat(&inode_to_bdi(inode)->wb, WB_WRITEBACK);
	inc_wb_stat(&inode_to_bdi(inode)->wb, WB_WRITEBACK);
	inc_node_page_state(tmp_page, NR_WRITEBACK_TEMP);
	inc_node_page_state(tmp_page, NR_WRITEBACK_TEMP);
@@ -2266,13 +2266,13 @@ static int fuse_writepages_fill(struct page *page,
		spin_lock(&fi->lock);
		spin_lock(&fi->lock);
		ap->num_pages++;
		ap->num_pages++;
		spin_unlock(&fi->lock);
		spin_unlock(&fi->lock);
	} else if (fuse_writepage_add(wpa, page)) {
	} else if (fuse_writepage_add(wpa, &folio->page)) {
		data->wpa = wpa;
		data->wpa = wpa;
	} else {
	} else {
		end_page_writeback(page);
		folio_end_writeback(folio);
	}
	}
out_unlock:
out_unlock:
	unlock_page(page);
	folio_unlock(folio);


	return err;
	return err;
}
}
+2 −3
Original line number Original line Diff line number Diff line
@@ -1685,10 +1685,9 @@ iomap_writepage_map(struct iomap_writepage_ctx *wpc,
 * For unwritten space on the page, we need to start the conversion to
 * For unwritten space on the page, we need to start the conversion to
 * regular allocated space.
 * regular allocated space.
 */
 */
static int
static int iomap_do_writepage(struct folio *folio,
iomap_do_writepage(struct page *page, struct writeback_control *wbc, void *data)
		struct writeback_control *wbc, void *data)
{
{
	struct folio *folio = page_folio(page);
	struct iomap_writepage_ctx *wpc = data;
	struct iomap_writepage_ctx *wpc = data;
	struct inode *inode = folio->mapping->host;
	struct inode *inode = folio->mapping->host;
	u64 end_pos, isize;
	u64 end_pos, isize;
Loading