Btrfs: create helper for processing bits on contiguous pages
authorLiu Bo <bo.li.liu@oracle.com>
Fri, 3 Feb 2017 01:49:22 +0000 (17:49 -0800)
committerDavid Sterba <dsterba@suse.com>
Tue, 14 Feb 2017 14:51:00 +0000 (15:51 +0100)
This introduces a new helper which can be used to process pages bits.

Signed-off-by: Liu Bo <bo.li.liu@oracle.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/extent_io.c

index 69c054000f0857707630ca513b90bca24d1ad43f..664f52c1c58aae0a82e99bb3376728c1b03bf040 100644 (file)
@@ -1731,28 +1731,22 @@ out_failed:
        return found;
 }
 
-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)
+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++) {
@@ -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