Btrfs: Fix delayed allocation to avoid missing delalloc extents

find_lock_delalloc_range could exit out too early

Signed-off-by: Chris Mason <chris.mason@oracle.com>
diff --git a/fs/btrfs/extent_map.c b/fs/btrfs/extent_map.c
index 0d1e59a..a0dff34 100644
--- a/fs/btrfs/extent_map.c
+++ b/fs/btrfs/extent_map.c
@@ -1070,6 +1070,7 @@
 search_again:
 	node = tree_search(&tree->state, cur_start);
 	if (!node || IS_ERR(node)) {
+		*end = (u64)-1;
 		goto out;
 	}
 
@@ -1079,6 +1080,8 @@
 			goto out;
 		}
 		if (!(state->state & EXTENT_DELALLOC)) {
+			if (!found)
+				*end = state->end;
 			goto out;
 		}
 		if (!found) {
@@ -1841,8 +1844,10 @@
 		nr_delalloc = find_lock_delalloc_range(tree, &delalloc_start,
 						       &delalloc_end,
 						       128 * 1024 * 1024);
-		if (nr_delalloc <= 0)
-			break;
+		if (nr_delalloc == 0) {
+			delalloc_start = delalloc_end + 1;
+			continue;
+		}
 		tree->ops->fill_delalloc(inode, delalloc_start,
 					 delalloc_end);
 		clear_extent_bit(tree, delalloc_start,
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 1e725a4..55b2e14 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -798,6 +798,7 @@
 	u64 page_start = (u64)page->index << PAGE_CACHE_SHIFT;
 	u64 page_end = page_start + PAGE_CACHE_SIZE - 1;
 
+	WARN_ON(!PageLocked(page));
 	set_page_extent_mapped(page);
 
 	lock_extent(em_tree, page_start, page_end, GFP_NOFS);