Message ID | 1449271518-118900-5-git-send-email-computersforpeace@gmail.com |
---|---|
State | Accepted |
Commit | c42c2710d64381fd48d36b278e0744aa683d93fe |
Headers | show |
On Fri, 4 Dec 2015 15:25:16 -0800 Brian Norris <computersforpeace@gmail.com> wrote: > The use of kmemdup() complicates the error handling a bit. We don't > actually need to allocate new memory, since this reference is treated as > const, and it is copied into new memory by the partition registration > code anyway. So remove it. > > Signed-off-by: Brian Norris <computersforpeace@gmail.com> Reviewed-by: Boris Brezillon <boris.brezillon@free-electrons.com> > --- > New in v2 > > drivers/mtd/mtdcore.c | 16 +++++++--------- > drivers/mtd/mtdcore.h | 2 +- > drivers/mtd/mtdpart.c | 2 +- > 3 files changed, 9 insertions(+), 11 deletions(-) > > diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c > index 62f83b050978..868ee52d5063 100644 > --- a/drivers/mtd/mtdcore.c > +++ b/drivers/mtd/mtdcore.c > @@ -532,7 +532,7 @@ out_error: > } > > static int mtd_add_device_partitions(struct mtd_info *mtd, > - struct mtd_partition *real_parts, > + const struct mtd_partition *real_parts, > int nbparts) > { > int ret; > @@ -589,16 +589,12 @@ int mtd_device_parse_register(struct mtd_info *mtd, const char * const *types, > int nr_parts) > { > int ret; > - struct mtd_partition *real_parts = NULL; > + const struct mtd_partition *real_parts = NULL; > > ret = parse_mtd_partitions(mtd, types, &real_parts, parser_data); > if (ret <= 0 && nr_parts && parts) { > - real_parts = kmemdup(parts, sizeof(*parts) * nr_parts, > - GFP_KERNEL); > - if (!real_parts) > - ret = -ENOMEM; > - else > - ret = nr_parts; > + real_parts = parts; > + ret = nr_parts; > } > /* Didn't come up with either parsed OR fallback partitions */ > if (ret < 0) { > @@ -628,7 +624,9 @@ int mtd_device_parse_register(struct mtd_info *mtd, const char * const *types, > } > > out: > - kfree(real_parts); > + /* Cleanup any parsed partitions */ > + if (real_parts != parts) > + kfree(real_parts); > return ret; > } > EXPORT_SYMBOL_GPL(mtd_device_parse_register); > diff --git a/drivers/mtd/mtdcore.h b/drivers/mtd/mtdcore.h > index 7b0353399a10..537ec66f9cfd 100644 > --- a/drivers/mtd/mtdcore.h > +++ b/drivers/mtd/mtdcore.h > @@ -11,7 +11,7 @@ int del_mtd_device(struct mtd_info *mtd); > int add_mtd_partitions(struct mtd_info *, const struct mtd_partition *, int); > int del_mtd_partitions(struct mtd_info *); > int parse_mtd_partitions(struct mtd_info *master, const char * const *types, > - struct mtd_partition **pparts, > + const struct mtd_partition **pparts, > struct mtd_part_parser_data *data); > > int __init init_mtdchar(void); > diff --git a/drivers/mtd/mtdpart.c b/drivers/mtd/mtdpart.c > index c6fd4b24c822..86691a5c68b9 100644 > --- a/drivers/mtd/mtdpart.c > +++ b/drivers/mtd/mtdpart.c > @@ -757,7 +757,7 @@ static const char * const default_mtd_part_types[] = { > * point to an array containing this number of &struct mtd_info objects. > */ > int parse_mtd_partitions(struct mtd_info *master, const char *const *types, > - struct mtd_partition **pparts, > + const struct mtd_partition **pparts, > struct mtd_part_parser_data *data) > { > struct mtd_part_parser *parser;
diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c index 62f83b050978..868ee52d5063 100644 --- a/drivers/mtd/mtdcore.c +++ b/drivers/mtd/mtdcore.c @@ -532,7 +532,7 @@ out_error: } static int mtd_add_device_partitions(struct mtd_info *mtd, - struct mtd_partition *real_parts, + const struct mtd_partition *real_parts, int nbparts) { int ret; @@ -589,16 +589,12 @@ int mtd_device_parse_register(struct mtd_info *mtd, const char * const *types, int nr_parts) { int ret; - struct mtd_partition *real_parts = NULL; + const struct mtd_partition *real_parts = NULL; ret = parse_mtd_partitions(mtd, types, &real_parts, parser_data); if (ret <= 0 && nr_parts && parts) { - real_parts = kmemdup(parts, sizeof(*parts) * nr_parts, - GFP_KERNEL); - if (!real_parts) - ret = -ENOMEM; - else - ret = nr_parts; + real_parts = parts; + ret = nr_parts; } /* Didn't come up with either parsed OR fallback partitions */ if (ret < 0) { @@ -628,7 +624,9 @@ int mtd_device_parse_register(struct mtd_info *mtd, const char * const *types, } out: - kfree(real_parts); + /* Cleanup any parsed partitions */ + if (real_parts != parts) + kfree(real_parts); return ret; } EXPORT_SYMBOL_GPL(mtd_device_parse_register); diff --git a/drivers/mtd/mtdcore.h b/drivers/mtd/mtdcore.h index 7b0353399a10..537ec66f9cfd 100644 --- a/drivers/mtd/mtdcore.h +++ b/drivers/mtd/mtdcore.h @@ -11,7 +11,7 @@ int del_mtd_device(struct mtd_info *mtd); int add_mtd_partitions(struct mtd_info *, const struct mtd_partition *, int); int del_mtd_partitions(struct mtd_info *); int parse_mtd_partitions(struct mtd_info *master, const char * const *types, - struct mtd_partition **pparts, + const struct mtd_partition **pparts, struct mtd_part_parser_data *data); int __init init_mtdchar(void); diff --git a/drivers/mtd/mtdpart.c b/drivers/mtd/mtdpart.c index c6fd4b24c822..86691a5c68b9 100644 --- a/drivers/mtd/mtdpart.c +++ b/drivers/mtd/mtdpart.c @@ -757,7 +757,7 @@ static const char * const default_mtd_part_types[] = { * point to an array containing this number of &struct mtd_info objects. */ int parse_mtd_partitions(struct mtd_info *master, const char *const *types, - struct mtd_partition **pparts, + const struct mtd_partition **pparts, struct mtd_part_parser_data *data) { struct mtd_part_parser *parser;
The use of kmemdup() complicates the error handling a bit. We don't actually need to allocate new memory, since this reference is treated as const, and it is copied into new memory by the partition registration code anyway. So remove it. Signed-off-by: Brian Norris <computersforpeace@gmail.com> --- New in v2 drivers/mtd/mtdcore.c | 16 +++++++--------- drivers/mtd/mtdcore.h | 2 +- drivers/mtd/mtdpart.c | 2 +- 3 files changed, 9 insertions(+), 11 deletions(-)