public inbox for lvm2-cvs@sourceware.org
help / color / mirror / Atom feed
* LVM2/lib format1/format1.c format_pool/format_ ...
@ 2012-02-15  1:44 mornfall
  0 siblings, 0 replies; 6+ messages in thread
From: mornfall @ 2012-02-15  1:44 UTC (permalink / raw)
  To: lvm-devel, lvm2-cvs

CVSROOT:	/cvs/lvm2
Module name:	LVM2
Changes by:	mornfall@sourceware.org	2012-02-15 01:44:59

Modified files:
	lib/format1    : format1.c 
	lib/format_pool: format_pool.c 

Log message:
	Fix pool names of the format1/format_pool orphan VGs.

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/format1/format1.c.diff?cvsroot=lvm2&r1=1.146&r2=1.147
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/format_pool/format_pool.c.diff?cvsroot=lvm2&r1=1.50&r2=1.51

--- LVM2/lib/format1/format1.c	2012/02/13 11:03:59	1.146
+++ LVM2/lib/format1/format1.c	2012/02/15 01:44:58	1.147
@@ -603,7 +603,7 @@
 		return NULL;
 	}
 
-	if (!(fmt->orphan_vg = alloc_vg("text_orphan", cmd, fmt->orphan_vg_name))) {
+	if (!(fmt->orphan_vg = alloc_vg("format1_orphan", cmd, fmt->orphan_vg_name))) {
 		log_error("Couldn't create lvm1 orphan VG.");
 		dm_free(fmt);
 		return NULL;
--- LVM2/lib/format_pool/format_pool.c	2012/02/13 11:04:00	1.50
+++ LVM2/lib/format_pool/format_pool.c	2012/02/15 01:44:59	1.51
@@ -314,7 +314,7 @@
 		return NULL;
 	}
 
-	if (!(fmt->orphan_vg = alloc_vg("text_orphan", cmd, fmt->orphan_vg_name))) {
+	if (!(fmt->orphan_vg = alloc_vg("pool_orphan", cmd, fmt->orphan_vg_name))) {
 		log_error("Couldn't create lvm1 orphan VG.");
 		dm_free(fmt);
 		return NULL;


^ permalink raw reply	[flat|nested] 6+ messages in thread

* LVM2/lib format1/format1.c format_pool/format_ ...
@ 2011-02-21 12:20 prajnoha
  0 siblings, 0 replies; 6+ messages in thread
From: prajnoha @ 2011-02-21 12:20 UTC (permalink / raw)
  To: lvm-devel, lvm2-cvs

CVSROOT:	/cvs/lvm2
Module name:	LVM2
Changes by:	prajnoha@sourceware.org	2011-02-21 12:20:19

Modified files:
	lib/format1    : format1.c 
	lib/format_pool: format_pool.c 
	lib/format_text: format-text.c 
	lib/metadata   : metadata.h 

Log message:
	Separate new pv_initialise function out of the original pv_setup code.
	
	pv_initiliase initialises a new PV
	pv_setup sets up an existing PV with a VG

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/format1/format1.c.diff?cvsroot=lvm2&r1=1.129&r2=1.130
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/format_pool/format_pool.c.diff?cvsroot=lvm2&r1=1.37&r2=1.38
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/format_text/format-text.c.diff?cvsroot=lvm2&r1=1.160&r2=1.161
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/metadata/metadata.h.diff?cvsroot=lvm2&r1=1.235&r2=1.236

--- LVM2/lib/format1/format1.c	2011/02/21 12:15:59	1.129
+++ LVM2/lib/format1/format1.c	2011/02/21 12:20:18	1.130
@@ -361,16 +361,14 @@
 	return r;
 }
 
-static int _format1_pv_setup(const struct format_type *fmt,
-			     uint64_t pe_start, uint32_t extent_count,
-			     uint32_t extent_size,
-			     unsigned long data_alignment __attribute__((unused)),
-			     unsigned long data_alignment_offset __attribute__((unused)),
-			     int pvmetadatacopies __attribute__((unused)),
-			     uint64_t pvmetadatasize __attribute__((unused)),
-			     unsigned metadataignore __attribute__((unused)),
-			     struct dm_list *mdas __attribute__((unused)),
-			     struct physical_volume *pv, struct volume_group *vg __attribute__((unused)))
+static int _format1_pv_initialise(const struct format_type * fmt,
+				  int64_t label_sector __attribute__((unused)),
+				  uint64_t pe_start,
+				  uint32_t extent_count,
+				  uint32_t extent_size,
+				  unsigned long data_alignment __attribute__((unused)),
+				  unsigned long data_alignment_offset __attribute__((unused)),
+				  struct physical_volume * pv)
 {
 	if (pv->size > MAX_PV_SIZE)
 		pv->size--;
@@ -400,6 +398,21 @@
 	return 1;
 }
 
+static int _format1_pv_setup(const struct format_type *fmt,
+			     uint64_t pe_start, uint32_t extent_count,
+			     uint32_t extent_size,
+			     unsigned long data_alignment __attribute__((unused)),
+			     unsigned long data_alignment_offset __attribute__((unused)),
+			     int pvmetadatacopies __attribute__((unused)),
+			     uint64_t pvmetadatasize __attribute__((unused)),
+			     unsigned metadataignore __attribute__((unused)),
+			     struct dm_list *mdas __attribute__((unused)),
+			     struct physical_volume *pv,
+			     struct volume_group *vg __attribute__((unused)))
+{
+	return _format1_pv_initialise(fmt, -1, 0, 0, vg->extent_size, 0, 0, pv);
+}
+
 static int _format1_lv_setup(struct format_instance *fid, struct logical_volume *lv)
 {
 	uint64_t max_size = UINT_MAX;
@@ -560,6 +573,7 @@
 
 static struct format_handler _format1_ops = {
 	.pv_read = _format1_pv_read,
+	.pv_initialise = _format1_pv_initialise,
 	.pv_setup = _format1_pv_setup,
 	.pv_write = _format1_pv_write,
 	.lv_setup = _format1_lv_setup,
--- LVM2/lib/format_pool/format_pool.c	2011/02/21 12:15:59	1.37
+++ LVM2/lib/format_pool/format_pool.c	2011/02/21 12:20:18	1.38
@@ -188,6 +188,18 @@
 	return NULL;
 }
 
+static int _pool_pv_initialise(const struct format_type *fmt __attribute__((unused)),
+			       int64_t label_sector __attribute__((unused)),
+			       uint64_t pe_start __attribute__((unused)),
+			       uint32_t extent_count __attribute__((unused)),
+			       uint32_t extent_size __attribute__((unused)),
+			       unsigned long data_alignment __attribute__((unused)),
+			       unsigned long data_alignment_offset __attribute__((unused)),
+			       struct physical_volume *pv __attribute__((unused)))
+{
+	return 1;
+}
+
 static int _pool_pv_setup(const struct format_type *fmt __attribute__((unused)),
 			  uint64_t pe_start __attribute__((unused)),
 			  uint32_t extent_count __attribute__((unused)),
@@ -293,6 +305,7 @@
 /* *INDENT-OFF* */
 static struct format_handler _format_pool_ops = {
 	.pv_read = _pool_pv_read,
+	.pv_initialise = _pool_pv_initialise,
 	.pv_setup = _pool_pv_setup,
 	.create_instance = _pool_create_instance,
 	.destroy_instance = _pool_destroy_instance,
--- LVM2/lib/format_text/format-text.c	2011/02/21 12:17:54	1.160
+++ LVM2/lib/format_text/format-text.c	2011/02/21 12:20:18	1.161
@@ -1687,6 +1687,75 @@
 	return 1;
 }
 
+static int _text_pv_initialise(const struct format_type *fmt,
+			       const int64_t label_sector,
+			       uint64_t pe_start,
+			       uint32_t extent_count,
+			       uint32_t extent_size,
+			       unsigned long data_alignment,
+			       unsigned long data_alignment_offset,
+			       struct physical_volume *pv)
+{
+	struct text_fid_pv_context *fid_pv_tc;
+
+	/*
+	 * Try to keep the value of PE start set to a firm value if requested.
+	 * This is usefull when restoring existing PE start value (backups etc.).
+	 */
+	if (pe_start != PV_PE_START_CALC)
+		pv->pe_start = pe_start;
+
+	if (!data_alignment)
+		data_alignment = find_config_tree_int(pv->fmt->cmd,
+					      "devices/data_alignment",
+					      0) * 2;
+
+	if (set_pe_align(pv, data_alignment) != data_alignment &&
+	    data_alignment) {
+		log_error("%s: invalid data alignment of "
+			  "%lu sectors (requested %lu sectors)",
+			  pv_dev_name(pv), pv->pe_align, data_alignment);
+		return 0;
+	}
+
+	if (set_pe_align_offset(pv, data_alignment_offset) != data_alignment_offset &&
+	    data_alignment_offset) {
+		log_error("%s: invalid data alignment offset of "
+			  "%lu sectors (requested %lu sectors)",
+			  pv_dev_name(pv), pv->pe_align_offset, data_alignment_offset);
+		return 0;
+	}
+
+	if (pv->pe_align < pv->pe_align_offset) {
+		log_error("%s: pe_align (%lu sectors) must not be less "
+			  "than pe_align_offset (%lu sectors)",
+			  pv_dev_name(pv), pv->pe_align, pv->pe_align_offset);
+		return 0;
+	}
+
+	if (pe_start == PV_PE_START_CALC && pv->pe_start < pv->pe_align)
+		pv->pe_start = pv->pe_align;
+
+	if (extent_size)
+		pv->pe_size = extent_size;
+
+	if (extent_count)
+		pv->pe_count = extent_count;
+
+	if ((pv->pe_start + pv->pe_count * pv->pe_size - 1) > (pv->size << SECTOR_SHIFT)) {
+		log_error("Physical extents end beyond end of device %s.",
+			   pv_dev_name(pv));
+		return 0;
+	}
+
+	if (label_sector != -1) {
+		fid_pv_tc = (struct text_fid_pv_context *) pv->fid->private;
+		fid_pv_tc->label_sector = label_sector;
+	}
+
+	return 1;
+}
+
 static void _text_destroy_instance(struct format_instance *fid __attribute__((unused)))
 {
 }
@@ -2368,6 +2437,7 @@
 static struct format_handler _text_handler = {
 	.scan = _text_scan,
 	.pv_read = _text_pv_read,
+	.pv_initialise = _text_pv_initialise,
 	.pv_setup = _text_pv_setup,
 	.pv_add_metadata_area = _text_pv_add_metadata_area,
 	.pv_remove_metadata_area = _text_pv_remove_metadata_area,
--- LVM2/lib/metadata/metadata.h	2011/02/21 12:17:54	1.235
+++ LVM2/lib/metadata/metadata.h	2011/02/21 12:20:19	1.236
@@ -256,6 +256,18 @@
 			struct physical_volume * pv, int scan_label_only);
 
 	/*
+	 * Initialise a new PV.
+	 */
+	int (*pv_initialise) (const struct format_type * fmt,
+			      int64_t label_sector,
+			      uint64_t pe_start,
+			      uint32_t extent_count,
+			      uint32_t extent_size,
+			      unsigned long data_alignment,
+			      unsigned long data_alignment_offset,
+			      struct physical_volume * pv);
+
+	/*
 	 * Tweak an already filled out a pv ready for importing into a
 	 * vg.  eg. pe_count is format specific.
 	 */


^ permalink raw reply	[flat|nested] 6+ messages in thread

* LVM2/lib format1/format1.c format_pool/format_ ...
@ 2011-02-21 12:05 prajnoha
  0 siblings, 0 replies; 6+ messages in thread
From: prajnoha @ 2011-02-21 12:05 UTC (permalink / raw)
  To: lvm-devel, lvm2-cvs

CVSROOT:	/cvs/lvm2
Module name:	LVM2
Changes by:	prajnoha@sourceware.org	2011-02-21 12:05:50

Modified files:
	lib/format1    : format1.c 
	lib/format_pool: format_pool.c 
	lib/format_text: format-text.c format-text.h 
	lib/metadata   : metadata.c metadata.h 

Log message:
	Change create_instance to create PV-based as well as VG-based format instances.
	Add supporting functions to work with the format instance and metadata area
	structures stored within the format instance. Add support for simple indexing
	of metadata areas using PV id and mda order (for on-disk PV only for now, we
	can extend the indexing even for other mdas if needed - we only need to define
	a proper key for the index).

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/format1/format1.c.diff?cvsroot=lvm2&r1=1.127&r2=1.128
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/format_pool/format_pool.c.diff?cvsroot=lvm2&r1=1.35&r2=1.36
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/format_text/format-text.c.diff?cvsroot=lvm2&r1=1.155&r2=1.156
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/format_text/format-text.h.diff?cvsroot=lvm2&r1=1.28&r2=1.29
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/metadata/metadata.c.diff?cvsroot=lvm2&r1=1.424&r2=1.425
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/metadata/metadata.h.diff?cvsroot=lvm2&r1=1.230&r2=1.231

--- LVM2/lib/format1/format1.c	2010/12/20 14:06:33	1.127
+++ LVM2/lib/format1/format1.c	2011/02/21 12:05:49	1.128
@@ -522,9 +522,7 @@
 };
 
 static struct format_instance *_format1_create_instance(const struct format_type *fmt,
-						const char *vgname __attribute__((unused)),
-						const char *vgid __attribute__((unused)),
-						void *private __attribute__((unused)))
+							const struct format_instance_ctx *fic)
 {
 	struct format_instance *fid;
 	struct metadata_area *mda;
@@ -533,6 +531,8 @@
 		return_NULL;
 
 	fid->fmt = fmt;
+	fid->type = fic->type;
+
 	dm_list_init(&fid->metadata_areas_in_use);
 	dm_list_init(&fid->metadata_areas_ignored);
 
--- LVM2/lib/format_pool/format_pool.c	2010/12/20 13:32:49	1.35
+++ LVM2/lib/format_pool/format_pool.c	2011/02/21 12:05:50	1.36
@@ -249,9 +249,7 @@
 /* *INDENT-ON* */
 
 static struct format_instance *_pool_create_instance(const struct format_type *fmt,
-						const char *vgname __attribute__((unused)),
-						const char *vgid __attribute__((unused)),
-						void *private __attribute__((unused)))
+						     const struct format_instance_ctx *fic)
 {
 	struct format_instance *fid;
 	struct metadata_area *mda;
@@ -263,6 +261,8 @@
 	}
 
 	fid->fmt = fmt;
+	fid->type = fic->type;
+
 	dm_list_init(&fid->metadata_areas_in_use);
 	dm_list_init(&fid->metadata_areas_ignored);
 
--- LVM2/lib/format_text/format-text.c	2011/02/18 14:16:12	1.155
+++ LVM2/lib/format_text/format-text.c	2011/02/21 12:05:50	1.156
@@ -37,16 +37,18 @@
 #include <dirent.h>
 #include <ctype.h>
 
-static struct format_instance *_text_create_text_instance(const struct format_type
-						     *fmt, const char *vgname,
-						     const char *vgid,
-						     void *context);
+static struct format_instance *_text_create_text_instance(const struct format_type *fmt,
+							  const struct format_instance_ctx *fic);
 
 struct text_fid_context {
 	char *raw_metadata_buf;
 	uint32_t raw_metadata_buf_size;
 };
 
+struct text_fid_pv_context {
+	int64_t label_sector;
+};
+
 struct dir_list {
 	struct dm_list list;
 	char dir[0];
@@ -1911,13 +1913,38 @@
 	return 1;
 }
 
-/* NULL vgname means use only the supplied context e.g. an archive file */
-static struct format_instance *_text_create_text_instance(const struct format_type
-						     *fmt, const char *vgname,
-						     const char *vgid,
-						     void *context)
+static int _create_pv_text_instance(struct format_instance *fid,
+                                    const struct format_instance_ctx *fic)
 {
-	struct format_instance *fid;
+	struct text_fid_pv_context *fid_pv_tc;
+	struct lvmcache_info *info;
+
+	if (!(fid_pv_tc = (struct text_fid_pv_context *)
+			dm_pool_zalloc(fid->fmt->cmd->mem, sizeof(*fid_pv_tc)))) {
+		log_error("Couldn't allocate text_fid_pv_context.");
+		return 0;
+	}
+	fid_pv_tc->label_sector = -1;
+	fid->private = (void *) fid_pv_tc;
+
+	if (!(fid->metadata_areas_index.array = dm_pool_zalloc(fid->fmt->cmd->mem,
+					FMT_TEXT_MAX_MDAS_PER_PV *
+					sizeof(struct metadata_area *)))) {
+		log_error("Couldn't allocate format instance metadata index.");
+		return 0;
+	}
+
+	if (fic->type & FMT_INSTANCE_MDAS &&
+	    (info = info_from_pvid(fic->context.pv_id, 0)))
+		fid_add_mdas(fid, &info->mdas, fic->context.pv_id, ID_LEN);
+
+	return 1;
+}
+
+static int _create_vg_text_instance(struct format_instance *fid,
+                                    const struct format_instance_ctx *fic)
+{
+	uint32_t type = fic->type;
 	struct text_fid_context *fidtc;
 	struct metadata_area *mda;
 	struct mda_context *mdac;
@@ -1927,86 +1954,120 @@
 	char path[PATH_MAX];
 	struct lvmcache_vginfo *vginfo;
 	struct lvmcache_info *info;
-
-	if (!(fid = dm_pool_alloc(fmt->cmd->mem, sizeof(*fid)))) {
-		log_error("Couldn't allocate format instance object.");
-		return NULL;
-	}
+	const char *vg_name, *vg_id;
 
 	if (!(fidtc = (struct text_fid_context *)
-			dm_pool_zalloc(fmt->cmd->mem,sizeof(*fidtc)))) {
+			dm_pool_zalloc(fid->fmt->cmd->mem,sizeof(*fidtc)))) {
 		log_error("Couldn't allocate text_fid_context.");
-		return NULL;
+		return 0;
 	}
 
 	fidtc->raw_metadata_buf = NULL;
 	fid->private = (void *) fidtc;
 
-	fid->fmt = fmt;
-	dm_list_init(&fid->metadata_areas_in_use);
-	dm_list_init(&fid->metadata_areas_ignored);
-
-	if (!vgname) {
-		if (!(mda = dm_pool_zalloc(fmt->cmd->mem, sizeof(*mda))))
-			return_NULL;
+	if (type & FMT_INSTANCE_PRIVATE_MDAS) {
+		if (!(mda = dm_pool_zalloc(fid->fmt->cmd->mem, sizeof(*mda))))
+			return_0;
 		mda->ops = &_metadata_text_file_backup_ops;
-		mda->metadata_locn = context;
+		mda->metadata_locn = fic->context.private;
 		mda->status = 0;
-		fid_add_mda(fid, mda);
+		fid->metadata_areas_index.hash = NULL;
+		fid_add_mda(fid, mda, NULL, 0, 0);
 	} else {
-		dir_list = &((struct mda_lists *) fmt->private)->dirs;
+		vg_name = fic->context.vg_ref.vg_name;
+		vg_id = fic->context.vg_ref.vg_id;
+
+		if (!(fid->metadata_areas_index.hash = dm_hash_create(128))) {
+			log_error("Couldn't create metadata index for format "
+				  "instance of VG %s.", vg_name);
+			return 0;
+		}
 
-		dm_list_iterate_items(dl, dir_list) {
-			if (dm_snprintf(path, PATH_MAX, "%s/%s",
-					 dl->dir, vgname) < 0) {
-				log_error("Name too long %s/%s", dl->dir,
-					  vgname);
-				return NULL;
+		if (type & FMT_INSTANCE_AUX_MDAS) {
+			dir_list = &((struct mda_lists *) fid->fmt->private)->dirs;
+			dm_list_iterate_items(dl, dir_list) {
+				if (dm_snprintf(path, PATH_MAX, "%s/%s", dl->dir, vg_name) < 0) {
+					log_error("Name too long %s/%s", dl->dir, vg_name);
+					return 0;
+				}
+
+				if (!(mda = dm_pool_zalloc(fid->fmt->cmd->mem, sizeof(*mda))))
+					return_0;
+				mda->ops = &_metadata_text_file_ops;
+				mda->metadata_locn = create_text_context(fid->fmt->cmd, path, NULL);
+				mda->status = 0;
+				fid_add_mda(fid, mda, NULL, 0, 0);
 			}
 
-			context = create_text_context(fmt->cmd, path, NULL);
-			if (!(mda = dm_pool_zalloc(fmt->cmd->mem, sizeof(*mda))))
-				return_NULL;
-			mda->ops = &_metadata_text_file_ops;
-			mda->metadata_locn = context;
-			mda->status = 0;
-			fid_add_mda(fid, mda);
-		}
-
-		raw_list = &((struct mda_lists *) fmt->private)->raws;
-
-		dm_list_iterate_items(rl, raw_list) {
-			/* FIXME Cache this; rescan below if some missing */
-			if (!_raw_holds_vgname(fid, &rl->dev_area, vgname))
-				continue;
-
-			if (!(mda = dm_pool_zalloc(fmt->cmd->mem, sizeof(*mda))))
-				return_NULL;
-
-			if (!(mdac = dm_pool_zalloc(fmt->cmd->mem, sizeof(*mdac))))
-				return_NULL;
-			mda->metadata_locn = mdac;
-			/* FIXME Allow multiple dev_areas inside area */
-			memcpy(&mdac->area, &rl->dev_area, sizeof(mdac->area));
-			mda->ops = &_metadata_text_raw_ops;
-			mda->status = 0;
-			/* FIXME MISTAKE? mda->metadata_locn = context; */
-			fid_add_mda(fid, mda);
-		}
-
-		/* Scan PVs in VG for any further MDAs */
-		lvmcache_label_scan(fmt->cmd, 0);
-		if (!(vginfo = vginfo_from_vgname(vgname, vgid)))
-			goto_out;
-		dm_list_iterate_items(info, &vginfo->infos) {
-			if (!fid_add_mdas(fid, &info->mdas))
-				return_NULL;
+			raw_list = &((struct mda_lists *) fid->fmt->private)->raws;
+			dm_list_iterate_items(rl, raw_list) {
+				/* FIXME Cache this; rescan below if some missing */
+				if (!_raw_holds_vgname(fid, &rl->dev_area, vg_name))
+					continue;
+
+				if (!(mda = dm_pool_zalloc(fid->fmt->cmd->mem, sizeof(*mda))))
+					return_0;
+
+				if (!(mdac = dm_pool_zalloc(fid->fmt->cmd->mem, sizeof(*mdac))))
+					return_0;
+				mda->metadata_locn = mdac;
+				/* FIXME Allow multiple dev_areas inside area */
+				memcpy(&mdac->area, &rl->dev_area, sizeof(mdac->area));
+				mda->ops = &_metadata_text_raw_ops;
+				mda->status = 0;
+				/* FIXME MISTAKE? mda->metadata_locn = context; */
+				fid_add_mda(fid, mda, NULL, 0, 0);
+			}
+		}
+
+		if (type & FMT_INSTANCE_MDAS) {
+			/* Scan PVs in VG for any further MDAs */
+			lvmcache_label_scan(fid->fmt->cmd, 0);
+			if (!(vginfo = vginfo_from_vgname(vg_name, vg_id)))
+				goto_out;
+			dm_list_iterate_items(info, &vginfo->infos) {
+				if (!fid_add_mdas(fid, &info->mdas, info->dev->pvid, ID_LEN))
+					return_0;
+			}
 		}
+
 		/* FIXME Check raw metadata area count - rescan if required */
 	}
 
-      out:
-	return fid;
+out:
+	return 1;
+}
+
+/* NULL vgname means use only the supplied context e.g. an archive file */
+static struct format_instance *_text_create_text_instance(const struct format_type *fmt,
+							   const struct format_instance_ctx *fic)
+{
+	struct format_instance *fid;
+	int r;
+
+	if (!(fid = dm_pool_alloc(fmt->cmd->mem, sizeof(*fid)))) {
+		log_error("Couldn't allocate format instance object.");
+		return NULL;
+	}
+
+	fid->fmt = fmt;
+	fid->type = fic->type;
+
+	dm_list_init(&fid->metadata_areas_in_use);
+	dm_list_init(&fid->metadata_areas_ignored);
+
+	if (fid->type & FMT_INSTANCE_VG)
+		r = _create_vg_text_instance(fid, fic);
+	else
+		r = _create_pv_text_instance(fid, fic);
+
+	if (r)
+		return fid;
+	else {
+		dm_pool_free(fmt->cmd->mem, fid);
+		return NULL;
+	}
+
 }
 
 void *create_text_context(struct cmd_context *cmd, const char *path,
--- LVM2/lib/format_text/format-text.h	2010/06/30 12:17:24	1.28
+++ LVM2/lib/format_text/format-text.h	2011/02/21 12:05:50	1.29
@@ -22,6 +22,7 @@
 #define FMT_TEXT_NAME "lvm2"
 #define FMT_TEXT_ALIAS "text"
 #define FMT_TEXT_ORPHAN_VG_NAME ORPHAN_VG_NAME(FMT_TEXT_NAME)
+#define FMT_TEXT_MAX_MDAS_PER_PV 2
 
 /*
  * Archives a vg config.  'retain_days' is the minimum number of
--- LVM2/lib/metadata/metadata.c	2011/02/18 14:47:30	1.424
+++ LVM2/lib/metadata/metadata.c	2011/02/21 12:05:50	1.425
@@ -2887,7 +2887,8 @@
 					break;
 				}
 				if (dm_list_size(&info->mdas)) {
-					if (!fid_add_mdas(fid, &info->mdas))
+					if (!fid_add_mdas(fid, &info->mdas,
+							  info->dev->pvid, ID_LEN))
 						return_NULL;
 					 
 					log_debug("Empty mda found for VG %s.", vgname);
@@ -3918,22 +3919,117 @@
 	return FAILED_EXIST;
 }
 
-void fid_add_mda(struct format_instance *fid, struct metadata_area *mda)
+static int _convert_key_to_string(const char *key, size_t key_len,
+				  unsigned sub_key, char *buf, size_t buf_len)
 {
+	memcpy(buf, key, key_len);
+	buf += key_len;
+	buf_len -= key_len;
+	if ((dm_snprintf(buf, buf_len, "_%u", sub_key) == -1))
+		return_0;
+
+	return 1;
+}
+
+int fid_add_mda(struct format_instance *fid, struct metadata_area *mda,
+		 const char *key, size_t key_len, const unsigned sub_key)
+{
+	char full_key[PATH_MAX];
 	dm_list_add(mda_is_ignored(mda) ? &fid->metadata_areas_ignored :
 					  &fid->metadata_areas_in_use, &mda->list);
+
+	/* Return if the mda is not supposed to be indexed. */
+	if (!key)
+		return 1;
+
+	/* Add metadata area to index. */
+	if (fid->type & FMT_INSTANCE_VG) {
+		if (!_convert_key_to_string(key, key_len, sub_key,
+					    full_key, PATH_MAX))
+		return_0;
+
+		dm_hash_insert(fid->metadata_areas_index.hash,
+			       full_key, mda);
+	}
+	else
+		fid->metadata_areas_index.array[sub_key] = mda;
+
+	return 1;
 }
 
-int fid_add_mdas(struct format_instance *fid, struct dm_list *mdas)
+int fid_add_mdas(struct format_instance *fid, struct dm_list *mdas,
+		 const char *key, size_t key_len)
 {
 	struct metadata_area *mda, *mda_new;
+	unsigned mda_index = 0;
 
 	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);
+
+		fid_add_mda(fid, mda_new, key, key_len, mda_index);
+		mda_index++;
+	}
+
+	return 1;
+}
+
+struct metadata_area *fid_get_mda_indexed(struct format_instance *fid,
+					  const char *key, size_t key_len,
+					  const unsigned sub_key)
+{
+	char full_key[PATH_MAX];
+	struct metadata_area *mda = NULL;
+
+
+	if (fid->type & FMT_INSTANCE_VG) {
+		if (!_convert_key_to_string(key, key_len, sub_key,
+					    full_key, PATH_MAX))
+			return_NULL;
+		mda = (struct metadata_area *) dm_hash_lookup(fid->metadata_areas_index.hash,
+							      full_key);
 	}
+	else
+		mda = fid->metadata_areas_index.array[sub_key];
+
+	return mda;
+}
+
+int fid_remove_mda(struct format_instance *fid, struct metadata_area *mda,
+		   const char *key, size_t key_len, const unsigned sub_key)
+{
+	struct metadata_area *mda_indexed = NULL;
+	char full_key[PATH_MAX];
+
+	/* At least one of mda or key must be specified. */
+	if (!mda && !key)
+		return 1;
+
+	if (key) {
+		/*
+		 * If both mda and key specified, check given mda
+		 * with what we find using the index and return
+		 * immediately if these two do not match.
+		 */
+		if (!(mda_indexed = fid_get_mda_indexed(fid, key, key_len, sub_key)) ||
+		     (mda && mda != mda_indexed))
+			return 1;
+
+		mda = mda_indexed;
+
+		if (fid->type & FMT_INSTANCE_VG) {
+			if (!_convert_key_to_string(key, key_len, sub_key,
+					    full_key, PATH_MAX))
+				return_0;
+
+			dm_hash_remove(fid->metadata_areas_index.hash, full_key);
+		} else
+			fid->metadata_areas_index.array[sub_key] = NULL;
+	}
+
+	dm_list_del(&mda->list);
+
 	return 1;
 }
 
--- LVM2/lib/metadata/metadata.h	2011/02/21 12:01:23	1.230
+++ LVM2/lib/metadata/metadata.h	2011/02/21 12:05:50	1.231
@@ -190,8 +190,14 @@
 unsigned mda_is_ignored(struct metadata_area *mda);
 void mda_set_ignored(struct metadata_area *mda, unsigned ignored);
 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);
+int fid_add_mda(struct format_instance *fid, struct metadata_area *mda,
+		const char *key, size_t key_len, const unsigned sub_key);
+int fid_add_mdas(struct format_instance *fid, struct dm_list *mdas,
+		 const char *key, size_t key_len);
+int fid_remove_mda(struct format_instance *fid, struct metadata_area *mda,
+		   const char *key, size_t key_len, const unsigned sub_key);
+struct metadata_area *fid_get_mda_indexed(struct format_instance *fid,
+		const char *key, size_t key_len, const unsigned sub_key);
 int mdas_empty_or_ignored(struct dm_list *mdas);
 
 #define seg_pvseg(seg, s)	(seg)->areas[(s)].u.pv.pvseg
@@ -290,10 +296,8 @@
 	/*
 	 * Create format instance with a particular metadata area
 	 */
-	struct format_instance *(*create_instance) (const struct format_type *
-						    fmt, const char *vgname,
-						    const char *vgid,
-						    void *context);
+	struct format_instance *(*create_instance) (const struct format_type *fmt,
+						    const struct format_instance_ctx *fic);
 
 	/*
 	 * Destructor for format instance


^ permalink raw reply	[flat|nested] 6+ messages in thread

* LVM2/lib format1/format1.c format_pool/format_ ...
@ 2010-06-29 14:52 wysochanski
  0 siblings, 0 replies; 6+ messages in thread
From: wysochanski @ 2010-06-29 14:52 UTC (permalink / raw)
  To: lvm-devel, lvm2-cvs

CVSROOT:	/cvs/lvm2
Module name:	LVM2
Changes by:	wysochanski@sourceware.org	2010-06-29 14:52:57

Modified files:
	lib/format1    : format1.c 
	lib/format_pool: format_pool.c 
	lib/format_text: format-text.c 

Log message:
	Add more initializations of 'mda->flags' field.
	
	Mda allocation needs refactored into a single function but as an
	interim step, ensure mda->flags is initialized properly.

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/format1/format1.c.diff?cvsroot=lvm2&r1=1.118&r2=1.119
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/format_pool/format_pool.c.diff?cvsroot=lvm2&r1=1.29&r2=1.30
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/format_text/format-text.c.diff?cvsroot=lvm2&r1=1.134&r2=1.135

--- LVM2/lib/format1/format1.c	2010/06/28 20:33:22	1.118
+++ LVM2/lib/format1/format1.c	2010/06/29 14:52:56	1.119
@@ -467,13 +467,14 @@
 	dm_list_init(&fid->metadata_areas_ignored);
 
 	/* Define a NULL metadata area */
-	if (!(mda = dm_pool_alloc(fmt->cmd->mem, sizeof(*mda)))) {
+	if (!(mda = dm_pool_zalloc(fmt->cmd->mem, sizeof(*mda)))) {
 		dm_pool_free(fmt->cmd->mem, fid);
 		return_NULL;
 	}
 
 	mda->ops = &_metadata_format1_ops;
 	mda->metadata_locn = NULL;
+	mda->flags = 0;
 	dm_list_add(&fid->metadata_areas_in_use, &mda->list);
 
 	return fid;
--- LVM2/lib/format_pool/format_pool.c	2010/06/28 20:33:23	1.29
+++ LVM2/lib/format_pool/format_pool.c	2010/06/29 14:52:56	1.30
@@ -275,6 +275,7 @@
 
 	mda->ops = &_metadata_format_pool_ops;
 	mda->metadata_locn = NULL;
+	mda->flags = 0;
 	dm_list_add(&fid->metadata_areas_in_use, &mda->list);
 
 	return fid;
--- LVM2/lib/format_text/format-text.c	2010/06/29 13:29:53	1.134
+++ LVM2/lib/format_text/format-text.c	2010/06/29 14:52:57	1.135
@@ -1923,6 +1923,7 @@
 			return_NULL;
 		mda->ops = &_metadata_text_file_backup_ops;
 		mda->metadata_locn = context;
+		mda->flags = 0;
 		fid_add_mda(fid, mda);
 	} else {
 		dir_list = &((struct mda_lists *) fmt->private)->dirs;
@@ -1940,6 +1941,7 @@
 				return_NULL;
 			mda->ops = &_metadata_text_file_ops;
 			mda->metadata_locn = context;
+			mda->flags = 0;
 			fid_add_mda(fid, mda);
 		}
 
@@ -1959,6 +1961,7 @@
 			/* FIXME Allow multiple dev_areas inside area */
 			memcpy(&mdac->area, &rl->dev_area, sizeof(mdac->area));
 			mda->ops = &_metadata_text_raw_ops;
+			mda->flags = 0;
 			/* FIXME MISTAKE? mda->metadata_locn = context; */
 			fid_add_mda(fid, mda);
 		}


