@ -4309,6 +4309,15 @@ raid5_size(mddev_t *mddev, sector_t sectors, int raid_disks)
return sectors * ( raid_disks - conf - > max_degraded ) ;
}
static void free_conf ( raid5_conf_t * conf )
{
shrink_stripes ( conf ) ;
safe_put_page ( conf - > spare_page ) ;
kfree ( conf - > disks ) ;
kfree ( conf - > stripe_hashtbl ) ;
kfree ( conf ) ;
}
static raid5_conf_t * setup_conf ( mddev_t * mddev )
{
raid5_conf_t * conf ;
@ -4438,11 +4447,7 @@ static raid5_conf_t *setup_conf(mddev_t *mddev)
abort :
if ( conf ) {
shrink_stripes ( conf ) ;
safe_put_page ( conf - > spare_page ) ;
kfree ( conf - > disks ) ;
kfree ( conf - > stripe_hashtbl ) ;
kfree ( conf ) ;
free_conf ( conf ) ;
return ERR_PTR ( - EIO ) ;
} else
return ERR_PTR ( - ENOMEM ) ;
@ -4608,12 +4613,8 @@ abort:
md_unregister_thread ( mddev - > thread ) ;
mddev - > thread = NULL ;
if ( conf ) {
shrink_stripes ( conf ) ;
print_raid5_conf ( conf ) ;
safe_put_page ( conf - > spare_page ) ;
kfree ( conf - > disks ) ;
kfree ( conf - > stripe_hashtbl ) ;
kfree ( conf ) ;
free_conf ( conf ) ;
}
mddev - > private = NULL ;
printk ( KERN_ALERT " raid5: failed to run raid set %s \n " , mdname ( mddev ) ) ;
@ -4628,13 +4629,10 @@ static int stop(mddev_t *mddev)
md_unregister_thread ( mddev - > thread ) ;
mddev - > thread = NULL ;
shrink_stripes ( conf ) ;
kfree ( conf - > stripe_hashtbl ) ;
mddev - > queue - > backing_dev_info . congested_fn = NULL ;
blk_sync_queue ( mddev - > queue ) ; /* the unplug fn references 'conf'*/
sysfs_remove_group ( & mddev - > kobj , & raid5_attrs_group ) ;
kfree ( conf - > disks ) ;
kfree ( conf ) ;
free_conf ( conf ) ;
mddev - > private = NULL ;
return 0 ;
}