Re: [PATCH 15/17] mtd: rawnand: nandsim: Manage lists on error in ns_init_module()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sat, May 9, 2020 at 9:19 PM Miquel Raynal <miquel.raynal@xxxxxxxxxxx> wrote:
>
> Lists are filled with calls to ns_parse_weakblocks(),
> ns_parse_weakpages() and ns_parse_gravepages(). Handle them in the
> error path, all at the same time.
>
> Signed-off-by: Miquel Raynal <miquel.raynal@xxxxxxxxxxx>
> ---
>  drivers/mtd/nand/raw/nandsim.c | 23 +++++++++++++++++++----
>  1 file changed, 19 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/mtd/nand/raw/nandsim.c b/drivers/mtd/nand/raw/nandsim.c
> index e41866e49206..26d23ab5b794 100644
> --- a/drivers/mtd/nand/raw/nandsim.c
> +++ b/drivers/mtd/nand/raw/nandsim.c
> @@ -2273,6 +2273,7 @@ static const struct nand_controller_ops ns_controller_ops = {
>   */
>  static int __init ns_init_module(void)
>  {
> +       struct list_head *pos, *n;
>         struct nand_chip *chip;
>         struct nandsim *ns;
>         int ret;
> @@ -2340,11 +2341,11 @@ static int __init ns_init_module(void)
>
>         ret = ns_parse_weakpages();
>         if (ret)
> -               goto error;
> +               goto free_wb_list;
>
>         ret = ns_parse_gravepages();
>         if (ret)
> -               goto error;
> +               goto free_wp_list;
>
>         nand_controller_init(&ns->base);
>         ns->base.ops = &ns_controller_ops;
> @@ -2353,7 +2354,7 @@ static int __init ns_init_module(void)
>         ret = nand_scan(chip, 1);
>         if (ret) {
>                 NS_ERR("Could not scan NAND Simulator device\n");
> -               goto error;
> +               goto free_gp_list;
>         }
>
>         if (overridesize) {
> @@ -2412,9 +2413,23 @@ static int __init ns_init_module(void)
>         kfree(erase_block_wear);
>  cleanup_nand:
>         nand_cleanup(chip);
> +free_gp_list:
> +       list_for_each_safe(pos, n, &grave_pages) {
> +               kfree(list_entry(pos, struct grave_page, list));
> +               list_del(pos);

Like said before, this pattern looks odd.

> +       }
> +free_wp_list:
> +       list_for_each_safe(pos, n, &weak_pages) {
> +               kfree(list_entry(pos, struct weak_page, list));
> +               list_del(pos);
> +       }
> +free_wb_list:
> +       list_for_each_safe(pos, n, &weak_blocks) {
> +               kfree(list_entry(pos, struct weak_block, list));
> +               list_del(pos);
> +       }
>  error:
>         kfree(ns);
> -       ns_free_lists();
>
>         return ret;
>  }
> --
> 2.20.1
>
>
> ______________________________________________________
> Linux MTD discussion mailing list
> http://lists.infradead.org/mailman/listinfo/linux-mtd/



-- 
Thanks,
//richard

______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/



[Index of Archives]     [LARTC]     [Bugtraq]     [Yosemite Forum]     [Photo]

  Powered by Linux