diff options
Diffstat (limited to 'fs/btrfs/file.c')
| -rw-r--r-- | fs/btrfs/file.c | 60 | 
1 files changed, 2 insertions, 58 deletions
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index 0ff659455b1e..4373da7bcc0d 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c @@ -452,46 +452,6 @@ static void btrfs_drop_pages(struct page **pages, size_t num_pages)  	}  } -static int btrfs_find_new_delalloc_bytes(struct btrfs_inode *inode, -					 const u64 start, -					 const u64 len, -					 struct extent_state **cached_state) -{ -	u64 search_start = start; -	const u64 end = start + len - 1; - -	while (search_start < end) { -		const u64 search_len = end - search_start + 1; -		struct extent_map *em; -		u64 em_len; -		int ret = 0; - -		em = btrfs_get_extent(inode, NULL, 0, search_start, search_len); -		if (IS_ERR(em)) -			return PTR_ERR(em); - -		if (em->block_start != EXTENT_MAP_HOLE) -			goto next; - -		em_len = em->len; -		if (em->start < search_start) -			em_len -= search_start - em->start; -		if (em_len > search_len) -			em_len = search_len; - -		ret = set_extent_bit(&inode->io_tree, search_start, -				     search_start + em_len - 1, -				     EXTENT_DELALLOC_NEW, -				     NULL, cached_state, GFP_NOFS); -next: -		search_start = extent_map_end(em); -		free_extent_map(em); -		if (ret) -			return ret; -	} -	return 0; -} -  /*   * after copy_from_user, pages need to be dirtied and we need to make   * sure holes are created between the current EOF and the start of @@ -528,23 +488,6 @@ int btrfs_dirty_pages(struct btrfs_inode *inode, struct page **pages,  			 EXTENT_DELALLOC | EXTENT_DO_ACCOUNTING | EXTENT_DEFRAG,  			 0, 0, cached); -	if (!btrfs_is_free_space_inode(inode)) { -		if (start_pos >= isize && -		    !(inode->flags & BTRFS_INODE_PREALLOC)) { -			/* -			 * There can't be any extents following eof in this case -			 * so just set the delalloc new bit for the range -			 * directly. -			 */ -			extra_bits |= EXTENT_DELALLOC_NEW; -		} else { -			err = btrfs_find_new_delalloc_bytes(inode, start_pos, -							    num_bytes, cached); -			if (err) -				return err; -		} -	} -  	err = btrfs_set_extent_delalloc(inode, start_pos, end_of_last_block,  					extra_bits, cached);  	if (err) @@ -3628,7 +3571,8 @@ static ssize_t btrfs_file_read_iter(struct kiocb *iocb, struct iov_iter *to)  		inode_lock_shared(inode);  		ret = btrfs_direct_IO(iocb, to);  		inode_unlock_shared(inode); -		if (ret < 0) +		if (ret < 0 || !iov_iter_count(to) || +		    iocb->ki_pos >= i_size_read(file_inode(iocb->ki_filp)))  			return ret;  	}  | 