^ permalink raw reply	[flat|nested] 6+ messages in thread

* LVM2/lib format1/format1.c format_pool/format_ ...
@ 2010-06-28 20:33 wysochanski
  0 siblings, 0 replies; 6+ messages in thread
From: wysochanski @ 2010-06-28 20:33 UTC (permalink / raw)
  To: lvm-devel, lvm2-cvs

CVSROOT:	/cvs/lvm2
Module name:	LVM2
Changes by:	wysochanski@sourceware.org	2010-06-28 20:33:23

Modified files:
	lib/format1    : format1.c 
	lib/format_pool: format_pool.c 
	lib/format_text: format-text.c 
	lib/metadata   : metadata-exported.h metadata.c metadata.h 
	lib/report     : report.c 

Log message:
	Add metadata_areas_ignored list and functions to manage ignored mdas.
	
	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>

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/format1/format1.c.diff?cvsroot=lvm2&r1=1.117&r2=1.118
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/format_pool/format_pool.c.diff?cvsroot=lvm2&r1=1.28&r2=1.29
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/format_text/format-text.c.diff?cvsroot=lvm2&r1=1.131&r2=1.132
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/metadata/metadata-exported.h.diff?cvsroot=lvm2&r1=1.153&r2=1.154
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/metadata/metadata.c.diff?cvsroot=lvm2&r1=1.350&r2=1.351
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/metadata/metadata.h.diff?cvsroot=lvm2&r1=1.209&r2=1.210
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/report/report.c.diff?cvsroot=lvm2&r1=1.118&r2=1.119

