From: Joe Thornber dm thin metadata: tidy up error path in __open_metadata and __format_metadata Code tidy. Signed-off-by: Joe Thornber Signed-off-by: Mike Snitzer --- drivers/md/dm-thin-metadata.c | 43 ++++++++++++++++++++---------------------- 1 file changed, 21 insertions(+), 22 deletions(-) Index: linux-3.5-rc7/drivers/md/dm-thin-metadata.c =================================================================== --- linux-3.5-rc7.orig/drivers/md/dm-thin-metadata.c +++ linux-3.5-rc7/drivers/md/dm-thin-metadata.c @@ -500,37 +500,39 @@ static int __format_metadata(struct dm_p if (IS_ERR(pmd->data_sm)) { DMERR("sm_disk_create failed"); r = PTR_ERR(pmd->data_sm); - goto bad; + goto out_cleanup_tm; } pmd->nb_tm = dm_tm_create_non_blocking_clone(pmd->tm); if (!pmd->nb_tm) { - DMERR("could not create clone tm"); + DMERR("could not create non-blocking clone tm"); r = -ENOMEM; - goto bad_data_sm; + goto out_cleanup_data_sm; } __setup_btree_details(pmd); r = dm_btree_empty(&pmd->info, &pmd->root); if (r < 0) - goto bad_data_sm; + goto out_cleanup_nb_tm; r = dm_btree_empty(&pmd->details_info, &pmd->details_root); if (r < 0) { DMERR("couldn't create devices root"); - goto bad_data_sm; + goto out_cleanup_nb_tm; } r = __write_initial_superblock(pmd); if (r) - goto bad_data_sm; + goto out_cleanup_nb_tm; return 0; -bad_data_sm: +out_cleanup_nb_tm: + dm_tm_destroy(pmd->nb_tm); +out_cleanup_data_sm: dm_sm_destroy(pmd->data_sm); -bad: +out_cleanup_tm: dm_tm_destroy(pmd->tm); dm_sm_destroy(pmd->metadata_sm); @@ -582,10 +584,8 @@ static int __open_metadata(struct dm_poo disk_super = dm_block_data(sblock); r = __check_incompat_features(disk_super, pmd); - if (r < 0) { - dm_bm_unlock(sblock); - return r; - } + if (r < 0) + goto out_unlock_sblock; r = dm_tm_open_with_sm(pmd->bm, THIN_SUPERBLOCK_LOCATION, disk_super->metadata_space_map_root, @@ -593,35 +593,34 @@ static int __open_metadata(struct dm_poo &pmd->tm, &pmd->metadata_sm); if (r < 0) { DMERR("tm_open_with_sm failed"); - dm_bm_unlock(sblock); - return r; + goto out_unlock_sblock; } pmd->data_sm = dm_sm_disk_open(pmd->tm, disk_super->data_space_map_root, sizeof(disk_super->data_space_map_root)); if (IS_ERR(pmd->data_sm)) { DMERR("sm_disk_open failed"); - dm_bm_unlock(sblock); r = PTR_ERR(pmd->data_sm); - goto bad; + goto out_cleanup_tm; } - dm_bm_unlock(sblock); - pmd->nb_tm = dm_tm_create_non_blocking_clone(pmd->tm); if (!pmd->nb_tm) { - DMERR("could not create clone tm"); + DMERR("could not create non-blocking clone tm"); r = -ENOMEM; - goto bad_data_sm; + goto out_cleanup_data_sm; } __setup_btree_details(pmd); + return dm_bm_unlock(sblock); -bad_data_sm: +out_cleanup_data_sm: dm_sm_destroy(pmd->data_sm); -bad: +out_cleanup_tm: dm_tm_destroy(pmd->tm); dm_sm_destroy(pmd->metadata_sm); +out_unlock_sblock: + dm_bm_unlock(sblock); return r; }