Skip to content

Commit 9ea0e45

Browse files
Matthew Wilcoxtytso
authored andcommitted
ext4: Use a folio in ext4_page_mkwrite()
Convert to the folio API, saving a few calls to compound_head(). Signed-off-by: Matthew Wilcox (Oracle) <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Theodore Ts'o <[email protected]>
1 parent 86b38c2 commit 9ea0e45

File tree

1 file changed

+20
-22
lines changed

1 file changed

+20
-22
lines changed

fs/ext4/inode.c

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6075,7 +6075,7 @@ static int ext4_bh_unmapped(handle_t *handle, struct inode *inode,
60756075
vm_fault_t ext4_page_mkwrite(struct vm_fault *vmf)
60766076
{
60776077
struct vm_area_struct *vma = vmf->vma;
6078-
struct page *page = vmf->page;
6078+
struct folio *folio = page_folio(vmf->page);
60796079
loff_t size;
60806080
unsigned long len;
60816081
int err;
@@ -6119,37 +6119,36 @@ vm_fault_t ext4_page_mkwrite(struct vm_fault *vmf)
61196119
goto out_ret;
61206120
}
61216121

6122-
lock_page(page);
6122+
folio_lock(folio);
61236123
size = i_size_read(inode);
61246124
/* Page got truncated from under us? */
6125-
if (page->mapping != mapping || page_offset(page) > size) {
6126-
unlock_page(page);
6125+
if (folio->mapping != mapping || folio_pos(folio) > size) {
6126+
folio_unlock(folio);
61276127
ret = VM_FAULT_NOPAGE;
61286128
goto out;
61296129
}
61306130

6131-
if (page->index == size >> PAGE_SHIFT)
6132-
len = size & ~PAGE_MASK;
6133-
else
6134-
len = PAGE_SIZE;
6131+
len = folio_size(folio);
6132+
if (folio_pos(folio) + len > size)
6133+
len = size - folio_pos(folio);
61356134
/*
61366135
* Return if we have all the buffers mapped. This avoids the need to do
61376136
* journal_start/journal_stop which can block and take a long time
61386137
*
61396138
* This cannot be done for data journalling, as we have to add the
61406139
* inode to the transaction's list to writeprotect pages on commit.
61416140
*/
6142-
if (page_has_buffers(page)) {
6143-
if (!ext4_walk_page_buffers(NULL, inode, page_buffers(page),
6141+
if (folio_buffers(folio)) {
6142+
if (!ext4_walk_page_buffers(NULL, inode, folio_buffers(folio),
61446143
0, len, NULL,
61456144
ext4_bh_unmapped)) {
61466145
/* Wait so that we don't change page under IO */
6147-
wait_for_stable_page(page);
6146+
folio_wait_stable(folio);
61486147
ret = VM_FAULT_LOCKED;
61496148
goto out;
61506149
}
61516150
}
6152-
unlock_page(page);
6151+
folio_unlock(folio);
61536152
/* OK, we need to fill the hole... */
61546153
if (ext4_should_dioread_nolock(inode))
61556154
get_block = ext4_get_block_unwritten;
@@ -6170,26 +6169,25 @@ vm_fault_t ext4_page_mkwrite(struct vm_fault *vmf)
61706169
if (!ext4_should_journal_data(inode)) {
61716170
err = block_page_mkwrite(vma, vmf, get_block);
61726171
} else {
6173-
lock_page(page);
6172+
folio_lock(folio);
61746173
size = i_size_read(inode);
61756174
/* Page got truncated from under us? */
6176-
if (page->mapping != mapping || page_offset(page) > size) {
6175+
if (folio->mapping != mapping || folio_pos(folio) > size) {
61776176
ret = VM_FAULT_NOPAGE;
61786177
goto out_error;
61796178
}
61806179

6181-
if (page->index == size >> PAGE_SHIFT)
6182-
len = size & ~PAGE_MASK;
6183-
else
6184-
len = PAGE_SIZE;
6180+
len = folio_size(folio);
6181+
if (folio_pos(folio) + len > size)
6182+
len = size - folio_pos(folio);
61856183

6186-
err = __block_write_begin(page, 0, len, ext4_get_block);
6184+
err = __block_write_begin(&folio->page, 0, len, ext4_get_block);
61876185
if (!err) {
61886186
ret = VM_FAULT_SIGBUS;
6189-
if (ext4_journal_page_buffers(handle, page, len))
6187+
if (ext4_journal_page_buffers(handle, &folio->page, len))
61906188
goto out_error;
61916189
} else {
6192-
unlock_page(page);
6190+
folio_unlock(folio);
61936191
}
61946192
}
61956193
ext4_journal_stop(handle);
@@ -6202,7 +6200,7 @@ vm_fault_t ext4_page_mkwrite(struct vm_fault *vmf)
62026200
sb_end_pagefault(inode->i_sb);
62036201
return ret;
62046202
out_error:
6205-
unlock_page(page);
6203+
folio_unlock(folio);
62066204
ext4_journal_stop(handle);
62076205
goto out;
62086206
}

0 commit comments

Comments
 (0)