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 <l...@cn.fujitsu.com>
> ---
> 
> 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 majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to