On Thu, Jun 23, 2011 at 03:54:26PM -0400, Josef Bacik wrote:
> A user reported this bug again where we have more bitmaps than we are supposed
> to.  This is because we failed to load the free space cache, but don't update
> the ctl->total_bitmaps counter when we remove entries from the tree.  This 
> patch
> fixes this problem and we should be good to go again.  Thanks,
> 
> Signed-off-by: Josef Bacik <jo...@redhat.com>
> ---
> V1->V2: made the patch actually correct
>  fs/btrfs/free-space-cache.c |    6 +++++-
>  1 files changed, 5 insertions(+), 1 deletions(-)
> 
> diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c
> index 3c1a047..e7987f9 100644
> --- a/fs/btrfs/free-space-cache.c
> +++ b/fs/btrfs/free-space-cache.c
> @@ -1843,7 +1843,11 @@ void __btrfs_remove_free_space_cache_locked(struct 
> btrfs_free_space_ctl *ctl)
>       while ((node = rb_last(&ctl->free_space_offset)) != NULL) {
>               info = rb_entry(node, struct btrfs_free_space, offset_index);
>               unlink_free_space(ctl, info);
> -             kfree(info->bitmap);
> +             if (info->bitmap) {
> +                     kfree(info->bitmap);
> +                     ctl->total_bitmaps--;
> +                     ctl->op->recalc_thresholds(ctl);
> +             }

this was a result of incorrect merge resolution in
0965537308ac3b267ea16e731bd73870a51c53b8:

additions:

+       while ((node = rb_last(&ctl->free_space_offset)) != NULL) {
+               info = rb_entry(node, struct btrfs_free_space, offset_index);
+               unlink_free_space(ctl, info);
+               kfree(info->bitmap);
+               kmem_cache_free(btrfs_free_space_cachep, info);
+               if (need_resched()) {
+                       spin_unlock(&ctl->tree_lock);
+                       cond_resched();
+                       spin_lock(&ctl->tree_lock);
+               }
+       }

and removals:

-       while ((node = rb_last(&block_group->free_space_offset)) != NULL) {
-               info = rb_entry(node, struct btrfs_free_space, offset_index);
-               if (!info->bitmap) {
-                       unlink_free_space(block_group, info);
-                       kmem_cache_free(btrfs_free_space_cachep, info);
-               } else {
-                       free_bitmap(block_group, info);
-               }
-
-               if (need_resched()) {
-                       spin_unlock(&block_group->tree_lock);
-                       cond_resched();
-                       spin_lock(&block_group->tree_lock);
-               }
-       }


see the free_bitmap disappear? Please use this helper in your patch.

(And no, I was not keeping this for myself until now, I saw this code recently
but did not notice there's a bug, your patch just rang a bell)


david

>               kmem_cache_free(btrfs_free_space_cachep, info);
>               if (need_resched()) {
>                       spin_unlock(&ctl->tree_lock);
> -- 
> 1.7.2.3
> 
> --
> 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
--
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