2023-04-16 18:41:35

by Ritesh Harjani

[permalink] [raw]
Subject: [RFCv1 4/4] ext4: Make ext4_write_inline_data_end() use folio

ext4_write_inline_data_end() is completely converted to work with folio.
Also all callers of ext4_write_inline_data_end() already works on folio
except ext4_da_write_end(). Mostly for consistency and saving few
instructions maybe, this patch just converts ext4_da_write_end() to work
with folio which makes the last caller of ext4_write_inline_data_end()
also converted to work with folio.
We then make ext4_write_inline_data_end() take folio instead of page.

Signed-off-by: Ritesh Harjani (IBM) <[email protected]>
---
fs/ext4/ext4.h | 6 ++----
fs/ext4/inline.c | 3 +--
fs/ext4/inode.c | 23 ++++++++++++++---------
3 files changed, 17 insertions(+), 15 deletions(-)

diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
index b00597b41c96..081f04ea2be0 100644
--- a/fs/ext4/ext4.h
+++ b/fs/ext4/ext4.h
@@ -3554,10 +3554,8 @@ extern int ext4_try_to_write_inline_data(struct address_space *mapping,
struct inode *inode,
loff_t pos, unsigned len,
struct page **pagep);
-extern int ext4_write_inline_data_end(struct inode *inode,
- loff_t pos, unsigned len,
- unsigned copied,
- struct page *page);
+int ext4_write_inline_data_end(struct inode *inode, loff_t pos, unsigned len,
+ unsigned copied, struct folio *folio);
extern int ext4_da_write_inline_data_begin(struct address_space *mapping,
struct inode *inode,
loff_t pos, unsigned len,
diff --git a/fs/ext4/inline.c b/fs/ext4/inline.c
index 062c7747bb40..eee78035c12d 100644
--- a/fs/ext4/inline.c
+++ b/fs/ext4/inline.c
@@ -730,9 +730,8 @@ int ext4_try_to_write_inline_data(struct address_space *mapping,
}

int ext4_write_inline_data_end(struct inode *inode, loff_t pos, unsigned len,
- unsigned copied, struct page *page)
+ unsigned copied, struct folio *folio)
{
- struct folio *folio = page_folio(page);
handle_t *handle = ext4_journal_current_handle();
int no_expand;
void *kaddr;
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index 3f76b06e9aa4..741e4ff63992 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -1302,7 +1302,8 @@ static int ext4_write_end(struct file *file,

if (ext4_has_inline_data(inode) &&
ext4_test_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA))
- return ext4_write_inline_data_end(inode, pos, len, copied, page);
+ return ext4_write_inline_data_end(inode, pos, len, copied,
+ folio);

copied = block_write_end(file, mapping, pos, len, copied, page, fsdata);
/*
@@ -1410,7 +1411,8 @@ static int ext4_journalled_write_end(struct file *file,
BUG_ON(!ext4_handle_valid(handle));

if (ext4_has_inline_data(inode))
- return ext4_write_inline_data_end(inode, pos, len, copied, page);
+ return ext4_write_inline_data_end(inode, pos, len, copied,
+ folio);

if (unlikely(copied < len) && !folio_test_uptodate(folio)) {
copied = 0;
@@ -2966,15 +2968,15 @@ static int ext4_da_write_begin(struct file *file, struct address_space *mapping,
* Check if we should update i_disksize
* when write to the end of file but not require block allocation
*/
-static int ext4_da_should_update_i_disksize(struct page *page,
+static int ext4_da_should_update_i_disksize(struct folio *folio,
unsigned long offset)
{
struct buffer_head *bh;
- struct inode *inode = page->mapping->host;
+ struct inode *inode = folio->mapping->host;
unsigned int idx;
int i;

- bh = page_buffers(page);
+ bh = folio_buffers(folio);
idx = offset >> inode->i_blkbits;

for (i = 0; i < idx; i++)
@@ -2994,17 +2996,19 @@ static int ext4_da_write_end(struct file *file,
loff_t new_i_size;
unsigned long start, end;
int write_mode = (int)(unsigned long)fsdata;
+ struct folio *folio = page_folio(page);

if (write_mode == FALL_BACK_TO_NONDELALLOC)
return ext4_write_end(file, mapping, pos,
- len, copied, page, fsdata);
+ len, copied, &folio->page, fsdata);

trace_ext4_da_write_end(inode, pos, len, copied);

if (write_mode != CONVERT_INLINE_DATA &&
ext4_test_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA) &&
ext4_has_inline_data(inode))
- return ext4_write_inline_data_end(inode, pos, len, copied, page);
+ return ext4_write_inline_data_end(inode, pos, len, copied,
+ folio);

start = pos & (PAGE_SIZE - 1);
end = start + copied - 1;
@@ -3025,10 +3029,11 @@ static int ext4_da_write_end(struct file *file,
*/
new_i_size = pos + copied;
if (copied && new_i_size > inode->i_size &&
- ext4_da_should_update_i_disksize(page, end))
+ ext4_da_should_update_i_disksize(folio, end))
ext4_update_i_disksize(inode, new_i_size);

- return generic_write_end(file, mapping, pos, len, copied, page, fsdata);
+ return generic_write_end(file, mapping, pos, len, copied, &folio->page,
+ fsdata);
}

/*
--
2.39.2


2023-04-16 20:10:25

by Matthew Wilcox

[permalink] [raw]
Subject: Re: [RFCv1 4/4] ext4: Make ext4_write_inline_data_end() use folio

On Mon, Apr 17, 2023 at 12:01:53AM +0530, Ritesh Harjani (IBM) wrote:
> ext4_write_inline_data_end() is completely converted to work with folio.
> Also all callers of ext4_write_inline_data_end() already works on folio
> except ext4_da_write_end(). Mostly for consistency and saving few
> instructions maybe, this patch just converts ext4_da_write_end() to work
> with folio which makes the last caller of ext4_write_inline_data_end()
> also converted to work with folio.
> We then make ext4_write_inline_data_end() take folio instead of page.
>
> Signed-off-by: Ritesh Harjani (IBM) <[email protected]>

Reviewed-by: Matthew Wilcox (Oracle) <[email protected]>