Btrfs: Reorder tests in set_extent_bit to properly find holes
authorChris Mason <chris.mason@oracle.com>
Tue, 11 Sep 2007 00:00:27 +0000 (20:00 -0400)
committerDavid Woodhouse <dwmw2@hera.kernel.org>
Tue, 11 Sep 2007 00:00:27 +0000 (20:00 -0400)
Yan Zheng noticed that set_extent_bit was exiting too early when there
was a hole in the map.  The fix is to reorder the tests to check for the
hole first.

Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/extent_map.c

index 33f7a18..370ed97 100644 (file)
@@ -714,28 +714,6 @@ again:
        }
        /*
         * | ---- desired range ---- |
-        *                        | state |
-        * We need to split the extent, and set the bit
-        * on the first half
-        */
-       if (state->start <= end && state->end > end) {
-               set = state->state & bits;
-               if (exclusive && set) {
-                       *failed_start = start;
-                       err = -EEXIST;
-                       goto out;
-               }
-               err = split_state(tree, state, prealloc, end + 1);
-               BUG_ON(err == -EEXIST);
-
-               prealloc->state |= bits;
-               merge_state(tree, prealloc);
-               prealloc = NULL;
-               goto out;
-       }
-
-       /*
-        * | ---- desired range ---- |
         *     | state | or               | state |
         *
         * There's a hole, we need to insert something in it and
@@ -756,6 +734,28 @@ again:
                start = this_end + 1;
                goto search_again;
        }
+       /*
+        * | ---- desired range ---- |
+        *                        | state |
+        * We need to split the extent, and set the bit
+        * on the first half
+        */
+       if (state->start <= end && state->end > end) {
+               set = state->state & bits;
+               if (exclusive && set) {
+                       *failed_start = start;
+                       err = -EEXIST;
+                       goto out;
+               }
+               err = split_state(tree, state, prealloc, end + 1);
+               BUG_ON(err == -EEXIST);
+
+               prealloc->state |= bits;
+               merge_state(tree, prealloc);
+               prealloc = NULL;
+               goto out;
+       }
+
        goto search_again;
 
 out: