diff options
Diffstat (limited to 'fs/btrfs/file.c')
| -rw-r--r-- | fs/btrfs/file.c | 29 | 
1 files changed, 12 insertions, 17 deletions
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index 859ba2dd889..e8d06b6b919 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c @@ -1605,6 +1605,14 @@ static long btrfs_fallocate(struct file *file, int mode,  		return -EOPNOTSUPP;  	/* +	 * Make sure we have enough space before we do the +	 * allocation. +	 */ +	ret = btrfs_check_data_free_space(inode, len); +	if (ret) +		return ret; + +	/*  	 * wait for ordered IO before we have any locks.  We'll loop again  	 * below with the locks held.  	 */ @@ -1667,27 +1675,12 @@ static long btrfs_fallocate(struct file *file, int mode,  		if (em->block_start == EXTENT_MAP_HOLE ||  		    (cur_offset >= inode->i_size &&  		     !test_bit(EXTENT_FLAG_PREALLOC, &em->flags))) { - -			/* -			 * Make sure we have enough space before we do the -			 * allocation. -			 */ -			ret = btrfs_check_data_free_space(inode, last_byte - -							  cur_offset); -			if (ret) { -				free_extent_map(em); -				break; -			} -  			ret = btrfs_prealloc_file_range(inode, mode, cur_offset,  							last_byte - cur_offset,  							1 << inode->i_blkbits,  							offset + len,  							&alloc_hint); -			/* Let go of our reservation. */ -			btrfs_free_reserved_data_space(inode, last_byte - -						       cur_offset);  			if (ret < 0) {  				free_extent_map(em);  				break; @@ -1715,6 +1708,8 @@ static long btrfs_fallocate(struct file *file, int mode,  			     &cached_state, GFP_NOFS);  out:  	mutex_unlock(&inode->i_mutex); +	/* Let go of our reservation. */ +	btrfs_free_reserved_data_space(inode, len);  	return ret;  } @@ -1761,7 +1756,7 @@ static int find_desired_extent(struct inode *inode, loff_t *offset, int origin)  						     start - root->sectorsize,  						     root->sectorsize, 0);  		if (IS_ERR(em)) { -			ret = -ENXIO; +			ret = PTR_ERR(em);  			goto out;  		}  		last_end = em->start + em->len; @@ -1773,7 +1768,7 @@ static int find_desired_extent(struct inode *inode, loff_t *offset, int origin)  	while (1) {  		em = btrfs_get_extent_fiemap(inode, NULL, 0, start, len, 0);  		if (IS_ERR(em)) { -			ret = -ENXIO; +			ret = PTR_ERR(em);  			break;  		}  |