--- LVM2/lib/format1/format1.c	2010/06/28 20:32:44	1.117
+++ LVM2/lib/format1/format1.c	2010/06/28 20:33:22	1.118
@@ -464,6 +464,7 @@
 
 	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)))) {
--- LVM2/lib/format_pool/format_pool.c	2010/06/28 20:32:46	1.28
+++ LVM2/lib/format_pool/format_pool.c	2010/06/28 20:33:23	1.29
@@ -263,6 +263,7 @@
 
 	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)))) {
--- LVM2/lib/format_text/format-text.c	2010/06/28 20:32:46	1.131
+++ LVM2/lib/format_text/format-text.c	2010/06/28 20:33:23	1.132
@@ -1209,6 +1209,7 @@
 
 	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 @@
 
 	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))))
--- LVM2/lib/metadata/metadata-exported.h	2010/06/28 20:32:46	1.153
+++ LVM2/lib/metadata/metadata-exported.h	2010/06/28 20:33:23	1.154
@@ -215,7 +215,14 @@
 
 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;
 };
 
--- LVM2/lib/metadata/metadata.c	2010/06/28 20:32:46	1.350
+++ LVM2/lib/metadata/metadata.c	2010/06/28 20:33:23	1.351
@@ -3855,6 +3855,29 @@
 	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.
  */
