On Fri, Jun 22, 2012 at 09:24:12PM +0300, Ilya Dryomov wrote: > Fix a bug that triggered asserts in btrfs_balance() in both normal and > resume modes -- restriper state was not properly restored on read-only > mounts. This factors out resuming code from btrfs_restore_balance(), > which is now also called earlier in the mount sequence to avoid the > problem of some early writes getting the old profile. > > Signed-off-by: Ilya Dryomov <idryo...@gmail.com> > --- > diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c > index 77872da..dae7cd6 100644 > --- a/fs/btrfs/disk-io.c > +++ b/fs/btrfs/disk-io.c > @@ -2492,9 +2497,6 @@ retry_root_backup: > err = btrfs_orphan_cleanup(fs_info->tree_root); > up_read(&fs_info->cleanup_work_sem); > > - if (!err) > - err = btrfs_recover_balance(fs_info->tree_root); > - > if (err) { > close_ctree(tree_root); > return err; > @@ -2518,6 +2520,9 @@ fail_cleaner: > fail_block_groups: > btrfs_free_block_groups(fs_info); > > +fail_balance_ctl: > + kfree(fs_info->balance_ctl);
I think you need to set fs_info->balance_ctl to NULL, otherwise this could lead to double free from free_fs_info. I was looking along the call paths and didn't see free_fs_info called on the mount failure path: vfs->mount btrfs_mount btrfs_fill_super open_ctree (recover balance fails, frees ctl) error is propagated back to vfs, no other fs callback is done (like kill_super which does call free_fs_info). The only exit path that is not going through free_fs_info is after error from btrfs_fill_super, and this can fail from various reasons. Either I'm missing something, or we leak a btrfs_fs_info every time a mount fails ... Back to your patch, apart from the balance_ctl pointer reset, both are ok and given the number of bug reports [useless padding text here] this should go to 3.5-rc. david -- 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