Merge branch 'xarray' of git://git.infradead.org/users/willy/linux-dax
[platform/kernel/linux-starfive.git] / fs / btrfs / extent_io.c
index d4ad015..d228f70 100644 (file)
@@ -1424,20 +1424,15 @@ int find_first_extent_bit(struct extent_io_tree *tree, u64 start,
                          struct extent_state **cached_state)
 {
        struct extent_state *state;
-       struct rb_node *n;
        int ret = 1;
 
        spin_lock(&tree->lock);
        if (cached_state && *cached_state) {
                state = *cached_state;
                if (state->end == start - 1 && extent_state_in_tree(state)) {
-                       n = rb_next(&state->rb_node);
-                       while (n) {
-                               state = rb_entry(n, struct extent_state,
-                                                rb_node);
+                       while ((state = next_state(state)) != NULL) {
                                if (state->state & bits)
                                        goto got_it;
-                               n = rb_next(n);
                        }
                        free_extent_state(*cached_state);
                        *cached_state = NULL;
@@ -1568,7 +1563,7 @@ static noinline int lock_delalloc_pages(struct inode *inode,
  *
  * 1 is returned if we find something, 0 if nothing was in the tree
  */
-STATIC u64 find_lock_delalloc_range(struct inode *inode,
+static noinline_for_stack u64 find_lock_delalloc_range(struct inode *inode,
                                    struct extent_io_tree *tree,
                                    struct page *locked_page, u64 *start,
                                    u64 *end, u64 max_bytes)
@@ -1648,6 +1643,17 @@ out_failed:
        return found;
 }
 
+#ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS
+u64 btrfs_find_lock_delalloc_range(struct inode *inode,
+                                   struct extent_io_tree *tree,
+                                   struct page *locked_page, u64 *start,
+                                   u64 *end, u64 max_bytes)
+{
+       return find_lock_delalloc_range(inode, tree, locked_page, start, end,
+                       max_bytes);
+}
+#endif
+
 static int __process_pages_contig(struct address_space *mapping,
                                  struct page *locked_page,
                                  pgoff_t start_index, pgoff_t end_index,
@@ -5163,11 +5169,11 @@ void clear_extent_buffer_dirty(struct extent_buffer *eb)
        WARN_ON(atomic_read(&eb->refs) == 0);
 }
 
-int set_extent_buffer_dirty(struct extent_buffer *eb)
+bool set_extent_buffer_dirty(struct extent_buffer *eb)
 {
        int i;
        int num_pages;
-       int was_dirty = 0;
+       bool was_dirty;
 
        check_buffer_tree_ref(eb);
 
@@ -5177,8 +5183,15 @@ int set_extent_buffer_dirty(struct extent_buffer *eb)
        WARN_ON(atomic_read(&eb->refs) == 0);
        WARN_ON(!test_bit(EXTENT_BUFFER_TREE_REF, &eb->bflags));
 
+       if (!was_dirty)
+               for (i = 0; i < num_pages; i++)
+                       set_page_dirty(eb->pages[i]);
+
+#ifdef CONFIG_BTRFS_DEBUG
        for (i = 0; i < num_pages; i++)
-               set_page_dirty(eb->pages[i]);
+               ASSERT(PageDirty(eb->pages[i]));
+#endif
+
        return was_dirty;
 }