--- LVM2/lib/metadata/metadata.h	2010/06/28 20:32:46	1.209
+++ LVM2/lib/metadata/metadata.h	2010/06/28 20:33:23	1.210
@@ -183,6 +183,8 @@
 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
--- LVM2/lib/report/report.c	2010/06/28 20:32:47	1.118
+++ LVM2/lib/report/report.c	2010/06/28 20:33:23	1.119
@@ -1127,6 +1127,7 @@
 /* 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 = {


^ permalink raw reply	[flat|nested] 6+ messages in thread

* LVM2/lib format1/format1.c format_pool/format_ ...
@ 2009-07-27 17:43 wysochanski
  0 siblings, 0 replies; 6+ messages in thread
From: wysochanski @ 2009-07-27 17:43 UTC (permalink / raw)
  To: lvm-devel, lvm2-cvs

CVSROOT:	/cvs/lvm2
Module name:	LVM2
Changes by:	wysochanski@sourceware.org	2009-07-27 17:43:40

Modified files:
	lib/format1    : format1.c 
	lib/format_pool: format_pool.c 
	lib/format_text: import_vsn1.c 
	lib/metadata   : metadata-exported.h metadata.c 

Log message:
	Add vg_reduce to metadata.c and metadata-exported.h
	
	This function behaves a little bit different than vg_reduce_single, because
	it allowes to remove even the latest pv. This has been done to be consistent
	to lvm_vg_create, which creates an empty vg.
	
	removed_pvs has been added to the volume_group struct. vg_reduce adds remove
	pvs to this list to be able to commit the changes for the pvs in lvm_vg_comm
	in liblvm2app.
	
	Initialize removed_pvs list in format-specific volume_group constructors.
	Ideally, we should have a base constructor here that initializes the general
	non-format specific members of struct volume_group.  But until then, there
	are multiple places to initialize these members.  Maybe a better patch would
	be a base constructor patch for struct volume_group.  That is more work
	though.
	
	Signed-off-by: Dave Wysochanski <dwysocha@redhat.com>
	Signed-off-by: Thomas Woerner <twoerner@redhat.com>
	
	Author: Dave Wysochanski <dwysocha@redhat.com>

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/format1/format1.c.diff?cvsroot=lvm2&r1=1.112&r2=1.113
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/format_pool/format_pool.c.diff?cvsroot=lvm2&r1=1.23&r2=1.24
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/format_text/import_vsn1.c.diff?cvsroot=lvm2&r1=1.63&r2=1.64
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/metadata/metadata-exported.h.diff?cvsroot=lvm2&r1=1.102&r2=1.103
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/metadata/metadata.c.diff?cvsroot=lvm2&r1=1.269&r2=1.270

--- LVM2/lib/format1/format1.c	2009/04/10 09:59:18	1.112
+++ LVM2/lib/format1/format1.c	2009/07/27 17:43:39	1.113
@@ -132,6 +132,7 @@
 	dm_list_init(&vg->pvs);
 	dm_list_init(&vg->lvs);
 	dm_list_init(&vg->tags);
+	dm_list_init(&vg->removed_pvs);
 
 	if (!_check_vgs(pvs))
 		goto_bad;
--- LVM2/lib/format_pool/format_pool.c	2009/05/13 21:22:57	1.23
+++ LVM2/lib/format_pool/format_pool.c	2009/07/27 17:43:40	1.24
@@ -124,6 +124,7 @@
 	dm_list_init(&vg->pvs);
 	dm_list_init(&vg->lvs);
 	dm_list_init(&vg->tags);
+	dm_list_init(&vg->removed_pvs);
 
 	if (!import_pool_vg(vg, smem, pds))
 		return_NULL;
--- LVM2/lib/format_text/import_vsn1.c	2009/07/09 11:29:41	1.63
+++ LVM2/lib/format_text/import_vsn1.c	2009/07/27 17:43:40	1.64
@@ -753,6 +753,7 @@
 
 	dm_list_init(&vg->lvs);
 	dm_list_init(&vg->tags);
+	dm_list_init(&vg->removed_pvs);
 
 	/* Optional tags */
 	if ((cn = find_config_node(vgn, "tags")) &&
--- LVM2/lib/metadata/metadata-exported.h	2009/07/26 12:41:09	1.102
+++ LVM2/lib/metadata/metadata-exported.h	2009/07/27 17:43:40	1.103
@@ -243,6 +243,12 @@
 	 */
 
 	/*
+	 * List of removed physical volumes by pvreduce.
+	 * They have to get cleared on vg_commit.
+	 */
+	struct dm_list removed_pvs;
+
+	/*
 	 * Store result of the last vg_read().
 	 * 0 for success else appropriate FAILURE_* bits set.
 	 */
@@ -437,6 +443,7 @@
 int vg_rename(struct cmd_context *cmd, struct volume_group *vg,
 	      const char *new_name);
 int vg_extend(struct volume_group *vg, int pv_count, char **pv_names);
+int vg_reduce(struct volume_group *vg, char *pv_name);
 int vg_set_extent_size(vg_t *vg, uint32_t new_extent_size);
 int vg_set_max_lv(vg_t *vg, uint32_t max_lv);
 int vg_set_max_pv(vg_t *vg, uint32_t max_pv);
--- LVM2/lib/metadata/metadata.c	2009/07/26 12:41:36	1.269
+++ LVM2/lib/metadata/metadata.c	2009/07/27 17:43:40	1.270
@@ -532,6 +532,54 @@
 	return 0;
 }
 
