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 33f7a18dddf7b406994ecbfc3951687d4bc73da5..370ed97e52f5b047132b57fe7e0168902d56133b 100644 (file)
@@ -712,28 +712,6 @@ again:
                }
                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;
-       }
-
        /*
         * | ---- desired range ---- |
         *     | state | or               | state |
@@ -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: