]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - fs/btrfs/extent_io.c
Merge tag 'kvm-5.6-2' of git://git.kernel.org/pub/scm/virt/kvm/kvm
[linux.git] / fs / btrfs / extent_io.c
index 8ff17bc30d5a032c557efe43b236e6597be0970b..c0f202741e092cfdd126ee001f4dfe93dc322030 100644 (file)
@@ -1593,21 +1593,25 @@ void find_first_clear_extent_bit(struct extent_io_tree *tree, u64 start,
        /* Find first extent with bits cleared */
        while (1) {
                node = __etree_search(tree, start, &next, &prev, NULL, NULL);
-               if (!node) {
+               if (!node && !next && !prev) {
+                       /*
+                        * Tree is completely empty, send full range and let
+                        * caller deal with it
+                        */
+                       *start_ret = 0;
+                       *end_ret = -1;
+                       goto out;
+               } else if (!node && !next) {
+                       /*
+                        * We are past the last allocated chunk, set start at
+                        * the end of the last extent.
+                        */
+                       state = rb_entry(prev, struct extent_state, rb_node);
+                       *start_ret = state->end + 1;
+                       *end_ret = -1;
+                       goto out;
+               } else if (!node) {
                        node = next;
-                       if (!node) {
-                               /*
-                                * We are past the last allocated chunk,
-                                * set start at the end of the last extent. The
-                                * device alloc tree should never be empty so
-                                * prev is always set.
-                                */
-                               ASSERT(prev);
-                               state = rb_entry(prev, struct extent_state, rb_node);
-                               *start_ret = state->end + 1;
-                               *end_ret = -1;
-                               goto out;
-                       }
                }
                /*
                 * At this point 'node' either contains 'start' or start is
@@ -3438,11 +3442,7 @@ static noinline_for_stack int __extent_writepage_io(struct inode *inode,
        ret = btrfs_writepage_cow_fixup(page, start, page_end);
        if (ret) {
                /* Fixup worker will requeue */
-               if (ret == -EBUSY)
-                       wbc->pages_skipped++;
-               else
-                       redirty_page_for_writepage(wbc, page);
-
+               redirty_page_for_writepage(wbc, page);
                update_nr_written(wbc, nr_written);
                unlock_page(page);
                return 1;