]> sourceware.org Git - lvm2.git/commitdiff
Use dynamic allocation for metadata's tag buffer (removes 4096 char. limit).
authorPeter Rajnoha <prajnoha@redhat.com>
Mon, 20 Sep 2010 14:23:20 +0000 (14:23 +0000)
committerPeter Rajnoha <prajnoha@redhat.com>
Mon, 20 Sep 2010 14:23:20 +0000 (14:23 +0000)
WHATS_NEW
lib/format_text/export.c
lib/format_text/import-export.h
lib/format_text/tags.c

index 5e9e8ae92e69b0d61214236eb192826372586c8a..895621ca259d2f8ca85e2be0cf91f442ec21eea3 100644 (file)
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
 Version 2.02.74 - 
 ==================================
+  Use dynamic allocation for metadata's tag buffer (removes 4096 char. limit).
   Add random suffix to archive file names to prevent races when being created.
   Reinitialize archive and backup handling on toolcontext refresh.
   Fix opprobriously slow I/O to cluster mirrors created with --nosync.
index bb558fce238f25b97cbfdd4f8b8bb5206174cc8a..d16a7fcf656801d8800dadc1b4b4576da6054b87 100644 (file)
@@ -366,6 +366,7 @@ static int _print_flag_config(struct formatter *f, uint64_t status, int type)
 static int _print_vg(struct formatter *f, struct volume_group *vg)
 {
        char buffer[4096];
+       char *tag_buffer = NULL;
 
        if (!id_write_format(&vg->id, buffer, sizeof(buffer)))
                return_0;
@@ -378,9 +379,10 @@ static int _print_vg(struct formatter *f, struct volume_group *vg)
                return_0;
 
        if (!dm_list_empty(&vg->tags)) {
-               if (!print_tags(&vg->tags, buffer, sizeof(buffer)))
+               if (!(tag_buffer = alloc_printed_tags(&vg->tags)))
                        return_0;
-               outf(f, "tags = %s", buffer);
+               outf(f, "tags = %s", tag_buffer);
+               dm_free(tag_buffer);
        }
 
        if (vg->system_id && *vg->system_id)
@@ -426,7 +428,7 @@ static int _print_pvs(struct formatter *f, struct volume_group *vg)
        struct pv_list *pvl;
        struct physical_volume *pv;
        char buffer[4096];
-       char *buf;
+       char *buf, *tag_buffer = NULL;
        const char *name;
 
        outf(f, "physical_volumes {");
@@ -461,9 +463,10 @@ static int _print_pvs(struct formatter *f, struct volume_group *vg)
                        return_0;
 
                if (!dm_list_empty(&pv->tags)) {
-                       if (!print_tags(&pv->tags, buffer, sizeof(buffer)))
+                       if (!(tag_buffer = alloc_printed_tags(&pv->tags)))
                                return_0;
-                       outf(f, "tags = %s", buffer);
+                       outf(f, "tags = %s", tag_buffer);
+                       dm_free(tag_buffer);
                }
 
                outsize(f, pv->size, "dev_size = %" PRIu64, pv->size);
@@ -484,7 +487,7 @@ static int _print_pvs(struct formatter *f, struct volume_group *vg)
 static int _print_segment(struct formatter *f, struct volume_group *vg,
                          int count, struct lv_segment *seg)
 {
-       char buffer[4096];
+       char *tag_buffer = NULL;
 
        outf(f, "segment%u {", count);
        _inc_indent(f);
@@ -497,9 +500,10 @@ static int _print_segment(struct formatter *f, struct volume_group *vg,
        outf(f, "type = \"%s\"", seg->segtype->name);
 
        if (!dm_list_empty(&seg->tags)) {
-               if (!print_tags(&seg->tags, buffer, sizeof(buffer)))
+               if (!(tag_buffer = alloc_printed_tags(&seg->tags)))
                        return_0;
-               outf(f, "tags = %s", buffer);
+               outf(f, "tags = %s", tag_buffer);
+               dm_free(tag_buffer);
        }
 
        if (seg->segtype->ops->text_export &&
@@ -553,6 +557,7 @@ static int _print_lv(struct formatter *f, struct logical_volume *lv)
 {
        struct lv_segment *seg;
        char buffer[4096];
+       char *tag_buffer = NULL;
        int seg_count;
 
        outnl(f);
@@ -569,9 +574,10 @@ static int _print_lv(struct formatter *f, struct logical_volume *lv)
                return_0;
 
        if (!dm_list_empty(&lv->tags)) {
-               if (!print_tags(&lv->tags, buffer, sizeof(buffer)))
+               if (!(tag_buffer = alloc_printed_tags(&lv->tags)))
                        return_0;
-               outf(f, "tags = %s", buffer);
+               outf(f, "tags = %s", tag_buffer);
+               dm_free(tag_buffer);
        }
 
        if (lv->alloc != ALLOC_INHERIT)
index 019c739e7b52d4d1c425d5ac1e1a9d4f765877e9..e59a3c2ad4242ce133eaa55b638715b5e83fc27f 100644 (file)
@@ -61,7 +61,7 @@ struct text_vg_version_ops *text_vg_vsn1_init(void);
 int print_flags(uint64_t status, int type, char *buffer, size_t size);
 int read_flags(uint64_t *status, int type, struct config_value *cv);
 
-int print_tags(struct dm_list *tags, char *buffer, size_t size);
+char *alloc_printed_tags(struct dm_list *tags);
 int read_tags(struct dm_pool *mem, struct dm_list *tags, struct config_value *cv);
 
 int text_vg_export_file(struct volume_group *vg, const char *desc, FILE *fp);
index eeb0af7b2ab745834aabf23264a4aa11852b17b3..65db03e4e146bba00b304857243079f6d1d122c5 100644 (file)
 #include "str_list.h"
 #include "lvm-string.h"
 
-int print_tags(struct dm_list *tags, char *buffer, size_t size)
+char *alloc_printed_tags(struct dm_list *tags)
 {
        struct str_list *sl;
        int first = 1;
+       size_t size = 0;
+       char *buffer, *buf;
 
-       if (!emit_to_buffer(&buffer, &size, "["))
-               return_0;
+       dm_list_iterate_items(sl, tags)
+               /* '"' + tag + '"' + ',' + ' ' */
+               size += strlen(sl->str) + 4;
+       /* '[' + ']' + '\0' */
+       size += 3;
+
+       if (!(buffer = buf = dm_malloc(size))) {
+               log_error("Could not allocate memory for tag list buffer.");
+               return NULL;
+       }
+
+       if (!emit_to_buffer(&buf, &size, "["))
+               goto bad;
 
        dm_list_iterate_items(sl, tags) {
                if (!first) {
-                       if (!emit_to_buffer(&buffer, &size, ", "))
-                               return_0;
+                       if (!emit_to_buffer(&buf, &size, ", "))
+                               goto bad;
                } else
                        first = 0;
 
-               if (!emit_to_buffer(&buffer, &size, "\"%s\"", sl->str))
-                       return_0;
+               if (!emit_to_buffer(&buf, &size, "\"%s\"", sl->str))
+                       goto bad;
        }
 
-       if (!emit_to_buffer(&buffer, &size, "]"))
-               return_0;
+       if (!emit_to_buffer(&buf, &size, "]"))
+               goto bad;
 
-       return 1;
+       return buffer;
+
+bad:
+       dm_free(buffer);
+       return_NULL;
 }
 
 int read_tags(struct dm_pool *mem, struct dm_list *tags, struct config_value *cv)
This page took 0.050113 seconds and 5 git commands to generate.