Эх сурвалжийг харах

Btrfs: Use invalidatepage when writepage finds a page outside of i_size

With all the recent fixes to the delalloc locking, it is now safe
again to use invalidatepage inside the writepage code for
pages outside of i_size.  This used to deadlock against some of the
code to write locked ranges of pages, but all of that has been fixed.

Signed-off-by: Chris Mason <chris.mason@oracle.com>
Chris Mason 16 жил өмнө
parent
commit
39be25cd89

+ 1 - 5
fs/btrfs/extent_io.c

@@ -2174,11 +2174,7 @@ static int __extent_writepage(struct page *page, struct writeback_control *wbc,
 	pg_offset = i_size & (PAGE_CACHE_SIZE - 1);
 	pg_offset = i_size & (PAGE_CACHE_SIZE - 1);
 	if (page->index > end_index ||
 	if (page->index > end_index ||
 	   (page->index == end_index && !pg_offset)) {
 	   (page->index == end_index && !pg_offset)) {
-		if (epd->extent_locked) {
-			if (tree->ops && tree->ops->writepage_end_io_hook)
-				tree->ops->writepage_end_io_hook(page, start,
-							 page_end, NULL, 1);
-		}
+		page->mapping->a_ops->invalidatepage(page, 0);
 		unlock_page(page);
 		unlock_page(page);
 		return 0;
 		return 0;
 	}
 	}

+ 1 - 0
fs/btrfs/file-item.c

@@ -185,6 +185,7 @@ int btrfs_lookup_bio_sums(struct btrfs_root *root, struct inode *inode,
 				       "%llu\n", inode->i_ino,
 				       "%llu\n", inode->i_ino,
 				       (unsigned long long)offset);
 				       (unsigned long long)offset);
 				item = NULL;
 				item = NULL;
+				btrfs_release_path(root, path);
 				goto found;
 				goto found;
 			}
 			}
 			btrfs_item_key_to_cpu(path->nodes[0], &found_key,
 			btrfs_item_key_to_cpu(path->nodes[0], &found_key,