Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a94733d0 authored by Josef Bacik's avatar Josef Bacik Committed by Chris Mason
Browse files

Btrfs: use find_or_create_page instead of grab_cache_page



grab_cache_page will use mapping_gfp_mask(), which for all inodes is set to
GFP_HIGHUSER_MOVABLE.  So instead use find_or_create_page in all cases where we
need GFP_NOFS so we don't deadlock.  Thanks,

Signed-off-by: default avatarJosef Bacik <josef@redhat.com>
parent bab39bf9
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -1081,7 +1081,8 @@ static noinline int prepare_pages(struct btrfs_root *root, struct file *file,

again:
	for (i = 0; i < num_pages; i++) {
		pages[i] = grab_cache_page(inode->i_mapping, index + i);
		pages[i] = find_or_create_page(inode->i_mapping, index + i,
					       GFP_NOFS);
		if (!pages[i]) {
			faili = i - 1;
			err = -ENOMEM;
+2 −2
Original line number Diff line number Diff line
@@ -307,7 +307,7 @@ int __load_free_space_cache(struct btrfs_root *root, struct inode *inode,
		if (!num_entries && !num_bitmaps)
			break;

		page = grab_cache_page(inode->i_mapping, index);
		page = find_or_create_page(inode->i_mapping, index, GFP_NOFS);
		if (!page)
			goto free_cache;

@@ -594,7 +594,7 @@ int __btrfs_write_out_cache(struct btrfs_root *root, struct inode *inode,
	 * know and don't freak out.
	 */
	while (index < num_pages) {
		page = grab_cache_page(inode->i_mapping, index);
		page = find_or_create_page(inode->i_mapping, index, GFP_NOFS);
		if (!page) {
			int i;

+1 −1
Original line number Diff line number Diff line
@@ -3398,7 +3398,7 @@ static int btrfs_truncate_page(struct address_space *mapping, loff_t from)

	ret = -ENOMEM;
again:
	page = grab_cache_page(mapping, index);
	page = find_or_create_page(mapping, index, GFP_NOFS);
	if (!page) {
		btrfs_delalloc_release_space(inode, PAGE_CACHE_SIZE);
		goto out;
+2 −2
Original line number Diff line number Diff line
@@ -867,8 +867,8 @@ static int cluster_pages_for_defrag(struct inode *inode,
	/* step one, lock all the pages */
	for (i = 0; i < num_pages; i++) {
		struct page *page;
		page = grab_cache_page(inode->i_mapping,
					    start_index + i);
		page = find_or_create_page(inode->i_mapping,
					    start_index + i, GFP_NOFS);
		if (!page)
			break;

+2 −1
Original line number Diff line number Diff line
@@ -2955,7 +2955,8 @@ static int relocate_file_extent_cluster(struct inode *inode,
			page_cache_sync_readahead(inode->i_mapping,
						  ra, NULL, index,
						  last_index + 1 - index);
			page = grab_cache_page(inode->i_mapping, index);
			page = find_or_create_page(inode->i_mapping, index,
						   GFP_NOFS);
			if (!page) {
				btrfs_delalloc_release_metadata(inode,
							PAGE_CACHE_SIZE);