Browse Source

Btrfs: Reorder tests in set_extent_bit to properly find holes

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>
Chris Mason 17 years ago
parent
commit
a8c450b211
1 changed files with 22 additions and 22 deletions
  1. 22 22
      fs/btrfs/extent_map.c

+ 22 - 22
fs/btrfs/extent_map.c

@@ -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: