return nc*fc;
 }
 
+static void raid10_free_conf(struct r10conf *conf)
+{
+       if (!conf)
+               return;
+
+       mempool_exit(&conf->r10bio_pool);
+       kfree(conf->mirrors);
+       kfree(conf->mirrors_old);
+       kfree(conf->mirrors_new);
+       safe_put_page(conf->tmppage);
+       bioset_exit(&conf->bio_split);
+       kfree(conf);
+}
+
 static struct r10conf *setup_conf(struct mddev *mddev)
 {
        struct r10conf *conf = NULL;
        return conf;
 
  out:
-       if (conf) {
-               mempool_exit(&conf->r10bio_pool);
-               kfree(conf->mirrors);
-               safe_put_page(conf->tmppage);
-               bioset_exit(&conf->bio_split);
-               kfree(conf);
-       }
+       raid10_free_conf(conf);
        return ERR_PTR(err);
 }
 
 
 out_free_conf:
        md_unregister_thread(&mddev->thread);
-       mempool_exit(&conf->r10bio_pool);
-       safe_put_page(conf->tmppage);
-       kfree(conf->mirrors);
-       kfree(conf);
+       raid10_free_conf(conf);
        mddev->private = NULL;
 out:
        return -EIO;
 
 static void raid10_free(struct mddev *mddev, void *priv)
 {
-       struct r10conf *conf = priv;
-
-       mempool_exit(&conf->r10bio_pool);
-       safe_put_page(conf->tmppage);
-       kfree(conf->mirrors);
-       kfree(conf->mirrors_old);
-       kfree(conf->mirrors_new);
-       bioset_exit(&conf->bio_split);
-       kfree(conf);
+       raid10_free_conf(priv);
 }
 
 static void raid10_quiesce(struct mddev *mddev, int quiesce)