Commit 873695b3 authored by Liu Bo's avatar Liu Bo Committed by David Sterba

Btrfs: create helper for processing bits on contiguous pages

This introduces a new helper which can be used to process pages bits.
Signed-off-by: default avatarLiu Bo <bo.li.liu@oracle.com>
Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent e4c3b2dc
...@@ -1731,28 +1731,22 @@ STATIC u64 find_lock_delalloc_range(struct inode *inode, ...@@ -1731,28 +1731,22 @@ STATIC u64 find_lock_delalloc_range(struct inode *inode,
return found; return found;
} }
void extent_clear_unlock_delalloc(struct inode *inode, u64 start, u64 end, static void __process_pages_contig(struct address_space *mapping,
u64 delalloc_end, struct page *locked_page, struct page *locked_page,
unsigned clear_bits, pgoff_t start_index, pgoff_t end_index,
unsigned long page_ops) unsigned long page_ops)
{ {
struct extent_io_tree *tree = &BTRFS_I(inode)->io_tree; unsigned long nr_pages = end_index - start_index + 1;
int ret; pgoff_t index = start_index;
struct page *pages[16]; struct page *pages[16];
unsigned long index = start >> PAGE_SHIFT; unsigned ret;
unsigned long end_index = end >> PAGE_SHIFT;
unsigned long nr_pages = end_index - index + 1;
int i; int i;
clear_extent_bit(tree, start, end, clear_bits, 1, 0, NULL, GFP_NOFS);
if (page_ops == 0)
return;
if ((page_ops & PAGE_SET_ERROR) && nr_pages > 0) if ((page_ops & PAGE_SET_ERROR) && nr_pages > 0)
mapping_set_error(inode->i_mapping, -EIO); mapping_set_error(mapping, -EIO);
while (nr_pages > 0) { while (nr_pages > 0) {
ret = find_get_pages_contig(inode->i_mapping, index, ret = find_get_pages_contig(mapping, index,
min_t(unsigned long, min_t(unsigned long,
nr_pages, ARRAY_SIZE(pages)), pages); nr_pages, ARRAY_SIZE(pages)), pages);
for (i = 0; i < ret; i++) { for (i = 0; i < ret; i++) {
...@@ -1782,6 +1776,19 @@ void extent_clear_unlock_delalloc(struct inode *inode, u64 start, u64 end, ...@@ -1782,6 +1776,19 @@ void extent_clear_unlock_delalloc(struct inode *inode, u64 start, u64 end,
} }
} }
void extent_clear_unlock_delalloc(struct inode *inode, u64 start, u64 end,
u64 delalloc_end, struct page *locked_page,
unsigned clear_bits,
unsigned long page_ops)
{
clear_extent_bit(&BTRFS_I(inode)->io_tree, start, end, clear_bits, 1, 0,
NULL, GFP_NOFS);
__process_pages_contig(inode->i_mapping, locked_page,
start >> PAGE_SHIFT, end >> PAGE_SHIFT,
page_ops);
}
/* /*
* count the number of bytes in the tree that have a given bit(s) * count the number of bytes in the tree that have a given bit(s)
* set. This can be fairly slow, except for EXTENT_DIRTY which is * set. This can be fairly slow, except for EXTENT_DIRTY which is
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment