Re: [PATCH 1/2] Btrfs: fix space leak when skipping small extents during trimming

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tuesday, June 21, 2011 01:49:19 PM Li Zefan wrote:
> We're taking a free space extent out of the free space cache, trimming
> it and then putting it back into the cache.
> 
sorry for the late reply, I can hardly to find time look at this.
> However for an extent that is smaller than the specified minimum length,
> it's taken out but won't be put back, which causes space leak.
yes, you are correct, and the fix looks good to me, Thanks
> 
> Signed-off-by: Li Zefan <lizf@xxxxxxxxxxxxxx>
> ---
> 
> Unfortunately I have no trim-able device to test the patch.
> 
> ---
>  fs/btrfs/free-space-cache.c |   34 +++++++++++++++++-----------------
>  1 files changed, 17 insertions(+), 17 deletions(-)
> 
> diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c
> index 9f985a4..292c0d9 100644
> --- a/fs/btrfs/free-space-cache.c
> +++ b/fs/btrfs/free-space-cache.c
> @@ -2460,6 +2460,7 @@ int btrfs_trim_block_group(struct btrfs_block_group_cache *block_group,
>  	u64 bytes = 0;
>  	u64 actually_trimmed;
>  	int ret = 0;
> +	int update_ret;
>  
>  	*trimmed = 0;
>  
> @@ -2483,6 +2484,7 @@ int btrfs_trim_block_group(struct btrfs_block_group_cache *block_group,
>  		}
>  
>  		if (entry->bitmap) {
> +			bytes = 0;
>  			ret = search_bitmap(ctl, entry, &start, &bytes);
>  			if (!ret) {
>  				if (start >= end) {
> @@ -2490,6 +2492,8 @@ int btrfs_trim_block_group(struct btrfs_block_group_cache *block_group,
>  					break;
>  				}
>  				bytes = min(bytes, end - start);
> +				if (bytes < minlen)
> +					goto next;
>  				bitmap_clear_bits(ctl, entry, start, bytes);
>  				if (entry->bytes == 0)
>  					free_bitmap(ctl, entry);
> @@ -2503,33 +2507,29 @@ int btrfs_trim_block_group(struct btrfs_block_group_cache *block_group,
>  		} else {
>  			start = entry->offset;
>  			bytes = min(entry->bytes, end - start);
> +			if (bytes < minlen)
> +				goto next;
>  			unlink_free_space(ctl, entry);
>  			kmem_cache_free(btrfs_free_space_cachep, entry);
>  		}
>  
>  		spin_unlock(&ctl->tree_lock);
>  
> -		if (bytes >= minlen) {
> -			int update_ret;
> -			update_ret = btrfs_update_reserved_bytes(block_group,
> -								 bytes, 1, 1);
> +		update_ret = btrfs_update_reserved_bytes(block_group,
> +							 bytes, 1, 1);
>  
> -			ret = btrfs_error_discard_extent(fs_info->extent_root,
> -							 start,
> -							 bytes,
> -							 &actually_trimmed);
> +		ret = btrfs_error_discard_extent(fs_info->extent_root, start,
> +						 bytes, &actually_trimmed);
>  
> -			btrfs_add_free_space(block_group, start, bytes);
> -			if (!update_ret)
> -				btrfs_update_reserved_bytes(block_group,
> -							    bytes, 0, 1);
> +		btrfs_add_free_space(block_group, start, bytes);
> +		if (!update_ret)
> +			btrfs_update_reserved_bytes(block_group, bytes, 0, 1);
>  
> -			if (ret)
> -				break;
> -			*trimmed += actually_trimmed;
> -		}
> +		if (ret)
> +			break;
> +		*trimmed += actually_trimmed;
> +next:
>  		start += bytes;
> -		bytes = 0;
>  
>  		if (fatal_signal_pending(current)) {
>  			ret = -ERESTARTSYS;
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Filesystem Development]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux