]> sourceware.org Git - lvm2.git/commitdiff
Add metadata_areas_ignored list and functions to manage ignored mdas.
authorDave Wysochanski <dwysocha@redhat.com>
Mon, 28 Jun 2010 20:33:22 +0000 (20:33 +0000)
committerDave Wysochanski <dwysocha@redhat.com>
Mon, 28 Jun 2010 20:33:22 +0000 (20:33 +0000)
Add a second mda list, metadata_areas_ignored to fid, and a couple
functions, fid_add_mda() and fid_add_mdas() to help manage the lists.

These functions are needed to properly count the ignored mdas and
manage the lists attached to the 'fid' and ultimately the 'vg'.

Ensure metadata_areas_ignored is initialized in other formats, even
if the list is never used.

Signed-off-by: Dave Wysochanski <dwysocha@redhat.com>
lib/format1/format1.c
lib/format_pool/format_pool.c
lib/format_text/format-text.c
lib/metadata/metadata-exported.h
lib/metadata/metadata.c
lib/metadata/metadata.h
lib/report/report.c

index 495f0c711d06a4ee8776c802b188ccb56d5ff246..8b295ebb91bab5136b1e24db5d7c3c61a287c18c 100644 (file)
@@ -464,6 +464,7 @@ static struct format_instance *_format1_create_instance(const struct format_type
 
        fid->fmt = fmt;
        dm_list_init(&fid->metadata_areas_in_use);
+       dm_list_init(&fid->metadata_areas_ignored);
 
        /* Define a NULL metadata area */
        if (!(mda = dm_pool_alloc(fmt->cmd->mem, sizeof(*mda)))) {
index 01bf65899e3df36af8a49d7f2da18f57cbecda9c..1722b0482a5706c6f2d12db7c0da7df673b0e1bc 100644 (file)
@@ -263,6 +263,7 @@ static struct format_instance *_pool_create_instance(const struct format_type *f
 
        fid->fmt = fmt;
        dm_list_init(&fid->metadata_areas_in_use);
+       dm_list_init(&fid->metadata_areas_ignored);
 
        /* Define a NULL metadata area */
        if (!(mda = dm_pool_zalloc(fmt->cmd->mem, sizeof(*mda)))) {
index db352eaa762d8e255afc0d7b28de4f334a70506f..2fefb2fc8360048fcc9173cfc8d20d619078c133 100644 (file)
@@ -1209,6 +1209,7 @@ static int _scan_raw(const struct format_type *fmt)
 
        fid.fmt = fmt;
        dm_list_init(&fid.metadata_areas_in_use);
+       dm_list_init(&fid.metadata_areas_ignored);
 
        dm_list_iterate_items(rl, raw_list) {
                /* FIXME We're reading mdah twice here... */
@@ -1915,6 +1916,7 @@ static struct format_instance *_text_create_text_instance(const struct format_ty
 
        fid->fmt = fmt;
        dm_list_init(&fid->metadata_areas_in_use);
+       dm_list_init(&fid->metadata_areas_ignored);
 
        if (!vgname) {
                if (!(mda = dm_pool_alloc(fmt->cmd->mem, sizeof(*mda))))
index 6923c4059040bf866bcb5866359a2415efd8e0e9..2030ffe1937a012a749c2e34f0a400c10c0cc9de 100644 (file)
@@ -215,7 +215,14 @@ struct physical_volume {
 
 struct format_instance {
        const struct format_type *fmt;
-       struct dm_list metadata_areas_in_use;   /* e.g. metadata locations */
+       /*
+        * Each mda in a vg is on exactly one of the below lists.
+        * MDAs on the 'in_use' list will be read from / written to
+        * disk, while MDAs on the 'ignored' list will not be read
+        * or written to.
+        */
+       struct dm_list metadata_areas_in_use;
+       struct dm_list metadata_areas_ignored;
        void *private;
 };
 
index 74f1fa455b1e0ad52879061ad8278bfc7083446a..fdd5838559e18dac14e2043caf0b1099d499deb1 100644 (file)
@@ -3855,6 +3855,29 @@ uint32_t pv_pe_alloc_count(const struct physical_volume *pv)
        return pv_field(pv, pe_alloc_count);
 }
 
+void fid_add_mda(struct format_instance *fid, struct metadata_area *mda)
+{
+       if (mda_is_ignored(mda))
+               dm_list_add(&fid->metadata_areas_ignored,
+                           &mda->list);
+       else
+               dm_list_add(&fid->metadata_areas_in_use,
+                           &mda->list);
+}
+
+int fid_add_mdas(struct format_instance *fid, struct dm_list *mdas)
+{
+       struct metadata_area *mda, *mda_new;
+
+       dm_list_iterate_items(mda, mdas) {
+               mda_new = mda_copy(fid->fmt->cmd->mem, mda);
+               if (!mda_new)
+                       return_0;
+               fid_add_mda(fid, mda_new);
+       }
+       return 1;
+}
+
 /*
  * Copy constructor for a metadata_area.
  */
index 419ad43129fa2283606618315cd16ddbca6de1ac..22e5dbb43fa0a4cfd02c1054be93525425af801d 100644 (file)
@@ -183,6 +183,8 @@ struct metadata_area *mda_copy(struct dm_pool *mem,
 unsigned mda_is_ignored(struct metadata_area *mda);
 void mda_set_ignored(struct metadata_area *mda, int value);
 unsigned mda_locns_match(struct metadata_area *mda1, struct metadata_area *mda2);
+void fid_add_mda(struct format_instance *fid, struct metadata_area *mda);
+int fid_add_mdas(struct format_instance *fid, struct dm_list *mdas);
 
 #define seg_pvseg(seg, s)      (seg)->areas[(s)].u.pv.pvseg
 #define seg_dev(seg, s)                (seg)->areas[(s)].u.pv.pvseg->pv->dev
index 12fc79109fdf24c5af76de83750d0563a69223ae..831c267714d9e8b317cde2f1ab50ae55a287b682 100644 (file)
@@ -1127,6 +1127,7 @@ static int _copypercent_disp(struct dm_report *rh __attribute((unused)),
 /* necessary for displaying something for PVs not belonging to VG */
 static struct format_instance _dummy_fid = {
        .metadata_areas_in_use = { &(_dummy_fid.metadata_areas_in_use), &(_dummy_fid.metadata_areas_in_use) },
+       .metadata_areas_ignored = { &(_dummy_fid.metadata_areas_ignored), &(_dummy_fid.metadata_areas_ignored) },
 };
 
 static struct volume_group _dummy_vg = {
This page took 0.053229 seconds and 5 git commands to generate.