From a65df0e59865246d6abd4c81de97564b9dc79bd4 Mon Sep 17 00:00:00 2001 From: Alasdair Kergon Date: Thu, 30 Sep 2010 21:06:50 +0000 Subject: [PATCH] Add dm_zalloc and use it and dm_pool_zalloc throughout. --- WHATS_NEW | 3 +- daemons/dmeventd/dmeventd.c | 6 +-- lib/cache/lvmcache.c | 6 +-- lib/commands/toolcontext.c | 3 +- lib/config/config.c | 80 ++++++++++++++++----------------- lib/filters/filter-persistent.c | 3 +- lib/format1/disk-rep.c | 3 +- lib/format1/format1.c | 4 +- lib/format1/import-export.c | 3 +- lib/format_text/export.c | 7 +-- lib/label/label.c | 3 +- libdm/datastruct/bitset.c | 4 +- libdm/datastruct/hash.c | 10 ++--- libdm/libdevmapper.h | 4 ++ libdm/libdm-common.c | 4 +- libdm/libdm-deptree.c | 3 +- libdm/libdm-report.c | 3 +- libdm/mm/dbg_malloc.c | 20 +++++++++ libdm/mm/pool-fast.c | 3 +- libdm/regex/matcher.c | 4 +- tools/dmsetup.c | 4 +- 21 files changed, 87 insertions(+), 93 deletions(-) diff --git a/WHATS_NEW b/WHATS_NEW index 58dea0c9b..5d09a6360 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,8 +1,9 @@ Version 2.02.75 - ===================================== + Add dm_zalloc and use it and dm_pool_zalloc throughout. Add pv_get_property and create generic internal _get_property function. Add 'get' functions for pv and vg properties/fields. - Make generic GET_*_PROPERTY_FN macros and define secondary macro for vg, pv, lv. + Make generic GET_*_PROPERTY_FN macros with secondary macro for vg, pv & lv. Add tags_format_and_copy() common function and call from _tags_disp. Add id_format_and_copy() common function and call from _uuid_disp. Simplify logic to create '{pv|vg|lv}_attr' strings. diff --git a/daemons/dmeventd/dmeventd.c b/daemons/dmeventd/dmeventd.c index cc1e4a72d..4889b7cf2 100644 --- a/daemons/dmeventd/dmeventd.c +++ b/daemons/dmeventd/dmeventd.c @@ -223,12 +223,11 @@ static void _debuglog(const char *fmt, ...) static struct thread_status *_alloc_thread_status(struct message_data *data, struct dso_data *dso_data) { - struct thread_status *ret = (typeof(ret)) dm_malloc(sizeof(*ret)); + struct thread_status *ret = (typeof(ret)) dm_zalloc(sizeof(*ret)); if (!ret) return NULL; - memset(ret, 0, sizeof(*ret)); if (!(ret->device.uuid = dm_strdup(data->device_uuid))) { dm_free(ret); return NULL; @@ -259,12 +258,11 @@ static void _free_thread_status(struct thread_status *thread) /* Allocate/free DSO data. */ static struct dso_data *_alloc_dso_data(struct message_data *data) { - struct dso_data *ret = (typeof(ret)) dm_malloc(sizeof(*ret)); + struct dso_data *ret = (typeof(ret)) dm_zalloc(sizeof(*ret)); if (!ret) return NULL; - memset(ret, 0, sizeof(*ret)); if (!(ret->dso_name = dm_strdup(data->dso_name))) { dm_free(ret); return NULL; diff --git a/lib/cache/lvmcache.c b/lib/cache/lvmcache.c index 2af4e4a65..35d6f76c6 100644 --- a/lib/cache/lvmcache.c +++ b/lib/cache/lvmcache.c @@ -1064,11 +1064,10 @@ static int _lvmcache_update_vgname(struct lvmcache_info *info, } } else { ***/ - if (!(vginfo = dm_malloc(sizeof(*vginfo)))) { + if (!(vginfo = dm_zalloc(sizeof(*vginfo)))) { log_error("lvmcache_update_vgname: list alloc failed"); return 0; } - memset(vginfo, 0, sizeof(*vginfo)); if (!(vginfo->vgname = dm_strdup(vgname))) { dm_free(vginfo); log_error("cache vgname alloc failed for %s", vgname); @@ -1261,12 +1260,11 @@ struct lvmcache_info *lvmcache_add(struct labeller *labeller, const char *pvid, !(existing = info_from_pvid(dev->pvid, 0))) { if (!(label = label_create(labeller))) return_NULL; - if (!(info = dm_malloc(sizeof(*info)))) { + if (!(info = dm_zalloc(sizeof(*info)))) { log_error("lvmcache_info allocation failed"); label_destroy(label); return NULL; } - memset(info, 0, sizeof(*info)); label->info = info; info->label = label; diff --git a/lib/commands/toolcontext.c b/lib/commands/toolcontext.c index 813da9091..289a0fcab 100644 --- a/lib/commands/toolcontext.c +++ b/lib/commands/toolcontext.c @@ -1121,11 +1121,10 @@ struct cmd_context *create_toolcontext(unsigned is_long_lived, init_syslog(DEFAULT_LOG_FACILITY); - if (!(cmd = dm_malloc(sizeof(*cmd)))) { + if (!(cmd = dm_zalloc(sizeof(*cmd)))) { log_error("Failed to allocate command context"); return NULL; } - memset(cmd, 0, sizeof(*cmd)); cmd->is_long_lived = is_long_lived; cmd->handles_missing_pvs = 0; cmd->handles_unknown_segments = 0; diff --git a/lib/config/config.c b/lib/config/config.c index 72f306d71..2b386634a 100644 --- a/lib/config/config.c +++ b/lib/config/config.c @@ -724,6 +724,8 @@ static void _get_token(struct parser *p, int tok_prev) { int values_allowed = 0; + const char *te; + p->tb = p->te; _eat_space(p); if (p->tb == p->fe || !*p->tb) { @@ -738,59 +740,61 @@ static void _get_token(struct parser *p, int tok_prev) p->t = TOK_INT; /* fudge so the fall through for floats works */ - switch (*p->te) { + + te = p->te; + switch (*te) { case SECTION_B_CHAR: p->t = TOK_SECTION_B; - p->te++; + te++; break; case SECTION_E_CHAR: p->t = TOK_SECTION_E; - p->te++; + te++; break; case '[': p->t = TOK_ARRAY_B; - p->te++; + te++; break; case ']': p->t = TOK_ARRAY_E; - p->te++; + te++; break; case ',': p->t = TOK_COMMA; - p->te++; + te++; break; case '=': p->t = TOK_EQ; - p->te++; + te++; break; case '"': p->t = TOK_STRING_ESCAPED; - p->te++; - while ((p->te != p->fe) && (*p->te) && (*p->te != '"')) { - if ((*p->te == '\\') && (p->te + 1 != p->fe) && - *(p->te + 1)) - p->te++; - p->te++; + te++; + while ((te != p->fe) && (*te) && (*te != '"')) { + if ((*te == '\\') && (te + 1 != p->fe) && + *(te + 1)) + te++; + te++; } - if ((p->te != p->fe) && (*p->te)) - p->te++; + if ((te != p->fe) && (*te)) + te++; break; case '\'': p->t = TOK_STRING; - p->te++; - while ((p->te != p->fe) && (*p->te) && (*p->te != '\'')) - p->te++; + te++; + while ((te != p->fe) && (*te) && (*te != '\'')) + te++; - if ((p->te != p->fe) && (*p->te)) - p->te++; + if ((te != p->fe) && (*te)) + te++; break; case '.': @@ -808,28 +812,30 @@ static void _get_token(struct parser *p, int tok_prev) case '+': case '-': if (values_allowed) { - p->te++; - while ((p->te != p->fe) && (*p->te)) { - if (*p->te == '.') { + te++; + while ((te != p->fe) && (*te)) { + if (*te == '.') { if (p->t == TOK_FLOAT) break; p->t = TOK_FLOAT; - } else if (!isdigit((int) *p->te)) + } else if (!isdigit((int) *te)) break; - p->te++; + te++; } break; } default: p->t = TOK_IDENTIFIER; - while ((p->te != p->fe) && (*p->te) && !isspace(*p->te) && - (*p->te != '#') && (*p->te != '=') && - (*p->te != SECTION_B_CHAR) && - (*p->te != SECTION_E_CHAR)) - p->te++; + while ((te != p->fe) && (*te) && !isspace(*te) && + (*te != '#') && (*te != '=') && + (*te != SECTION_B_CHAR) && + (*te != SECTION_E_CHAR)) + te++; break; } + + p->te = te; } static void _eat_space(struct parser *p) @@ -859,22 +865,12 @@ static void _eat_space(struct parser *p) */ static struct config_value *_create_value(struct dm_pool *mem) { - struct config_value *v = dm_pool_alloc(mem, sizeof(*v)); - - if (v) - memset(v, 0, sizeof(*v)); - - return v; + return dm_pool_zalloc(mem, sizeof(struct config_value)); } static struct config_node *_create_node(struct dm_pool *mem) { - struct config_node *n = dm_pool_alloc(mem, sizeof(*n)); - - if (n) - memset(n, 0, sizeof(*n)); - - return n; + return dm_pool_zalloc(mem, sizeof(struct config_node)); } static char *_dup_tok(struct parser *p) diff --git a/lib/filters/filter-persistent.c b/lib/filters/filter-persistent.c index 7f48a4791..2ed94007f 100644 --- a/lib/filters/filter-persistent.c +++ b/lib/filters/filter-persistent.c @@ -318,9 +318,8 @@ struct dev_filter *persistent_filter_create(struct dev_filter *real, struct dev_filter *f = NULL; struct stat info; - if (!(pf = dm_malloc(sizeof(*pf)))) + if (!(pf = dm_zalloc(sizeof(*pf)))) return_NULL; - memset(pf, 0, sizeof(*pf)); if (!(pf->file = dm_malloc(strlen(file) + 1))) goto_bad; diff --git a/lib/format1/disk-rep.c b/lib/format1/disk-rep.c index d38c88746..bc5874424 100644 --- a/lib/format1/disk-rep.c +++ b/lib/format1/disk-rep.c @@ -624,13 +624,12 @@ static int _write_pvd(struct disk_list *data) /* Make sure that the gap between the PV structure and the next one is zeroed in order to make non LVM tools happy (idea from AED) */ - buf = dm_malloc(size); + buf = dm_zalloc(size); if (!buf) { log_error("Couldn't allocate temporary PV buffer."); return 0; } - memset(buf, 0, size); memcpy(buf, &data->pvd, sizeof(struct pv_disk)); log_debug("Writing %s PV metadata to %s at %" PRIu64 " len %" diff --git a/lib/format1/format1.c b/lib/format1/format1.c index f41fd7f6a..d6c462a53 100644 --- a/lib/format1/format1.c +++ b/lib/format1/format1.c @@ -157,7 +157,7 @@ static struct volume_group *_build_vg(struct format_instance *fid, struct dm_list *pvs, struct dm_pool *mem) { - struct volume_group *vg = dm_pool_alloc(mem, sizeof(*vg)); + struct volume_group *vg = dm_pool_zalloc(mem, sizeof(*vg)); struct disk_list *dl; if (!vg) @@ -166,8 +166,6 @@ static struct volume_group *_build_vg(struct format_instance *fid, if (dm_list_empty(pvs)) goto_bad; - memset(vg, 0, sizeof(*vg)); - vg->cmd = fid->fmt->cmd; vg->vgmem = mem; vg->fid = fid; diff --git a/lib/format1/import-export.c b/lib/format1/import-export.c index 864034bb9..e26173724 100644 --- a/lib/format1/import-export.c +++ b/lib/format1/import-export.c @@ -506,9 +506,8 @@ int export_lvs(struct disk_list *dl, struct volume_group *vg, * setup the pv's extents array */ len = sizeof(struct pe_disk) * dl->pvd.pe_total; - if (!(dl->extents = dm_pool_alloc(dl->mem, len))) + if (!(dl->extents = dm_pool_zalloc(dl->mem, len))) goto_out; - memset(dl->extents, 0, len); dm_list_iterate_items(ll, &vg->lvs) { if (ll->lv->status & SNAPSHOT) diff --git a/lib/format_text/export.c b/lib/format_text/export.c index d16a7fcf6..d49090ccb 100644 --- a/lib/format_text/export.c +++ b/lib/format_text/export.c @@ -742,10 +742,9 @@ int text_vg_export_file(struct volume_group *vg, const char *desc, FILE *fp) _init(); - if (!(f = dm_malloc(sizeof(*f)))) + if (!(f = dm_zalloc(sizeof(*f)))) return_0; - memset(f, 0, sizeof(*f)); f->data.fp = fp; f->indent = 0; f->header = 1; @@ -767,11 +766,9 @@ int text_vg_export_raw(struct volume_group *vg, const char *desc, char **buf) _init(); - if (!(f = dm_malloc(sizeof(*f)))) + if (!(f = dm_zalloc(sizeof(*f)))) return_0; - memset(f, 0, sizeof(*f)); - f->data.buf.size = 65536; /* Initial metadata limit */ if (!(f->data.buf.start = dm_malloc(f->data.buf.size))) { log_error("text_export buffer allocation failed"); diff --git a/lib/label/label.c b/lib/label/label.c index 9a10d0664..c622812ff 100644 --- a/lib/label/label.c +++ b/lib/label/label.c @@ -383,11 +383,10 @@ struct label *label_create(struct labeller *labeller) { struct label *label; - if (!(label = dm_malloc(sizeof(*label)))) { + if (!(label = dm_zalloc(sizeof(*label)))) { log_error("label allocaction failed"); return NULL; } - memset(label, 0, sizeof(*label)); label->labeller = labeller; diff --git a/libdm/datastruct/bitset.c b/libdm/datastruct/bitset.c index 563f684e15..5cd8e385a 100644 --- a/libdm/datastruct/bitset.c +++ b/libdm/datastruct/bitset.c @@ -26,8 +26,8 @@ dm_bitset_t dm_bitset_create(struct dm_pool *mem, unsigned num_bits) if (mem) bs = dm_pool_zalloc(mem, size); - else if ((bs = dm_malloc(size))) - memset(bs, 0, size); + else + bs = dm_zalloc(size); if (!bs) return NULL; diff --git a/libdm/datastruct/hash.c b/libdm/datastruct/hash.c index cd722cd81..d4543df5b 100644 --- a/libdm/datastruct/hash.c +++ b/libdm/datastruct/hash.c @@ -90,14 +90,10 @@ struct dm_hash_table *dm_hash_create(unsigned size_hint) { size_t len; unsigned new_size = 16u; - struct dm_hash_table *hc = dm_malloc(sizeof(*hc)); + struct dm_hash_table *hc = dm_zalloc(sizeof(*hc)); - if (!hc) { - stack; - return 0; - } - - memset(hc, 0, sizeof(*hc)); + if (!hc) + return_0; /* round size hint up to a power of two */ while (new_size < size_hint) diff --git a/libdm/libdevmapper.h b/libdm/libdevmapper.h index 38b901f39..34bcf4052 100644 --- a/libdm/libdevmapper.h +++ b/libdm/libdevmapper.h @@ -511,6 +511,8 @@ uint32_t dm_tree_get_cookie(struct dm_tree_node *node); void *dm_malloc_aux(size_t s, const char *file, int line); void *dm_malloc_aux_debug(size_t s, const char *file, int line); +void *dm_zalloc_aux(size_t s, const char *file, int line); +void *dm_zalloc_aux_debug(size_t s, const char *file, int line); char *dm_strdup_aux(const char *str, const char *file, int line); void dm_free_aux(void *p); void *dm_realloc_aux(void *p, unsigned int s, const char *file, int line); @@ -520,6 +522,7 @@ void dm_bounds_check_debug(void); #ifdef DEBUG_MEM # define dm_malloc(s) dm_malloc_aux_debug((s), __FILE__, __LINE__) +# define dm_zalloc(s) dm_zalloc_aux_debug((s), __FILE__, __LINE__) # define dm_strdup(s) dm_strdup_aux((s), __FILE__, __LINE__) # define dm_free(p) dm_free_aux(p) # define dm_realloc(p, s) dm_realloc_aux(p, s, __FILE__, __LINE__) @@ -529,6 +532,7 @@ void dm_bounds_check_debug(void); #else # define dm_malloc(s) dm_malloc_aux((s), __FILE__, __LINE__) +# define dm_zalloc(s) dm_zalloc_aux((s), __FILE__, __LINE__) # define dm_strdup(s) strdup(s) # define dm_free(p) free(p) # define dm_realloc(p, s) realloc(p, s) diff --git a/libdm/libdm-common.c b/libdm/libdm-common.c index 6b3f2d2bc..4de2f4b5f 100644 --- a/libdm/libdm-common.c +++ b/libdm/libdm-common.c @@ -166,7 +166,7 @@ int dm_get_library_version(char *version, size_t size) struct dm_task *dm_task_create(int type) { - struct dm_task *dmt = dm_malloc(sizeof(*dmt)); + struct dm_task *dmt = dm_zalloc(sizeof(*dmt)); if (!dmt) { log_error("dm_task_create: malloc(%" PRIsize_t ") failed", @@ -179,8 +179,6 @@ struct dm_task *dm_task_create(int type) return NULL; } - memset(dmt, 0, sizeof(*dmt)); - dmt->type = type; dmt->minor = -1; dmt->major = -1; diff --git a/libdm/libdm-deptree.c b/libdm/libdm-deptree.c index 0e491273d..952c37be0 100644 --- a/libdm/libdm-deptree.c +++ b/libdm/libdm-deptree.c @@ -197,12 +197,11 @@ struct dm_tree *dm_tree_create(void) { struct dm_tree *dtree; - if (!(dtree = dm_malloc(sizeof(*dtree)))) { + if (!(dtree = dm_zalloc(sizeof(*dtree)))) { log_error("dm_tree_create malloc failed"); return NULL; } - memset(dtree, 0, sizeof(*dtree)); dtree->root.dtree = dtree; dm_list_init(&dtree->root.uses); dm_list_init(&dtree->root.used_by); diff --git a/libdm/libdm-report.c b/libdm/libdm-report.c index 2b044b538..7631e219d 100644 --- a/libdm/libdm-report.c +++ b/libdm/libdm-report.c @@ -571,11 +571,10 @@ struct dm_report *dm_report_init(uint32_t *report_types, struct dm_report *rh; const struct dm_report_object_type *type; - if (!(rh = dm_malloc(sizeof(*rh)))) { + if (!(rh = dm_zalloc(sizeof(*rh)))) { log_error("dm_report_init: dm_malloc failed"); return 0; } - memset(rh, 0, sizeof(*rh)); /* * rh->report_types is updated in _parse_fields() and _parse_keys() diff --git a/libdm/mm/dbg_malloc.c b/libdm/mm/dbg_malloc.c index cace81105..db7f5f3ed 100644 --- a/libdm/mm/dbg_malloc.c +++ b/libdm/mm/dbg_malloc.c @@ -119,6 +119,16 @@ void *dm_malloc_aux_debug(size_t s, const char *file, int line) return nb + 1; } +void *dm_zalloc_aux_debug(size_t s, const char *file, int line) +{ + void *ptr = dm_malloc_aux_debug(s, file, line); + + if (ptr) + memset(ptr, 0, s); + + return ptr; +} + void dm_free_aux(void *p) { char *ptr; @@ -250,3 +260,13 @@ void *dm_malloc_aux(size_t s, const char *file __attribute__((unused)), return malloc(s); } + +void *dm_zalloc_aux(size_t s, const char *file, int line) +{ + void *ptr = dm_malloc_aux(s, file, line); + + if (ptr) + memset(ptr, 0, s); + + return ptr; +} diff --git a/libdm/mm/pool-fast.c b/libdm/mm/pool-fast.c index daad79aaa..d9030cfaa 100644 --- a/libdm/mm/pool-fast.c +++ b/libdm/mm/pool-fast.c @@ -43,14 +43,13 @@ static void _free_chunk(struct chunk *c); struct dm_pool *dm_pool_create(const char *name, size_t chunk_hint) { size_t new_size = 1024; - struct dm_pool *p = dm_malloc(sizeof(*p)); + struct dm_pool *p = dm_zalloc(sizeof(*p)); if (!p) { log_error("Couldn't create memory pool %s (size %" PRIsize_t ")", name, sizeof(*p)); return 0; } - memset(p, 0, sizeof(*p)); /* round chunk_hint up to the next power of 2 */ p->chunk_size = chunk_hint + sizeof(struct chunk); diff --git a/libdm/regex/matcher.c b/libdm/regex/matcher.c index a88c048d3..17f33a417 100644 --- a/libdm/regex/matcher.c +++ b/libdm/regex/matcher.c @@ -320,11 +320,9 @@ struct dm_regex *dm_regex_create(struct dm_pool *mem, const char **patterns, struct dm_regex *m; struct dm_pool *scratch = mem; - if (!(m = dm_pool_alloc(mem, sizeof(*m)))) + if (!(m = dm_pool_zalloc(mem, sizeof(*m)))) return_NULL; - memset(m, 0, sizeof(*m)); - /* join the regexps together, delimiting with zero */ for (i = 0; i < num_patterns; i++) len += strlen(patterns[i]) + 8; diff --git a/tools/dmsetup.c b/tools/dmsetup.c index 885566709..f094f3fb1 100644 --- a/tools/dmsetup.c +++ b/tools/dmsetup.c @@ -730,13 +730,11 @@ static int _message(int argc, char **argv, void *data __attribute__((unused))) for (i = 0; i < argc; i++) sz += strlen(argv[i]) + 1; - if (!(str = dm_malloc(sz))) { + if (!(str = dm_zalloc(sz))) { err("message string allocation failed"); goto out; } - memset(str, 0, sz); - for (i = 0; i < argc; i++) { if (i) strcat(str, " "); -- 2.43.5