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.
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;
/* 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;
}
} 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);
!(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;
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;
{
int values_allowed = 0;
+ const char *te;
+
p->tb = p->te;
_eat_space(p);
if (p->tb == p->fe || !*p->tb) {
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 '.':
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)
*/
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)
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;
/* 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 %"
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)
if (dm_list_empty(pvs))
goto_bad;
- memset(vg, 0, sizeof(*vg));
-
vg->cmd = fid->fmt->cmd;
vg->vgmem = mem;
vg->fid = fid;
* 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)
_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;
_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");
{
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;
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;
{
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)
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);
#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__)
#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)
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",
return NULL;
}
- memset(dmt, 0, sizeof(*dmt));
-
dmt->type = type;
dmt->minor = -1;
dmt->major = -1;
{
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);
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()
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;
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;
+}
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);
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;
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, " ");