Commit 190662b2 authored by Chris Mason's avatar Chris Mason
Browse files

Btrfs: Fix delayed allocation to avoid missing delalloc extents



find_lock_delalloc_range could exit out too early

Signed-off-by: default avatarChris Mason <chris.mason@oracle.com>
parent 4aec2b52
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -1070,6 +1070,7 @@ u64 find_lock_delalloc_range(struct extent_map_tree *tree,
search_again:
	node = tree_search(&tree->state, cur_start);
	if (!node || IS_ERR(node)) {
		*end = (u64)-1;
		goto out;
	}

@@ -1079,6 +1080,8 @@ search_again:
			goto out;
		}
		if (!(state->state & EXTENT_DELALLOC)) {
			if (!found)
				*end = state->end;
			goto out;
		}
		if (!found) {
@@ -1841,8 +1844,10 @@ static int __extent_writepage(struct page *page, struct writeback_control *wbc,
		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,
+1 −0
Original line number Diff line number Diff line
@@ -798,6 +798,7 @@ static int btrfs_cow_one_page(struct inode *inode, struct page *page,
	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);