Loading fs/btrfs/extent_io.c +22 −15 Original line number Diff line number Diff line Loading @@ -1731,28 +1731,22 @@ STATIC u64 find_lock_delalloc_range(struct inode *inode, return found; } void extent_clear_unlock_delalloc(struct inode *inode, u64 start, u64 end, u64 delalloc_end, struct page *locked_page, unsigned clear_bits, static void __process_pages_contig(struct address_space *mapping, struct page *locked_page, pgoff_t start_index, pgoff_t end_index, unsigned long page_ops) { struct extent_io_tree *tree = &BTRFS_I(inode)->io_tree; int ret; unsigned long nr_pages = end_index - start_index + 1; pgoff_t index = start_index; struct page *pages[16]; unsigned long index = start >> PAGE_SHIFT; unsigned long end_index = end >> PAGE_SHIFT; unsigned long nr_pages = end_index - index + 1; unsigned ret; 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) mapping_set_error(inode->i_mapping, -EIO); mapping_set_error(mapping, -EIO); while (nr_pages > 0) { ret = find_get_pages_contig(inode->i_mapping, index, ret = find_get_pages_contig(mapping, index, min_t(unsigned long, nr_pages, ARRAY_SIZE(pages)), pages); for (i = 0; i < ret; i++) { Loading Loading @@ -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) * set. This can be fairly slow, except for EXTENT_DIRTY which is Loading Loading
fs/btrfs/extent_io.c +22 −15 Original line number Diff line number Diff line Loading @@ -1731,28 +1731,22 @@ STATIC u64 find_lock_delalloc_range(struct inode *inode, return found; } void extent_clear_unlock_delalloc(struct inode *inode, u64 start, u64 end, u64 delalloc_end, struct page *locked_page, unsigned clear_bits, static void __process_pages_contig(struct address_space *mapping, struct page *locked_page, pgoff_t start_index, pgoff_t end_index, unsigned long page_ops) { struct extent_io_tree *tree = &BTRFS_I(inode)->io_tree; int ret; unsigned long nr_pages = end_index - start_index + 1; pgoff_t index = start_index; struct page *pages[16]; unsigned long index = start >> PAGE_SHIFT; unsigned long end_index = end >> PAGE_SHIFT; unsigned long nr_pages = end_index - index + 1; unsigned ret; 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) mapping_set_error(inode->i_mapping, -EIO); mapping_set_error(mapping, -EIO); while (nr_pages > 0) { ret = find_get_pages_contig(inode->i_mapping, index, ret = find_get_pages_contig(mapping, index, min_t(unsigned long, nr_pages, ARRAY_SIZE(pages)), pages); for (i = 0; i < ret; i++) { Loading Loading @@ -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) * set. This can be fairly slow, except for EXTENT_DIRTY which is Loading