Btrfs: make sure we cleanup all reloc roots if error happens
authorWang Shilong <wangsl.fnst@cn.fujitsu.com>
Wed, 11 Dec 2013 11:29:52 +0000 (19:29 +0800)
committerChris Mason <clm@fb.com>
Thu, 12 Dec 2013 15:12:51 +0000 (07:12 -0800)
I hit an oops when merging reloc roots fails, the reason is that
new reloc roots may be added and we should make sure we cleanup
all reloc roots.

Signed-off-by: Wang Shilong <wangsl.fnst@cn.fujitsu.com>
Signed-off-by: Chris Mason <clm@fb.com>
fs/btrfs/relocation.c

index 0a3f025620530b93badba92bf6688de6cf92bca3..429c73c374b84f9bcd468067221bf99e0b9f67db 100644 (file)
@@ -2409,6 +2409,13 @@ out:
                btrfs_std_error(root->fs_info, ret);
                if (!list_empty(&reloc_roots))
                        free_reloc_roots(&reloc_roots);
+
+               /* new reloc root may be added */
+               mutex_lock(&root->fs_info->reloc_mutex);
+               list_splice_init(&rc->reloc_roots, &reloc_roots);
+               mutex_unlock(&root->fs_info->reloc_mutex);
+               if (!list_empty(&reloc_roots))
+                       free_reloc_roots(&reloc_roots);
        }
 
        BUG_ON(!RB_EMPTY_ROOT(&rc->reloc_root_tree.rb_root));