btrfs: prepare btrfs_page_mkwrite() for large folios
[ Upstream commit 49990d8fa27d75f8ecf4ad013b13de3c4b1ff433 ] This changes the assumption that the folio is always page sized. (Although the ASSERT() for folio order is still kept as-is). Just replace the PAGE_SIZE with folio_size(). Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> Signed-off-by: Qu Wenruo <wqu@suse.com> Signed-off-by: David Sterba <dsterba@suse.com> Stable-dep-of: 17a85f520469 ("btrfs: fix wrong start offset for delalloc space release during mmap write") Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
cde7f94078
commit
5ff2ed0f0a
+10
-9
@@ -1912,6 +1912,7 @@ static vm_fault_t btrfs_page_mkwrite(struct vm_fault *vmf)
|
|||||||
struct extent_changeset *data_reserved = NULL;
|
struct extent_changeset *data_reserved = NULL;
|
||||||
unsigned long zero_start;
|
unsigned long zero_start;
|
||||||
loff_t size;
|
loff_t size;
|
||||||
|
size_t fsize = folio_size(folio);
|
||||||
vm_fault_t ret;
|
vm_fault_t ret;
|
||||||
int ret2;
|
int ret2;
|
||||||
int reserved = 0;
|
int reserved = 0;
|
||||||
@@ -1922,7 +1923,7 @@ static vm_fault_t btrfs_page_mkwrite(struct vm_fault *vmf)
|
|||||||
|
|
||||||
ASSERT(folio_order(folio) == 0);
|
ASSERT(folio_order(folio) == 0);
|
||||||
|
|
||||||
reserved_space = PAGE_SIZE;
|
reserved_space = fsize;
|
||||||
|
|
||||||
sb_start_pagefault(inode->i_sb);
|
sb_start_pagefault(inode->i_sb);
|
||||||
page_start = folio_pos(folio);
|
page_start = folio_pos(folio);
|
||||||
@@ -1976,7 +1977,7 @@ again:
|
|||||||
* We can't set the delalloc bits if there are pending ordered
|
* We can't set the delalloc bits if there are pending ordered
|
||||||
* extents. Drop our locks and wait for them to finish.
|
* extents. Drop our locks and wait for them to finish.
|
||||||
*/
|
*/
|
||||||
ordered = btrfs_lookup_ordered_range(BTRFS_I(inode), page_start, PAGE_SIZE);
|
ordered = btrfs_lookup_ordered_range(BTRFS_I(inode), page_start, fsize);
|
||||||
if (ordered) {
|
if (ordered) {
|
||||||
unlock_extent(io_tree, page_start, page_end, &cached_state);
|
unlock_extent(io_tree, page_start, page_end, &cached_state);
|
||||||
folio_unlock(folio);
|
folio_unlock(folio);
|
||||||
@@ -1988,11 +1989,11 @@ again:
|
|||||||
|
|
||||||
if (folio->index == ((size - 1) >> PAGE_SHIFT)) {
|
if (folio->index == ((size - 1) >> PAGE_SHIFT)) {
|
||||||
reserved_space = round_up(size - page_start, fs_info->sectorsize);
|
reserved_space = round_up(size - page_start, fs_info->sectorsize);
|
||||||
if (reserved_space < PAGE_SIZE) {
|
if (reserved_space < fsize) {
|
||||||
end = page_start + reserved_space - 1;
|
end = page_start + reserved_space - 1;
|
||||||
btrfs_delalloc_release_space(BTRFS_I(inode),
|
btrfs_delalloc_release_space(BTRFS_I(inode),
|
||||||
data_reserved, page_start,
|
data_reserved, page_start,
|
||||||
PAGE_SIZE - reserved_space, true);
|
fsize - reserved_space, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2019,12 +2020,12 @@ again:
|
|||||||
if (page_start + folio_size(folio) > size)
|
if (page_start + folio_size(folio) > size)
|
||||||
zero_start = offset_in_folio(folio, size);
|
zero_start = offset_in_folio(folio, size);
|
||||||
else
|
else
|
||||||
zero_start = PAGE_SIZE;
|
zero_start = fsize;
|
||||||
|
|
||||||
if (zero_start != PAGE_SIZE)
|
if (zero_start != fsize)
|
||||||
folio_zero_range(folio, zero_start, folio_size(folio) - zero_start);
|
folio_zero_range(folio, zero_start, folio_size(folio) - zero_start);
|
||||||
|
|
||||||
btrfs_folio_clear_checked(fs_info, folio, page_start, PAGE_SIZE);
|
btrfs_folio_clear_checked(fs_info, folio, page_start, fsize);
|
||||||
btrfs_folio_set_dirty(fs_info, folio, page_start, end + 1 - page_start);
|
btrfs_folio_set_dirty(fs_info, folio, page_start, end + 1 - page_start);
|
||||||
btrfs_folio_set_uptodate(fs_info, folio, page_start, end + 1 - page_start);
|
btrfs_folio_set_uptodate(fs_info, folio, page_start, end + 1 - page_start);
|
||||||
|
|
||||||
@@ -2033,7 +2034,7 @@ again:
|
|||||||
unlock_extent(io_tree, page_start, page_end, &cached_state);
|
unlock_extent(io_tree, page_start, page_end, &cached_state);
|
||||||
up_read(&BTRFS_I(inode)->i_mmap_lock);
|
up_read(&BTRFS_I(inode)->i_mmap_lock);
|
||||||
|
|
||||||
btrfs_delalloc_release_extents(BTRFS_I(inode), PAGE_SIZE);
|
btrfs_delalloc_release_extents(BTRFS_I(inode), fsize);
|
||||||
sb_end_pagefault(inode->i_sb);
|
sb_end_pagefault(inode->i_sb);
|
||||||
extent_changeset_free(data_reserved);
|
extent_changeset_free(data_reserved);
|
||||||
return VM_FAULT_LOCKED;
|
return VM_FAULT_LOCKED;
|
||||||
@@ -2042,7 +2043,7 @@ out_unlock:
|
|||||||
folio_unlock(folio);
|
folio_unlock(folio);
|
||||||
up_read(&BTRFS_I(inode)->i_mmap_lock);
|
up_read(&BTRFS_I(inode)->i_mmap_lock);
|
||||||
out:
|
out:
|
||||||
btrfs_delalloc_release_extents(BTRFS_I(inode), PAGE_SIZE);
|
btrfs_delalloc_release_extents(BTRFS_I(inode), fsize);
|
||||||
btrfs_delalloc_release_space(BTRFS_I(inode), data_reserved, page_start,
|
btrfs_delalloc_release_space(BTRFS_I(inode), data_reserved, page_start,
|
||||||
reserved_space, (ret != 0));
|
reserved_space, (ret != 0));
|
||||||
out_noreserve:
|
out_noreserve:
|
||||||
|
|||||||
Reference in New Issue
Block a user