+/* FIXME: use this inside vgreduce_single? */
+int vg_reduce(struct volume_group *vg, char *pv_name)
+{
+	struct physical_volume *pv;
+	struct pv_list *pvl;
+
+	if (_vg_bad_status_bits(vg, RESIZEABLE_VG))
+		return 0;
+
+	if (!archive(vg))
+		goto bad;
+
+	/* remove each pv */
+	if (!(pvl = find_pv_in_vg(vg, pv_name))) {
+		log_error("Physical volume %s not in volume group %s.",
+			  pv_name, vg->name);
+		goto bad;
+	}
+
+	pv = pvl->pv;
+
+	if (pv_pe_alloc_count(pv)) {
+		log_error("Physical volume %s still in use.",
+			  pv_name);
+		goto bad;
+	}
+
+	if (!dev_get_size(pv_dev(pv), &pv->size)) {
+		log_error("%s: Couldn't get size.", pv_name);
+		goto bad;
+	}
+
+	vg->pv_count--;
+	vg->free_count -= pv_pe_count(pv) - pv_pe_alloc_count(pv);
+	vg->extent_count -= pv_pe_count(pv);
+
+	/* add pv to the remove_pvs list */
+	dm_list_del(&pvl->list);
+	dm_list_add(&vg->removed_pvs, &pvl->list);
+
+	return 1;
+
+      bad:
+	log_error("Unable to remove physical volume '%s' from "
+		  "volume group '%s'.", pv_name, vg->name);
+	return 0;
+}
+
 const char *strip_dir(const char *vg_name, const char *dev_dir)
 {
 	size_t len = strlen(dev_dir);
@@ -660,6 +708,9 @@
 
 	dm_list_init(&vg->tags);
 
+	/* initialize removed_pvs list */
+	dm_list_init(&vg->removed_pvs);
+
 	if (!(vg->fid = cmd->fmt->ops->create_instance(cmd->fmt, vg_name,
 						       NULL, NULL))) {
 		log_error("Failed to create format instance");
@@ -2165,6 +2216,7 @@
 	dm_list_init(&vg->pvs);
 	dm_list_init(&vg->lvs);
 	dm_list_init(&vg->tags);
+	dm_list_init(&vg->removed_pvs);
 	vg->vgmem = mem;
 	vg->cmd = cmd;
 	if (!(vg->name = dm_pool_strdup(mem, orphan_vgname))) {


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2012-02-15  1:44 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-02-15  1:44 LVM2/lib format1/format1.c format_pool/format_ mornfall
  -- strict thread matches above, loose matches on Subject: below --
2011-02-21 12:20 prajnoha
2011-02-21 12:05 prajnoha
2010-06-29 14:52 wysochanski
2010-06-28 20:33 wysochanski
2009-07-27 17:43 wysochanski

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).