xref: /netbsd-src/external/gpl2/lvm2/dist/lib/format_text/format-text.c (revision 274254cdae52594c1aa480a736aef78313d15c9c)
1 /*	$NetBSD: format-text.c,v 1.1.1.2 2009/02/18 11:17:04 haad Exp $	*/
2 
3 /*
4  * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved.
5  * Copyright (C) 2004-2007 Red Hat, Inc. All rights reserved.
6  *
7  * This file is part of LVM2.
8  *
9  * This copyrighted material is made available to anyone wishing to use,
10  * modify, copy, or redistribute it subject to the terms and conditions
11  * of the GNU Lesser General Public License v.2.1.
12  *
13  * You should have received a copy of the GNU Lesser General Public License
14  * along with this program; if not, write to the Free Software Foundation,
15  * Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16  */
17 
18 #include "lib.h"
19 #include "format-text.h"
20 #include "import-export.h"
21 #include "device.h"
22 #include "lvm-file.h"
23 #include "config.h"
24 #include "display.h"
25 #include "toolcontext.h"
26 #include "lvm-string.h"
27 #include "uuid.h"
28 #include "layout.h"
29 #include "crc.h"
30 #include "xlate.h"
31 #include "label.h"
32 #include "memlock.h"
33 #include "lvmcache.h"
34 
35 #include <unistd.h>
36 #include <sys/file.h>
37 #include <limits.h>
38 #include <dirent.h>
39 #include <ctype.h>
40 
41 static struct mda_header *_raw_read_mda_header(const struct format_type *fmt,
42 					       struct device_area *dev_area);
43 
44 static struct format_instance *_text_create_text_instance(const struct format_type
45 						     *fmt, const char *vgname,
46 						     const char *vgid,
47 						     void *context);
48 
49 struct text_fid_context {
50 	char *raw_metadata_buf;
51 	uint32_t raw_metadata_buf_size;
52 };
53 
54 struct dir_list {
55 	struct dm_list list;
56 	char dir[0];
57 };
58 
59 struct raw_list {
60 	struct dm_list list;
61 	struct device_area dev_area;
62 };
63 
64 struct text_context {
65 	char *path_live;	/* Path to file holding live metadata */
66 	char *path_edit;	/* Path to file holding edited metadata */
67 	char *desc;		/* Description placed inside file */
68 };
69 
70 /*
71  * NOTE: Currently there can be only one vg per text file.
72  */
73 
74 static int _text_vg_setup(struct format_instance *fid __attribute((unused)),
75 			  struct volume_group *vg)
76 {
77 	if (vg->extent_size & (vg->extent_size - 1)) {
78 		log_error("Extent size must be power of 2");
79 		return 0;
80 	}
81 
82 	return 1;
83 }
84 
85 static uint64_t _mda_free_sectors_raw(struct metadata_area *mda)
86 {
87 	struct mda_context *mdac = (struct mda_context *) mda->metadata_locn;
88 
89 	return mdac->free_sectors;
90 }
91 
92 static uint64_t _mda_total_sectors_raw(struct metadata_area *mda)
93 {
94 	struct mda_context *mdac = (struct mda_context *) mda->metadata_locn;
95 
96 	return mdac->area.size >> SECTOR_SHIFT;
97 }
98 
99 /*
100  * Check if metadata area belongs to vg
101  */
102 static int _mda_in_vg_raw(struct format_instance *fid __attribute((unused)),
103 			     struct volume_group *vg, struct metadata_area *mda)
104 {
105 	struct mda_context *mdac = (struct mda_context *) mda->metadata_locn;
106 	struct pv_list *pvl;
107 
108 	dm_list_iterate_items(pvl, &vg->pvs)
109 		if (pvl->pv->dev == mdac->area.dev)
110 			return 1;
111 
112 	return 0;
113 }
114 
115 /*
116  * For circular region between region_start and region_start + region_size,
117  * back up one SECTOR_SIZE from 'region_ptr' and return the value.
118  * This allows reverse traversal through text metadata area to find old
119  * metadata.
120  *
121  * Parameters:
122  *   region_start: start of the region (bytes)
123  *   region_size: size of the region (bytes)
124  *   region_ptr: pointer within the region (bytes)
125  *   NOTE: region_start <= region_ptr <= region_start + region_size
126  */
127 static uint64_t _get_prev_sector_circular(uint64_t region_start,
128 					  uint64_t region_size,
129 					  uint64_t region_ptr)
130 {
131 	if (region_ptr >= region_start + SECTOR_SIZE)
132 		return region_ptr - SECTOR_SIZE;
133 	else
134 		return (region_start + region_size - SECTOR_SIZE);
135 }
136 
137 /*
138  * Analyze a metadata area for old metadata records in the circular buffer.
139  * This function just looks through and makes a first pass at the data in
140  * the sectors for particular things.
141  * FIXME: do something with each metadata area (try to extract vg, write
142  * raw data to file, etc)
143  */
144 static int _pv_analyze_mda_raw (const struct format_type * fmt,
145 				struct metadata_area *mda)
146 {
147 	struct mda_header *mdah;
148 	struct raw_locn *rlocn;
149 	uint64_t area_start;
150 	uint64_t area_size;
151 	uint64_t prev_sector, prev_sector2;
152 	uint64_t latest_mrec_offset;
153 	int i;
154 	uint64_t offset;
155 	uint64_t offset2;
156 	size_t size;
157 	size_t size2;
158 	char *buf=NULL;
159 	struct device_area *area;
160 	struct mda_context *mdac;
161 	int r=0;
162 
163 	mdac = (struct mda_context *) mda->metadata_locn;
164 
165 	log_print("Found text metadata area: offset=%" PRIu64 ", size=%"
166 		  PRIu64, mdac->area.start, mdac->area.size);
167 	area = &mdac->area;
168 
169 	if (!dev_open(area->dev))
170 		return_0;
171 
172 	if (!(mdah = _raw_read_mda_header(fmt, area)))
173 		goto_out;
174 
175 	rlocn = mdah->raw_locns;
176 
177 	/*
178 	 * The device area includes the metadata header as well as the
179 	 * records, so remove the metadata header from the start and size
180 	 */
181 	area_start = area->start + MDA_HEADER_SIZE;
182 	area_size = area->size - MDA_HEADER_SIZE;
183 	latest_mrec_offset = rlocn->offset + area->start;
184 
185 	/*
186 	 * Start searching at rlocn (point of live metadata) and go
187 	 * backwards.
188 	 */
189 	prev_sector = _get_prev_sector_circular(area_start, area_size,
190 					       latest_mrec_offset);
191 	offset = prev_sector;
192 	size = SECTOR_SIZE;
193 	offset2 = size2 = 0;
194 	i = 0;
195 	while (prev_sector != latest_mrec_offset) {
196 		prev_sector2 = prev_sector;
197 		prev_sector = _get_prev_sector_circular(area_start, area_size,
198 							prev_sector);
199 		if (prev_sector > prev_sector2)
200 			goto_out;
201 		/*
202 		 * FIXME: for some reason, the whole metadata region from
203 		 * area->start to area->start+area->size is not used.
204 		 * Only ~32KB seems to contain valid metadata records
205 		 * (LVM2 format - format_text).  As a result, I end up with
206 		 * "maybe_config_section" returning true when there's no valid
207 		 * metadata in a sector (sectors with all nulls).
208 		 */
209 		if (!(buf = dm_pool_alloc(fmt->cmd->mem, size + size2)))
210 			goto_out;
211 
212 		if (!dev_read_circular(area->dev, offset, size,
213 				       offset2, size2, buf))
214 			goto_out;
215 
216 		/*
217 		 * FIXME: We could add more sophisticated metadata detection
218 		 */
219 		if (maybe_config_section(buf, size + size2)) {
220 			/* FIXME: Validate region, pull out timestamp?, etc */
221 			/* FIXME: Do something with this region */
222 			log_verbose ("Found LVM2 metadata record at "
223 				     "offset=%"PRIu64", size=%"PRIsize_t", "
224 				     "offset2=%"PRIu64" size2=%"PRIsize_t,
225 				     offset, size, offset2, size2);
226 			offset = prev_sector;
227 			size = SECTOR_SIZE;
228 			offset2 = size2 = 0;
229 		} else {
230 			/*
231 			 * Not a complete metadata record, assume we have
232 			 * metadata and just increase the size and offset.
233 			 * Start the second region if the previous sector is
234 			 * wrapping around towards the end of the disk.
235 			 */
236 			if (prev_sector > offset) {
237 				offset2 = prev_sector;
238 				size2 += SECTOR_SIZE;
239 			} else {
240 				offset = prev_sector;
241 				size += SECTOR_SIZE;
242 			}
243 		}
244 		dm_pool_free(fmt->cmd->mem, buf);
245 		buf = NULL;
246 	}
247 
248 	r = 1;
249  out:
250 	if (buf)
251 		dm_pool_free(fmt->cmd->mem, buf);
252 	if (!dev_close(area->dev))
253 		stack;
254 	return r;
255 }
256 
257 
258 
259 static int _text_lv_setup(struct format_instance *fid __attribute((unused)),
260 			  struct logical_volume *lv)
261 {
262 /******** FIXME Any LV size restriction?
263 	uint64_t max_size = UINT_MAX;
264 
265 	if (lv->size > max_size) {
266 		char *dummy = display_size(max_size);
267 		log_error("logical volumes cannot be larger than %s", dummy);
268 		dm_free(dummy);
269 		return 0;
270 	}
271 */
272 
273 	if (!*lv->lvid.s && !lvid_create(&lv->lvid, &lv->vg->id)) {
274 		log_error("Random lvid creation failed for %s/%s.",
275 			  lv->vg->name, lv->name);
276 		return 0;
277 	}
278 
279 	return 1;
280 }
281 
282 static void _xlate_mdah(struct mda_header *mdah)
283 {
284 	struct raw_locn *rl;
285 
286 	mdah->version = xlate32(mdah->version);
287 	mdah->start = xlate64(mdah->start);
288 	mdah->size = xlate64(mdah->size);
289 
290 	rl = &mdah->raw_locns[0];
291 	while (rl->offset) {
292 		rl->checksum = xlate32(rl->checksum);
293 		rl->offset = xlate64(rl->offset);
294 		rl->size = xlate64(rl->size);
295 		rl++;
296 	}
297 }
298 
299 static struct mda_header *_raw_read_mda_header(const struct format_type *fmt,
300 					       struct device_area *dev_area)
301 {
302 	struct mda_header *mdah;
303 
304 	if (!(mdah = dm_pool_alloc(fmt->cmd->mem, MDA_HEADER_SIZE))) {
305 		log_error("struct mda_header allocation failed");
306 		return NULL;
307 	}
308 
309 	if (!dev_read(dev_area->dev, dev_area->start, MDA_HEADER_SIZE, mdah))
310 		goto_bad;
311 
312 	if (mdah->checksum_xl != xlate32(calc_crc(INITIAL_CRC, mdah->magic,
313 						  MDA_HEADER_SIZE -
314 						  sizeof(mdah->checksum_xl)))) {
315 		log_error("Incorrect metadata area header checksum");
316 		goto bad;
317 	}
318 
319 	_xlate_mdah(mdah);
320 
321 	if (strncmp((char *)mdah->magic, FMTT_MAGIC, sizeof(mdah->magic))) {
322 		log_error("Wrong magic number in metadata area header");
323 		goto bad;
324 	}
325 
326 	if (mdah->version != FMTT_VERSION) {
327 		log_error("Incompatible metadata area header version: %d",
328 			  mdah->version);
329 		goto bad;
330 	}
331 
332 	if (mdah->start != dev_area->start) {
333 		log_error("Incorrect start sector in metadata area header: %"
334 			  PRIu64, mdah->start);
335 		goto bad;
336 	}
337 
338 	return mdah;
339 
340 bad:
341 	dm_pool_free(fmt->cmd->mem, mdah);
342 	return NULL;
343 }
344 
345 static int _raw_write_mda_header(const struct format_type *fmt,
346 				 struct device *dev,
347 				 uint64_t start_byte, struct mda_header *mdah)
348 {
349 	strncpy((char *)mdah->magic, FMTT_MAGIC, sizeof(mdah->magic));
350 	mdah->version = FMTT_VERSION;
351 	mdah->start = start_byte;
352 
353 	_xlate_mdah(mdah);
354 	mdah->checksum_xl = xlate32(calc_crc(INITIAL_CRC, mdah->magic,
355 					     MDA_HEADER_SIZE -
356 					     sizeof(mdah->checksum_xl)));
357 
358 	if (!dev_write(dev, start_byte, MDA_HEADER_SIZE, mdah))
359 		return_0;
360 
361 	return 1;
362 }
363 
364 static struct raw_locn *_find_vg_rlocn(struct device_area *dev_area,
365 				       struct mda_header *mdah,
366 				       const char *vgname,
367 				       int *precommitted)
368 {
369 	size_t len;
370 	char vgnamebuf[NAME_LEN + 2] __attribute((aligned(8)));
371 	struct raw_locn *rlocn, *rlocn_precommitted;
372 	struct lvmcache_info *info;
373 
374 	rlocn = mdah->raw_locns;	/* Slot 0 */
375 	rlocn_precommitted = rlocn + 1;	/* Slot 1 */
376 
377 	/* Should we use precommitted metadata? */
378 	if (*precommitted && rlocn_precommitted->size &&
379 	    (rlocn_precommitted->offset != rlocn->offset)) {
380 		rlocn = rlocn_precommitted;
381 	} else
382 		*precommitted = 0;
383 
384 	/* FIXME Loop through rlocns two-at-a-time.  List null-terminated. */
385 	/* FIXME Ignore if checksum incorrect!!! */
386 	if (!dev_read(dev_area->dev, dev_area->start + rlocn->offset,
387 		      sizeof(vgnamebuf), vgnamebuf))
388 		goto_bad;
389 
390 	if (!strncmp(vgnamebuf, vgname, len = strlen(vgname)) &&
391 	    (isspace(vgnamebuf[len]) || vgnamebuf[len] == '{')) {
392 		return rlocn;
393 	}
394 
395       bad:
396 	if ((info = info_from_pvid(dev_area->dev->pvid, 0)))
397 		lvmcache_update_vgname_and_id(info, FMT_TEXT_ORPHAN_VG_NAME,
398 					      FMT_TEXT_ORPHAN_VG_NAME, 0, NULL);
399 
400 	return NULL;
401 }
402 
403 /*
404  * Determine offset for uncommitted metadata
405  */
406 static uint64_t _next_rlocn_offset(struct raw_locn *rlocn,
407 				   struct mda_header *mdah)
408 {
409 	if (!rlocn)
410 		/* Find an empty slot */
411 		/* FIXME Assume only one VG per mdah for now */
412 		return MDA_HEADER_SIZE;
413 
414 	/* Start of free space - round up to next sector; circular */
415 	return ((rlocn->offset + rlocn->size +
416 		(SECTOR_SIZE - rlocn->size % SECTOR_SIZE) -
417 		MDA_HEADER_SIZE) % (mdah->size - MDA_HEADER_SIZE))
418 	       + MDA_HEADER_SIZE;
419 }
420 
421 static int _raw_holds_vgname(struct format_instance *fid,
422 			     struct device_area *dev_area, const char *vgname)
423 {
424 	int r = 0;
425 	int noprecommit = 0;
426 	struct mda_header *mdah;
427 
428 	if (!dev_open(dev_area->dev))
429 		return_0;
430 
431 	if (!(mdah = _raw_read_mda_header(fid->fmt, dev_area)))
432 		return_0;
433 
434 	if (_find_vg_rlocn(dev_area, mdah, vgname, &noprecommit))
435 		r = 1;
436 
437 	if (!dev_close(dev_area->dev))
438 		stack;
439 
440 	return r;
441 }
442 
443 static struct volume_group *_vg_read_raw_area(struct format_instance *fid,
444 					      const char *vgname,
445 					      struct device_area *area,
446 					      int precommitted)
447 {
448 	struct volume_group *vg = NULL;
449 	struct raw_locn *rlocn;
450 	struct mda_header *mdah;
451 	time_t when;
452 	char *desc;
453 	uint32_t wrap = 0;
454 
455 	if (!dev_open(area->dev))
456 		return_NULL;
457 
458 	if (!(mdah = _raw_read_mda_header(fid->fmt, area)))
459 		goto_out;
460 
461 	if (!(rlocn = _find_vg_rlocn(area, mdah, vgname, &precommitted))) {
462 		log_debug("VG %s not found on %s", vgname, dev_name(area->dev));
463 		goto out;
464 	}
465 
466 	if (rlocn->offset + rlocn->size > mdah->size)
467 		wrap = (uint32_t) ((rlocn->offset + rlocn->size) - mdah->size);
468 
469 	if (wrap > rlocn->offset) {
470 		log_error("VG %s metadata too large for circular buffer",
471 			  vg->name);
472 		goto out;
473 	}
474 
475 	/* FIXME 64-bit */
476 	if (!(vg = text_vg_import_fd(fid, NULL, area->dev,
477 				     (off_t) (area->start + rlocn->offset),
478 				     (uint32_t) (rlocn->size - wrap),
479 				     (off_t) (area->start + MDA_HEADER_SIZE),
480 				     wrap, calc_crc, rlocn->checksum, &when,
481 				     &desc)))
482 		goto_out;
483 	log_debug("Read %s %smetadata (%u) from %s at %" PRIu64 " size %"
484 		  PRIu64, vg->name, precommitted ? "pre-commit " : "",
485 		  vg->seqno, dev_name(area->dev),
486 		  area->start + rlocn->offset, rlocn->size);
487 
488 	if (precommitted)
489 		vg->status |= PRECOMMITTED;
490 
491       out:
492 	if (!dev_close(area->dev))
493 		stack;
494 
495 	return vg;
496 }
497 
498 static struct volume_group *_vg_read_raw(struct format_instance *fid,
499 					 const char *vgname,
500 					 struct metadata_area *mda)
501 {
502 	struct mda_context *mdac = (struct mda_context *) mda->metadata_locn;
503 
504 	return _vg_read_raw_area(fid, vgname, &mdac->area, 0);
505 }
506 
507 static struct volume_group *_vg_read_precommit_raw(struct format_instance *fid,
508 						   const char *vgname,
509 						   struct metadata_area *mda)
510 {
511 	struct mda_context *mdac = (struct mda_context *) mda->metadata_locn;
512 
513 	return _vg_read_raw_area(fid, vgname, &mdac->area, 1);
514 }
515 
516 static int _vg_write_raw(struct format_instance *fid, struct volume_group *vg,
517 			 struct metadata_area *mda)
518 {
519 	struct mda_context *mdac = (struct mda_context *) mda->metadata_locn;
520 	struct text_fid_context *fidtc = (struct text_fid_context *) fid->private;
521 	struct raw_locn *rlocn;
522 	struct mda_header *mdah;
523 	struct pv_list *pvl;
524 	int r = 0;
525        uint64_t new_wrap = 0, old_wrap = 0, new_end;
526 	int found = 0;
527 	int noprecommit = 0;
528 
529 	/* Ignore any mda on a PV outside the VG. vgsplit relies on this */
530 	dm_list_iterate_items(pvl, &vg->pvs) {
531 		if (pvl->pv->dev == mdac->area.dev) {
532 			found = 1;
533 			break;
534 		}
535 	}
536 
537 	if (!found)
538 		return 1;
539 
540 	if (!dev_open(mdac->area.dev))
541 		return_0;
542 
543 	if (!(mdah = _raw_read_mda_header(fid->fmt, &mdac->area)))
544 		goto_out;
545 
546 	rlocn = _find_vg_rlocn(&mdac->area, mdah, vg->name, &noprecommit);
547 	mdac->rlocn.offset = _next_rlocn_offset(rlocn, mdah);
548 
549 	if (!fidtc->raw_metadata_buf &&
550 	    !(fidtc->raw_metadata_buf_size =
551 			text_vg_export_raw(vg, "", &fidtc->raw_metadata_buf))) {
552 		log_error("VG %s metadata writing failed", vg->name);
553 		goto out;
554 	}
555 
556 	mdac->rlocn.size = fidtc->raw_metadata_buf_size;
557 
558 	if (mdac->rlocn.offset + mdac->rlocn.size > mdah->size)
559 		new_wrap = (mdac->rlocn.offset + mdac->rlocn.size) - mdah->size;
560 
561 	if (rlocn && (rlocn->offset + rlocn->size > mdah->size))
562 		old_wrap = (rlocn->offset + rlocn->size) - mdah->size;
563 
564 	new_end = new_wrap ? new_wrap + MDA_HEADER_SIZE :
565 			    mdac->rlocn.offset + mdac->rlocn.size;
566 
567 	if ((new_wrap && old_wrap) ||
568 	    (rlocn && (new_wrap || old_wrap) && (new_end > rlocn->offset)) ||
569 	    (mdac->rlocn.size >= mdah->size)) {
570 		log_error("VG %s metadata too large for circular buffer",
571 			  vg->name);
572 		goto out;
573 	}
574 
575 	log_debug("Writing %s metadata to %s at %" PRIu64 " len %" PRIu64,
576 		  vg->name, dev_name(mdac->area.dev), mdac->area.start +
577 		  mdac->rlocn.offset, mdac->rlocn.size - new_wrap);
578 
579 	/* Write text out, circularly */
580 	if (!dev_write(mdac->area.dev, mdac->area.start + mdac->rlocn.offset,
581 		       (size_t) (mdac->rlocn.size - new_wrap),
582 		       fidtc->raw_metadata_buf))
583 		goto_out;
584 
585 	if (new_wrap) {
586                log_debug("Writing metadata to %s at %" PRIu64 " len %" PRIu64,
587 			  dev_name(mdac->area.dev), mdac->area.start +
588 			  MDA_HEADER_SIZE, new_wrap);
589 
590 		if (!dev_write(mdac->area.dev,
591 			       mdac->area.start + MDA_HEADER_SIZE,
592 			       (size_t) new_wrap,
593 			       fidtc->raw_metadata_buf +
594 			       mdac->rlocn.size - new_wrap))
595 			goto_out;
596 	}
597 
598 	mdac->rlocn.checksum = calc_crc(INITIAL_CRC, fidtc->raw_metadata_buf,
599 					(uint32_t) (mdac->rlocn.size -
600 						    new_wrap));
601 	if (new_wrap)
602 		mdac->rlocn.checksum = calc_crc(mdac->rlocn.checksum,
603 						fidtc->raw_metadata_buf +
604 						mdac->rlocn.size -
605 						new_wrap, (uint32_t) new_wrap);
606 
607 	r = 1;
608 
609       out:
610 	if (!r) {
611 		if (!dev_close(mdac->area.dev))
612 			stack;
613 
614 		if (fidtc->raw_metadata_buf) {
615 			dm_free(fidtc->raw_metadata_buf);
616 			fidtc->raw_metadata_buf = NULL;
617 		}
618 	}
619 
620 	return r;
621 }
622 
623 static int _vg_commit_raw_rlocn(struct format_instance *fid,
624 				struct volume_group *vg,
625 				struct metadata_area *mda,
626 				int precommit)
627 {
628 	struct mda_context *mdac = (struct mda_context *) mda->metadata_locn;
629 	struct text_fid_context *fidtc = (struct text_fid_context *) fid->private;
630 	struct mda_header *mdah;
631 	struct raw_locn *rlocn;
632 	struct pv_list *pvl;
633 	int r = 0;
634 	int found = 0;
635 	int noprecommit = 0;
636 
637 	/* Ignore any mda on a PV outside the VG. vgsplit relies on this */
638 	dm_list_iterate_items(pvl, &vg->pvs) {
639 		if (pvl->pv->dev == mdac->area.dev) {
640 			found = 1;
641 			break;
642 		}
643 	}
644 
645 	if (!found)
646 		return 1;
647 
648 	if (!(mdah = _raw_read_mda_header(fid->fmt, &mdac->area)))
649 		goto_out;
650 
651 	if (!(rlocn = _find_vg_rlocn(&mdac->area, mdah, vg->name, &noprecommit))) {
652 		mdah->raw_locns[0].offset = 0;
653 		mdah->raw_locns[0].size = 0;
654 		mdah->raw_locns[0].checksum = 0;
655 		mdah->raw_locns[1].offset = 0;
656 		mdah->raw_locns[1].size = 0;
657 		mdah->raw_locns[1].checksum = 0;
658 		mdah->raw_locns[2].offset = 0;
659 		mdah->raw_locns[2].size = 0;
660 		mdah->raw_locns[2].checksum = 0;
661 		rlocn = &mdah->raw_locns[0];
662 	}
663 
664 	if (precommit)
665 		rlocn++;
666 	else {
667 		/* If not precommitting, wipe the precommitted rlocn */
668 		mdah->raw_locns[1].offset = 0;
669 		mdah->raw_locns[1].size = 0;
670 		mdah->raw_locns[1].checksum = 0;
671 	}
672 
673 	/* Is there new metadata to commit? */
674 	if (mdac->rlocn.size) {
675 		rlocn->offset = mdac->rlocn.offset;
676 		rlocn->size = mdac->rlocn.size;
677 		rlocn->checksum = mdac->rlocn.checksum;
678 		log_debug("%sCommitting %s metadata (%u) to %s header at %"
679 			  PRIu64, precommit ? "Pre-" : "", vg->name, vg->seqno,
680 			  dev_name(mdac->area.dev), mdac->area.start);
681 	} else
682 		log_debug("Wiping pre-committed %s metadata from %s "
683 			  "header at %" PRIu64, vg->name,
684 			  dev_name(mdac->area.dev), mdac->area.start);
685 
686 	if (!_raw_write_mda_header(fid->fmt, mdac->area.dev, mdac->area.start,
687 				   mdah)) {
688 		dm_pool_free(fid->fmt->cmd->mem, mdah);
689 		log_error("Failed to write metadata area header");
690 		goto out;
691 	}
692 
693 	r = 1;
694 
695       out:
696 	if (!precommit) {
697 		if (!dev_close(mdac->area.dev))
698 			stack;
699 		if (fidtc->raw_metadata_buf) {
700 			dm_free(fidtc->raw_metadata_buf);
701 			fidtc->raw_metadata_buf = NULL;
702 		}
703 	}
704 
705 	return r;
706 }
707 
708 static int _vg_commit_raw(struct format_instance *fid, struct volume_group *vg,
709 			  struct metadata_area *mda)
710 {
711 	return _vg_commit_raw_rlocn(fid, vg, mda, 0);
712 }
713 
714 static int _vg_precommit_raw(struct format_instance *fid,
715 			     struct volume_group *vg,
716 			     struct metadata_area *mda)
717 {
718 	return _vg_commit_raw_rlocn(fid, vg, mda, 1);
719 }
720 
721 /* Close metadata area devices */
722 static int _vg_revert_raw(struct format_instance *fid, struct volume_group *vg,
723 			  struct metadata_area *mda)
724 {
725 	struct mda_context *mdac = (struct mda_context *) mda->metadata_locn;
726 	struct pv_list *pvl;
727 	int found = 0;
728 
729 	/* Ignore any mda on a PV outside the VG. vgsplit relies on this */
730 	dm_list_iterate_items(pvl, &vg->pvs) {
731 		if (pvl->pv->dev == mdac->area.dev) {
732 			found = 1;
733 			break;
734 		}
735 	}
736 
737 	if (!found)
738 		return 1;
739 
740 	/* Wipe pre-committed metadata */
741 	mdac->rlocn.size = 0;
742 	return _vg_commit_raw_rlocn(fid, vg, mda, 0);
743 }
744 
745 static int _vg_remove_raw(struct format_instance *fid, struct volume_group *vg,
746 			  struct metadata_area *mda)
747 {
748 	struct mda_context *mdac = (struct mda_context *) mda->metadata_locn;
749 	struct mda_header *mdah;
750 	struct raw_locn *rlocn;
751 	int r = 0;
752 	int noprecommit = 0;
753 
754 	if (!dev_open(mdac->area.dev))
755 		return_0;
756 
757 	if (!(mdah = _raw_read_mda_header(fid->fmt, &mdac->area)))
758 		goto_out;
759 
760 	if (!(rlocn = _find_vg_rlocn(&mdac->area, mdah, vg->name, &noprecommit))) {
761 		rlocn = &mdah->raw_locns[0];
762 		mdah->raw_locns[1].offset = 0;
763 	}
764 
765 	rlocn->offset = 0;
766 	rlocn->size = 0;
767 	rlocn->checksum = 0;
768 
769 	if (!_raw_write_mda_header(fid->fmt, mdac->area.dev, mdac->area.start,
770 				   mdah)) {
771 		dm_pool_free(fid->fmt->cmd->mem, mdah);
772 		log_error("Failed to write metadata area header");
773 		goto out;
774 	}
775 
776 	r = 1;
777 
778       out:
779 	if (!dev_close(mdac->area.dev))
780 		stack;
781 
782 	return r;
783 }
784 
785 static struct volume_group *_vg_read_file_name(struct format_instance *fid,
786 					       const char *vgname,
787 					       const char *read_path)
788 {
789 	struct volume_group *vg;
790 	time_t when;
791 	char *desc;
792 
793 	if (!(vg = text_vg_import_file(fid, read_path, &when, &desc)))
794 		return_NULL;
795 
796 	/*
797 	 * Currently you can only have a single volume group per
798 	 * text file (this restriction may remain).  We need to
799 	 * check that it contains the correct volume group.
800 	 */
801 	if (vgname && strcmp(vgname, vg->name)) {
802 		dm_pool_free(fid->fmt->cmd->mem, vg);
803 		log_err("'%s' does not contain volume group '%s'.",
804 			read_path, vgname);
805 		return NULL;
806 	} else
807 		log_debug("Read volume group %s from %s", vg->name, read_path);
808 
809 	return vg;
810 }
811 
812 static struct volume_group *_vg_read_file(struct format_instance *fid,
813 					  const char *vgname,
814 					  struct metadata_area *mda)
815 {
816 	struct text_context *tc = (struct text_context *) mda->metadata_locn;
817 
818 	return _vg_read_file_name(fid, vgname, tc->path_live);
819 }
820 
821 static struct volume_group *_vg_read_precommit_file(struct format_instance *fid,
822 						    const char *vgname,
823 						    struct metadata_area *mda)
824 {
825 	struct text_context *tc = (struct text_context *) mda->metadata_locn;
826 	struct volume_group *vg;
827 
828 	if ((vg = _vg_read_file_name(fid, vgname, tc->path_edit)))
829 		vg->status |= PRECOMMITTED;
830 	else
831 		vg = _vg_read_file_name(fid, vgname, tc->path_live);
832 
833 	return vg;
834 }
835 
836 static int _vg_write_file(struct format_instance *fid __attribute((unused)),
837 			  struct volume_group *vg, struct metadata_area *mda)
838 {
839 	struct text_context *tc = (struct text_context *) mda->metadata_locn;
840 
841 	FILE *fp;
842 	int fd;
843 	char *slash;
844 	char temp_file[PATH_MAX], temp_dir[PATH_MAX];
845 
846 	slash = strrchr(tc->path_edit, '/');
847 
848 	if (slash == 0)
849 		strcpy(temp_dir, ".");
850 	else if (slash - tc->path_edit < PATH_MAX) {
851 		strncpy(temp_dir, tc->path_edit,
852 			(size_t) (slash - tc->path_edit));
853 		temp_dir[slash - tc->path_edit] = '\0';
854 
855 	} else {
856 		log_error("Text format failed to determine directory.");
857 		return 0;
858 	}
859 
860 	if (!create_temp_name(temp_dir, temp_file, sizeof(temp_file), &fd,
861 			      &vg->cmd->rand_seed)) {
862 		log_err("Couldn't create temporary text file name.");
863 		return 0;
864 	}
865 
866 	if (!(fp = fdopen(fd, "w"))) {
867 		log_sys_error("fdopen", temp_file);
868 		if (close(fd))
869 			log_sys_error("fclose", temp_file);
870 		return 0;
871 	}
872 
873 	log_debug("Writing %s metadata to %s", vg->name, temp_file);
874 
875 	if (!text_vg_export_file(vg, tc->desc, fp)) {
876 		log_error("Failed to write metadata to %s.", temp_file);
877 		if (fclose(fp))
878 			log_sys_error("fclose", temp_file);
879 		return 0;
880 	}
881 
882 	if (fsync(fd) && (errno != EROFS) && (errno != EINVAL)) {
883 		log_sys_error("fsync", tc->path_edit);
884 		if (fclose(fp))
885 			log_sys_error("fclose", tc->path_edit);
886 		return 0;
887 	}
888 
889 	if (lvm_fclose(fp, tc->path_edit))
890 		return_0;
891 
892 	if (rename(temp_file, tc->path_edit)) {
893 		log_debug("Renaming %s to %s", temp_file, tc->path_edit);
894 		log_error("%s: rename to %s failed: %s", temp_file,
895 			  tc->path_edit, strerror(errno));
896 		return 0;
897 	}
898 
899 	return 1;
900 }
901 
902 static int _vg_commit_file_backup(struct format_instance *fid __attribute((unused)),
903 				  struct volume_group *vg,
904 				  struct metadata_area *mda)
905 {
906 	struct text_context *tc = (struct text_context *) mda->metadata_locn;
907 
908 	if (test_mode()) {
909 		log_verbose("Test mode: Skipping committing %s metadata (%u)",
910 			    vg->name, vg->seqno);
911 		if (unlink(tc->path_edit)) {
912 			log_debug("Unlinking %s", tc->path_edit);
913 			log_sys_error("unlink", tc->path_edit);
914 			return 0;
915 		}
916 	} else {
917 		log_debug("Committing %s metadata (%u)", vg->name, vg->seqno);
918 		log_debug("Renaming %s to %s", tc->path_edit, tc->path_live);
919 		if (rename(tc->path_edit, tc->path_live)) {
920 			log_error("%s: rename to %s failed: %s", tc->path_edit,
921 				  tc->path_live, strerror(errno));
922 			return 0;
923 		}
924 	}
925 
926 	sync_dir(tc->path_edit);
927 
928 	return 1;
929 }
930 
931 static int _vg_commit_file(struct format_instance *fid, struct volume_group *vg,
932 			   struct metadata_area *mda)
933 {
934 	struct text_context *tc = (struct text_context *) mda->metadata_locn;
935 	char *slash;
936 	char new_name[PATH_MAX];
937 	size_t len;
938 
939 	if (!_vg_commit_file_backup(fid, vg, mda))
940 		return 0;
941 
942 	/* vgrename? */
943 	if ((slash = strrchr(tc->path_live, '/')))
944 		slash = slash + 1;
945 	else
946 		slash = tc->path_live;
947 
948 	if (strcmp(slash, vg->name)) {
949 		len = slash - tc->path_live;
950 		strncpy(new_name, tc->path_live, len);
951 		strcpy(new_name + len, vg->name);
952 		log_debug("Renaming %s to %s", tc->path_live, new_name);
953 		if (test_mode())
954 			log_verbose("Test mode: Skipping rename");
955 		else {
956 			if (rename(tc->path_live, new_name)) {
957 				log_error("%s: rename to %s failed: %s",
958 					  tc->path_live, new_name,
959 					  strerror(errno));
960 				sync_dir(new_name);
961 				return 0;
962 			}
963 		}
964 	}
965 
966 	return 1;
967 }
968 
969 static int _vg_remove_file(struct format_instance *fid __attribute((unused)),
970 			   struct volume_group *vg __attribute((unused)),
971 			   struct metadata_area *mda)
972 {
973 	struct text_context *tc = (struct text_context *) mda->metadata_locn;
974 
975 	if (path_exists(tc->path_edit) && unlink(tc->path_edit)) {
976 		log_sys_error("unlink", tc->path_edit);
977 		return 0;
978 	}
979 
980 	if (path_exists(tc->path_live) && unlink(tc->path_live)) {
981 		log_sys_error("unlink", tc->path_live);
982 		return 0;
983 	}
984 
985 	sync_dir(tc->path_live);
986 
987 	return 1;
988 }
989 
990 static int _scan_file(const struct format_type *fmt)
991 {
992 	struct dirent *dirent;
993 	struct dir_list *dl;
994 	struct dm_list *dir_list;
995 	char *tmp;
996 	DIR *d;
997 	struct volume_group *vg;
998 	struct format_instance *fid;
999 	char path[PATH_MAX];
1000 	char *vgname;
1001 
1002 	dir_list = &((struct mda_lists *) fmt->private)->dirs;
1003 
1004 	dm_list_iterate_items(dl, dir_list) {
1005 		if (!(d = opendir(dl->dir))) {
1006 			log_sys_error("opendir", dl->dir);
1007 			continue;
1008 		}
1009 		while ((dirent = readdir(d)))
1010 			if (strcmp(dirent->d_name, ".") &&
1011 			    strcmp(dirent->d_name, "..") &&
1012 			    (!(tmp = strstr(dirent->d_name, ".tmp")) ||
1013 			     tmp != dirent->d_name + strlen(dirent->d_name)
1014 			     - 4)) {
1015 				vgname = dirent->d_name;
1016 				if (dm_snprintf(path, PATH_MAX, "%s/%s",
1017 						 dl->dir, vgname) < 0) {
1018 					log_error("Name too long %s/%s",
1019 						  dl->dir, vgname);
1020 					break;
1021 				}
1022 
1023 				/* FIXME stat file to see if it's changed */
1024 				fid = _text_create_text_instance(fmt, NULL, NULL,
1025 							    NULL);
1026 				if ((vg = _vg_read_file_name(fid, vgname,
1027 							     path)))
1028 					/* FIXME Store creation host in vg */
1029 					lvmcache_update_vg(vg, 0);
1030 			}
1031 
1032 		if (closedir(d))
1033 			log_sys_error("closedir", dl->dir);
1034 	}
1035 
1036 	return 1;
1037 }
1038 
1039 const char *vgname_from_mda(const struct format_type *fmt,
1040 			    struct device_area *dev_area, struct id *vgid,
1041 			    uint32_t *vgstatus, char **creation_host,
1042 			    uint64_t *mda_free_sectors)
1043 {
1044 	struct raw_locn *rlocn;
1045 	struct mda_header *mdah;
1046 	uint32_t wrap = 0;
1047 	const char *vgname = NULL;
1048 	unsigned int len = 0;
1049 	char buf[NAME_LEN + 1] __attribute((aligned(8)));
1050 	char uuid[64] __attribute((aligned(8)));
1051 	uint64_t buffer_size, current_usage;
1052 
1053 	if (mda_free_sectors)
1054 		*mda_free_sectors = ((dev_area->size - MDA_HEADER_SIZE) / 2) >> SECTOR_SHIFT;
1055 
1056 	if (!dev_open(dev_area->dev))
1057 		return_NULL;
1058 
1059 	if (!(mdah = _raw_read_mda_header(fmt, dev_area)))
1060 		goto_out;
1061 
1062 	/* FIXME Cope with returning a list */
1063 	rlocn = mdah->raw_locns;
1064 
1065 	/* Do quick check for a vgname */
1066 	if (!dev_read(dev_area->dev, dev_area->start + rlocn->offset,
1067 		      NAME_LEN, buf))
1068 		goto_out;
1069 
1070 	while (buf[len] && !isspace(buf[len]) && buf[len] != '{' &&
1071 	       len < (NAME_LEN - 1))
1072 		len++;
1073 
1074 	buf[len] = '\0';
1075 
1076 	/* Ignore this entry if the characters aren't permissible */
1077 	if (!validate_name(buf))
1078 		goto_out;
1079 
1080 	/* We found a VG - now check the metadata */
1081 	if (rlocn->offset + rlocn->size > mdah->size)
1082 		wrap = (uint32_t) ((rlocn->offset + rlocn->size) - mdah->size);
1083 
1084 	if (wrap > rlocn->offset) {
1085 		log_error("%s: metadata too large for circular buffer",
1086 			  dev_name(dev_area->dev));
1087 		goto out;
1088 	}
1089 
1090 	/* FIXME 64-bit */
1091 	if (!(vgname = text_vgname_import(fmt, dev_area->dev,
1092 					  (off_t) (dev_area->start +
1093 						   rlocn->offset),
1094 					  (uint32_t) (rlocn->size - wrap),
1095 					  (off_t) (dev_area->start +
1096 						   MDA_HEADER_SIZE),
1097 					  wrap, calc_crc, rlocn->checksum,
1098 					  vgid, vgstatus, creation_host)))
1099 		goto_out;
1100 
1101 	/* Ignore this entry if the characters aren't permissible */
1102 	if (!validate_name(vgname)) {
1103 		vgname = NULL;
1104 		goto_out;
1105 	}
1106 
1107 	if (!id_write_format(vgid, uuid, sizeof(uuid))) {
1108 		vgname = NULL;
1109 		goto_out;
1110 	}
1111 
1112 	log_debug("%s: Found metadata at %" PRIu64 " size %" PRIu64
1113 		  " (in area at %" PRIu64 " size %" PRIu64
1114 		  ") for %s (%s)",
1115 		  dev_name(dev_area->dev), dev_area->start + rlocn->offset,
1116 		  rlocn->size, dev_area->start, dev_area->size, vgname, uuid);
1117 
1118 	if (mda_free_sectors) {
1119 		current_usage = (rlocn->size + SECTOR_SIZE - UINT64_C(1)) -
1120 				 (rlocn->size + SECTOR_SIZE - UINT64_C(1)) % SECTOR_SIZE;
1121 		buffer_size = mdah->size - MDA_HEADER_SIZE;
1122 
1123 		if (current_usage * 2 >= buffer_size)
1124 			*mda_free_sectors = UINT64_C(0);
1125 		else
1126 			*mda_free_sectors = ((buffer_size - 2 * current_usage) / 2) >> SECTOR_SHIFT;
1127 	}
1128 
1129       out:
1130 	if (!dev_close(dev_area->dev))
1131 		stack;
1132 
1133 	return vgname;
1134 }
1135 
1136 static int _scan_raw(const struct format_type *fmt)
1137 {
1138 	struct raw_list *rl;
1139 	struct dm_list *raw_list;
1140 	const char *vgname;
1141 	struct volume_group *vg;
1142 	struct format_instance fid;
1143 	struct id vgid;
1144 	uint32_t vgstatus;
1145 
1146 	raw_list = &((struct mda_lists *) fmt->private)->raws;
1147 
1148 	fid.fmt = fmt;
1149 	dm_list_init(&fid.metadata_areas);
1150 
1151 	dm_list_iterate_items(rl, raw_list) {
1152 		/* FIXME We're reading mdah twice here... */
1153 		if ((vgname = vgname_from_mda(fmt, &rl->dev_area, &vgid, &vgstatus,
1154 					      NULL, NULL))) {
1155 			if ((vg = _vg_read_raw_area(&fid, vgname,
1156 						    &rl->dev_area, 0)))
1157 				lvmcache_update_vg(vg, 0);
1158 		}
1159 	}
1160 
1161 	return 1;
1162 }
1163 
1164 static int _text_scan(const struct format_type *fmt)
1165 {
1166 	return (_scan_file(fmt) & _scan_raw(fmt));
1167 }
1168 
1169 /* For orphan, creates new mdas according to policy.
1170    Always have an mda between end-of-label and pe_align() boundary */
1171 static int _mda_setup(const struct format_type *fmt,
1172 		      uint64_t pe_start, uint64_t pe_end,
1173 		      int pvmetadatacopies,
1174 		      uint64_t pvmetadatasize, struct dm_list *mdas,
1175 		      struct physical_volume *pv,
1176 		      struct volume_group *vg __attribute((unused)))
1177 {
1178 	uint64_t mda_adjustment, disk_size, alignment;
1179 	uint64_t start1, mda_size1;	/* First area - start of disk */
1180 	uint64_t start2, mda_size2;	/* Second area - end of disk */
1181 	uint64_t wipe_size = 8 << SECTOR_SHIFT;
1182 	size_t pagesize = lvm_getpagesize();
1183 
1184 	if (!pvmetadatacopies)
1185 		return 1;
1186 
1187 	alignment = pe_align(pv) << SECTOR_SHIFT;
1188 	disk_size = pv->size << SECTOR_SHIFT;
1189 	pe_start <<= SECTOR_SHIFT;
1190 	pe_end <<= SECTOR_SHIFT;
1191 
1192 	if (pe_end > disk_size) {
1193 		log_error("Physical extents end beyond end of device %s!",
1194 			  pv_dev_name(pv));
1195 		return 0;
1196 	}
1197 
1198 	/* Requested metadatasize */
1199 	mda_size1 = pvmetadatasize << SECTOR_SHIFT;
1200 
1201 	/* Place mda straight after label area at start of disk */
1202 	start1 = LABEL_SCAN_SIZE;
1203 
1204 	/* Unless the space available is tiny, round to PAGE_SIZE boundary */
1205 	if ((!pe_start && !pe_end) ||
1206 	    ((pe_start > start1) && (pe_start - start1 >= MDA_SIZE_MIN))) {
1207 		mda_adjustment = start1 % pagesize;
1208 		if (mda_adjustment)
1209 			start1 += (pagesize - mda_adjustment);
1210 	}
1211 
1212 	/* Ensure it's not going to be bigger than the disk! */
1213 	if (start1 + mda_size1 > disk_size) {
1214 		log_warn("WARNING: metadata area fills disk leaving no "
1215 			 "space for data on %s.", pv_dev_name(pv));
1216 		/* Leave some free space for rounding */
1217 		/* Avoid empty data area as could cause tools problems */
1218 		mda_size1 = disk_size - start1 - alignment * 2;
1219 		/* Only have 1 mda in this case */
1220 		pvmetadatacopies = 1;
1221 	}
1222 
1223 	/* Round up to pe_align() boundary */
1224 	mda_adjustment = (mda_size1 + start1) % alignment;
1225 	if (mda_adjustment)
1226 		mda_size1 += (alignment - mda_adjustment);
1227 
1228 	/* If we already have PEs, avoid overlap */
1229 	if (pe_start || pe_end) {
1230 		if (pe_start <= start1)
1231 			mda_size1 = 0;
1232 		else if (start1 + mda_size1 > pe_start)
1233 			mda_size1 = pe_start - start1;
1234 	}
1235 
1236 	/* FIXME If creating new mdas, wipe them! */
1237 	if (mda_size1) {
1238 		if (!add_mda(fmt, fmt->cmd->mem, mdas, pv->dev, start1,
1239 			     mda_size1))
1240 			return 0;
1241 
1242 		if (!dev_set((struct device *) pv->dev, start1,
1243 			     (size_t) (mda_size1 >
1244 				       wipe_size ? : mda_size1), 0)) {
1245 			log_error("Failed to wipe new metadata area");
1246 			return 0;
1247 		}
1248 
1249 		if (pvmetadatacopies == 1)
1250 			return 1;
1251 	} else
1252 		start1 = 0;
1253 
1254 	/* A second copy at end of disk */
1255 	mda_size2 = pvmetadatasize << SECTOR_SHIFT;
1256 
1257 	/* Ensure it's not going to be bigger than the disk! */
1258 	if (mda_size2 > disk_size)
1259 		mda_size2 = disk_size - start1 - mda_size1;
1260 
1261 	mda_adjustment = (disk_size - mda_size2) % alignment;
1262 	if (mda_adjustment)
1263 		mda_size2 += mda_adjustment;
1264 
1265 	start2 = disk_size - mda_size2;
1266 
1267 	/* If we already have PEs, avoid overlap */
1268 	if (pe_start || pe_end) {
1269 		if (start2 < pe_end) {
1270 			mda_size2 -= (pe_end - start2);
1271 			start2 = pe_end;
1272 		}
1273 	}
1274 
1275 	/* If we already have a first mda, avoid overlap */
1276 	if (mda_size1) {
1277 		if (start2 < start1 + mda_size1) {
1278 			mda_size2 -= (start1 + mda_size1 - start2);
1279 			start2 = start1 + mda_size1;
1280 		}
1281 		/* No room for any PEs here now! */
1282 	}
1283 
1284 	if (mda_size2) {
1285 		if (!add_mda(fmt, fmt->cmd->mem, mdas, pv->dev, start2,
1286 			     mda_size2)) return 0;
1287 		if (!dev_set(pv->dev, start2,
1288 			     (size_t) (mda_size1 >
1289 				       wipe_size ? : mda_size1), 0)) {
1290 			log_error("Failed to wipe new metadata area");
1291 			return 0;
1292 		}
1293 	} else
1294 		return 0;
1295 
1296 	return 1;
1297 }
1298 
1299 /* Only for orphans */
1300 /* Set label_sector to -1 if rewriting existing label into same sector */
1301 static int _text_pv_write(const struct format_type *fmt, struct physical_volume *pv,
1302 		     struct dm_list *mdas, int64_t label_sector)
1303 {
1304 	struct label *label;
1305 	struct lvmcache_info *info;
1306 	struct mda_context *mdac;
1307 	struct metadata_area *mda;
1308 	char buf[MDA_HEADER_SIZE] __attribute((aligned(8)));
1309 	struct mda_header *mdah = (struct mda_header *) buf;
1310 	uint64_t adjustment;
1311 
1312 	/* FIXME Test mode don't update cache? */
1313 
1314 	if (!(info = lvmcache_add(fmt->labeller, (char *) &pv->id, pv->dev,
1315 				  FMT_TEXT_ORPHAN_VG_NAME, NULL, 0)))
1316 		return_0;
1317 	label = info->label;
1318 
1319 	if (label_sector != -1)
1320 		label->sector = label_sector;
1321 
1322 	info->device_size = pv->size << SECTOR_SHIFT;
1323 	info->fmt = fmt;
1324 
1325 	/* If mdas supplied, use them regardless of existing ones, */
1326 	/* otherwise retain existing ones */
1327 	if (mdas) {
1328 		if (info->mdas.n)
1329 			del_mdas(&info->mdas);
1330 		else
1331 			dm_list_init(&info->mdas);
1332 		dm_list_iterate_items(mda, mdas) {
1333 			mdac = mda->metadata_locn;
1334 			log_debug("Creating metadata area on %s at sector %"
1335 				  PRIu64 " size %" PRIu64 " sectors",
1336 				  dev_name(mdac->area.dev),
1337 				  mdac->area.start >> SECTOR_SHIFT,
1338 				  mdac->area.size >> SECTOR_SHIFT);
1339 			add_mda(fmt, NULL, &info->mdas, mdac->area.dev,
1340 				mdac->area.start, mdac->area.size);
1341 		}
1342 		/* FIXME Temporary until mda creation supported by tools */
1343 	} else if (!info->mdas.n) {
1344 		dm_list_init(&info->mdas);
1345 	}
1346 
1347 	if (info->das.n)
1348 		del_das(&info->das);
1349 	else
1350 		dm_list_init(&info->das);
1351 
1352 	/* Set pe_start to first aligned sector after any metadata
1353 	 * areas that begin before pe_start */
1354 	pv->pe_start = pe_align(pv);
1355 	dm_list_iterate_items(mda, &info->mdas) {
1356 		mdac = (struct mda_context *) mda->metadata_locn;
1357 		if (pv->dev == mdac->area.dev &&
1358 		    (mdac->area.start <= (pv->pe_start << SECTOR_SHIFT)) &&
1359 		    (mdac->area.start + mdac->area.size >
1360 		     (pv->pe_start << SECTOR_SHIFT))) {
1361 			pv->pe_start = (mdac->area.start + mdac->area.size)
1362 			    >> SECTOR_SHIFT;
1363 			adjustment = pv->pe_start % pe_align(pv);
1364 			if (adjustment)
1365 				pv->pe_start += (pe_align(pv) - adjustment);
1366 		}
1367 	}
1368 	if (!add_da
1369 	    (NULL, &info->das, pv->pe_start << SECTOR_SHIFT, UINT64_C(0)))
1370 		return_0;
1371 
1372 	if (!dev_open(pv->dev))
1373 		return_0;
1374 
1375 	dm_list_iterate_items(mda, &info->mdas) {
1376 		mdac = mda->metadata_locn;
1377 		memset(&buf, 0, sizeof(buf));
1378 		mdah->size = mdac->area.size;
1379 		if (!_raw_write_mda_header(fmt, mdac->area.dev,
1380 					   mdac->area.start, mdah)) {
1381 			if (!dev_close(pv->dev))
1382 				stack;
1383 			return_0;
1384 		}
1385 	}
1386 
1387 	if (!label_write(pv->dev, label)) {
1388 		dev_close(pv->dev);
1389 		return_0;
1390 	}
1391 
1392 	if (!dev_close(pv->dev))
1393 		return_0;
1394 
1395 	return 1;
1396 }
1397 
1398 static int _add_raw(struct dm_list *raw_list, struct device_area *dev_area)
1399 {
1400 	struct raw_list *rl;
1401 
1402 	/* Already present? */
1403 	dm_list_iterate_items(rl, raw_list) {
1404 		/* FIXME Check size/overlap consistency too */
1405 		if (rl->dev_area.dev == dev_area->dev &&
1406 		    rl->dev_area.start == dev_area->start)
1407 			return 1;
1408 	}
1409 
1410 	if (!(rl = dm_malloc(sizeof(struct raw_list)))) {
1411 		log_error("_add_raw allocation failed");
1412 		return 0;
1413 	}
1414 	memcpy(&rl->dev_area, dev_area, sizeof(*dev_area));
1415 	dm_list_add(raw_list, &rl->list);
1416 
1417 	return 1;
1418 }
1419 
1420 static int _get_pv_if_in_vg(struct lvmcache_info *info,
1421 			    struct physical_volume *pv)
1422 {
1423 	if (info->vginfo && info->vginfo->vgname &&
1424 	    !is_orphan_vg(info->vginfo->vgname) &&
1425 	    get_pv_from_vg_by_id(info->fmt, info->vginfo->vgname,
1426 				 info->vginfo->vgid, info->dev->pvid, pv))
1427 		return 1;
1428 
1429 	return 0;
1430 }
1431 
1432 static int _populate_pv_fields(struct lvmcache_info *info,
1433 			       struct physical_volume *pv)
1434 {
1435 	struct data_area_list *da;
1436 
1437 	/* Have we already cached vgname? */
1438 	if (_get_pv_if_in_vg(info, pv))
1439 		return 1;
1440 
1441 	/* Perform full scan (just the first time) and try again */
1442 	if (!memlock() && !full_scan_done()) {
1443 		lvmcache_label_scan(info->fmt->cmd, 2);
1444 
1445 		if (_get_pv_if_in_vg(info, pv))
1446 			return 1;
1447 	}
1448 
1449 	/* Orphan */
1450 	pv->dev = info->dev;
1451 	pv->fmt = info->fmt;
1452 	pv->size = info->device_size >> SECTOR_SHIFT;
1453 	pv->vg_name = FMT_TEXT_ORPHAN_VG_NAME;
1454 	memcpy(&pv->id, &info->dev->pvid, sizeof(pv->id));
1455 
1456 	/* Currently only support exactly one data area */
1457 	if (dm_list_size(&info->das) != 1) {
1458 		log_error("Must be exactly one data area (found %d) on PV %s",
1459 			  dm_list_size(&info->das), dev_name(info->dev));
1460 		return 0;
1461 	}
1462 
1463 	dm_list_iterate_items(da, &info->das)
1464 		pv->pe_start = da->disk_locn.offset >> SECTOR_SHIFT;
1465 
1466 	return 1;
1467 }
1468 
1469 static int _text_pv_read(const struct format_type *fmt, const char *pv_name,
1470 		    struct physical_volume *pv, struct dm_list *mdas)
1471 {
1472 	struct label *label;
1473 	struct device *dev;
1474 	struct lvmcache_info *info;
1475 	struct metadata_area *mda, *mda_new;
1476 	struct mda_context *mdac, *mdac_new;
1477 
1478 	if (!(dev = dev_cache_get(pv_name, fmt->cmd->filter)))
1479 		return_0;
1480 
1481 	if (!(label_read(dev, &label, UINT64_C(0))))
1482 		return_0;
1483 	info = (struct lvmcache_info *) label->info;
1484 
1485 	if (!_populate_pv_fields(info, pv))
1486 		return 0;
1487 
1488 	if (!mdas)
1489 		return 1;
1490 
1491 	/* Add copy of mdas to supplied list */
1492 	dm_list_iterate_items(mda, &info->mdas) {
1493 		mdac = (struct mda_context *) mda->metadata_locn;
1494 		if (!(mda_new = dm_pool_alloc(fmt->cmd->mem, sizeof(*mda_new)))) {
1495 			log_error("metadata_area allocation failed");
1496 			return 0;
1497 		}
1498 		if (!(mdac_new = dm_pool_alloc(fmt->cmd->mem, sizeof(*mdac_new)))) {
1499 			log_error("metadata_area allocation failed");
1500 			return 0;
1501 		}
1502 		memcpy(mda_new, mda, sizeof(*mda));
1503 		memcpy(mdac_new, mdac, sizeof(*mdac));
1504 		mda_new->metadata_locn = mdac_new;
1505 		dm_list_add(mdas, &mda_new->list);
1506 	}
1507 
1508 	return 1;
1509 }
1510 
1511 static void _text_destroy_instance(struct format_instance *fid __attribute((unused)))
1512 {
1513 	return;
1514 }
1515 
1516 static void _free_dirs(struct dm_list *dir_list)
1517 {
1518 	struct dm_list *dl, *tmp;
1519 
1520 	dm_list_iterate_safe(dl, tmp, dir_list) {
1521 		dm_list_del(dl);
1522 		dm_free(dl);
1523 	}
1524 }
1525 
1526 static void _free_raws(struct dm_list *raw_list)
1527 {
1528 	struct dm_list *rl, *tmp;
1529 
1530 	dm_list_iterate_safe(rl, tmp, raw_list) {
1531 		dm_list_del(rl);
1532 		dm_free(rl);
1533 	}
1534 }
1535 
1536 static void _text_destroy(const struct format_type *fmt)
1537 {
1538 	if (fmt->private) {
1539 		_free_dirs(&((struct mda_lists *) fmt->private)->dirs);
1540 		_free_raws(&((struct mda_lists *) fmt->private)->raws);
1541 		dm_free(fmt->private);
1542 	}
1543 
1544 	dm_free((void *)fmt);
1545 }
1546 
1547 static struct metadata_area_ops _metadata_text_file_ops = {
1548 	.vg_read = _vg_read_file,
1549 	.vg_read_precommit = _vg_read_precommit_file,
1550 	.vg_write = _vg_write_file,
1551 	.vg_remove = _vg_remove_file,
1552 	.vg_commit = _vg_commit_file
1553 };
1554 
1555 static struct metadata_area_ops _metadata_text_file_backup_ops = {
1556 	.vg_read = _vg_read_file,
1557 	.vg_write = _vg_write_file,
1558 	.vg_remove = _vg_remove_file,
1559 	.vg_commit = _vg_commit_file_backup
1560 };
1561 
1562 static struct metadata_area_ops _metadata_text_raw_ops = {
1563 	.vg_read = _vg_read_raw,
1564 	.vg_read_precommit = _vg_read_precommit_raw,
1565 	.vg_write = _vg_write_raw,
1566 	.vg_remove = _vg_remove_raw,
1567 	.vg_precommit = _vg_precommit_raw,
1568 	.vg_commit = _vg_commit_raw,
1569 	.vg_revert = _vg_revert_raw,
1570 	.mda_free_sectors = _mda_free_sectors_raw,
1571 	.mda_total_sectors = _mda_total_sectors_raw,
1572 	.mda_in_vg = _mda_in_vg_raw,
1573 	.pv_analyze_mda = _pv_analyze_mda_raw,
1574 };
1575 
1576 /* pvmetadatasize in sectors */
1577 static int _text_pv_setup(const struct format_type *fmt,
1578 		     uint64_t pe_start, uint32_t extent_count,
1579 		     uint32_t extent_size,
1580 		     int pvmetadatacopies,
1581 		     uint64_t pvmetadatasize, struct dm_list *mdas,
1582 		     struct physical_volume *pv, struct volume_group *vg)
1583 {
1584 	struct metadata_area *mda, *mda_new, *mda2;
1585 	struct mda_context *mdac, *mdac_new, *mdac2;
1586 	struct dm_list *pvmdas;
1587 	struct lvmcache_info *info;
1588 	int found;
1589 	uint64_t pe_end = 0;
1590 	unsigned mda_count = 0;
1591 	uint64_t mda_size2 = 0;
1592 	uint64_t pe_count;
1593 
1594 	/* FIXME Cope with pvchange */
1595 	/* FIXME Merge code with _text_create_text_instance */
1596 
1597 	/* If new vg, add any further mdas on this PV to the fid's mda list */
1598 	if (vg) {
1599 		/* Iterate through all mdas on this PV */
1600 		if ((info = info_from_pvid(pv->dev->pvid, 0))) {
1601 			pvmdas = &info->mdas;
1602 			dm_list_iterate_items(mda, pvmdas) {
1603 				mda_count++;
1604 				mdac =
1605 				    (struct mda_context *) mda->metadata_locn;
1606 
1607 				/* FIXME Check it isn't already in use */
1608 
1609 				/* Reduce usable device size */
1610 				if (mda_count > 1)
1611 					mda_size2 = mdac->area.size >> SECTOR_SHIFT;
1612 
1613 				/* Ensure it isn't already on list */
1614 				found = 0;
1615 				dm_list_iterate_items(mda2, mdas) {
1616 					if (mda2->ops !=
1617 					    &_metadata_text_raw_ops) continue;
1618 					mdac2 =
1619 					    (struct mda_context *)
1620 					    mda2->metadata_locn;
1621 					if (!memcmp
1622 					    (&mdac2->area, &mdac->area,
1623 					     sizeof(mdac->area))) {
1624 						found = 1;
1625 						break;
1626 					}
1627 				}
1628 				if (found)
1629 					continue;
1630 
1631 				if (!(mda_new = dm_pool_alloc(fmt->cmd->mem,
1632 							   sizeof(*mda_new))))
1633 					return_0;
1634 
1635 				if (!(mdac_new = dm_pool_alloc(fmt->cmd->mem,
1636 							    sizeof(*mdac_new))))
1637 					return_0;
1638 				/* FIXME multiple dev_areas inside area */
1639 				memcpy(mda_new, mda, sizeof(*mda));
1640 				memcpy(mdac_new, mdac, sizeof(*mdac));
1641 				mda_new->metadata_locn = mdac_new;
1642 				dm_list_add(mdas, &mda_new->list);
1643 			}
1644 		}
1645 
1646 		/* FIXME Cope with genuine pe_count 0 */
1647 
1648 		/* If missing, estimate pv->size from file-based metadata */
1649 		if (!pv->size && pv->pe_count)
1650 			pv->size = pv->pe_count * (uint64_t) vg->extent_size +
1651 				   pv->pe_start + mda_size2;
1652 
1653 		/* Recalculate number of extents that will fit */
1654 		if (!pv->pe_count) {
1655 			pe_count = (pv->size - pv->pe_start - mda_size2) /
1656 				   vg->extent_size;
1657 			if (pe_count > UINT32_MAX) {
1658 				log_error("PV %s too large for extent size %s.",
1659 					  pv_dev_name(pv),
1660 					  display_size(vg->cmd, (uint64_t) vg->extent_size));
1661 				return 0;
1662 			}
1663 			pv->pe_count = (uint32_t) pe_count;
1664 		}
1665 
1666 		/* Unlike LVM1, we don't store this outside a VG */
1667 		/* FIXME Default from config file? vgextend cmdline flag? */
1668 		pv->status |= ALLOCATABLE_PV;
1669 	} else {
1670 		if (extent_count)
1671 			pe_end = pe_start + extent_count * extent_size - 1;
1672 		if (!_mda_setup(fmt, pe_start, pe_end, pvmetadatacopies,
1673 				pvmetadatasize, mdas, pv, vg))
1674 			return_0;
1675 	}
1676 
1677 	return 1;
1678 }
1679 
1680 /* NULL vgname means use only the supplied context e.g. an archive file */
1681 static struct format_instance *_text_create_text_instance(const struct format_type
1682 						     *fmt, const char *vgname,
1683 						     const char *vgid,
1684 						     void *context)
1685 {
1686 	struct format_instance *fid;
1687 	struct text_fid_context *fidtc;
1688 	struct metadata_area *mda, *mda_new;
1689 	struct mda_context *mdac, *mdac_new;
1690 	struct dir_list *dl;
1691 	struct raw_list *rl;
1692 	struct dm_list *dir_list, *raw_list, *mdas;
1693 	char path[PATH_MAX];
1694 	struct lvmcache_vginfo *vginfo;
1695 	struct lvmcache_info *info;
1696 
1697 	if (!(fid = dm_pool_alloc(fmt->cmd->mem, sizeof(*fid)))) {
1698 		log_error("Couldn't allocate format instance object.");
1699 		return NULL;
1700 	}
1701 
1702 	if (!(fidtc = (struct text_fid_context *)
1703 			dm_pool_zalloc(fmt->cmd->mem,sizeof(*fidtc)))) {
1704 		log_error("Couldn't allocate text_fid_context.");
1705 		return NULL;
1706 	}
1707 
1708 	fidtc->raw_metadata_buf = NULL;
1709 	fid->private = (void *) fidtc;
1710 
1711 	fid->fmt = fmt;
1712 	dm_list_init(&fid->metadata_areas);
1713 
1714 	if (!vgname) {
1715 		if (!(mda = dm_pool_alloc(fmt->cmd->mem, sizeof(*mda))))
1716 			return_NULL;
1717 		mda->ops = &_metadata_text_file_backup_ops;
1718 		mda->metadata_locn = context;
1719 		dm_list_add(&fid->metadata_areas, &mda->list);
1720 	} else {
1721 		dir_list = &((struct mda_lists *) fmt->private)->dirs;
1722 
1723 		dm_list_iterate_items(dl, dir_list) {
1724 			if (dm_snprintf(path, PATH_MAX, "%s/%s",
1725 					 dl->dir, vgname) < 0) {
1726 				log_error("Name too long %s/%s", dl->dir,
1727 					  vgname);
1728 				return NULL;
1729 			}
1730 
1731 			context = create_text_context(fmt->cmd, path, NULL);
1732 			if (!(mda = dm_pool_alloc(fmt->cmd->mem, sizeof(*mda))))
1733 				return_NULL;
1734 			mda->ops = &_metadata_text_file_ops;
1735 			mda->metadata_locn = context;
1736 			dm_list_add(&fid->metadata_areas, &mda->list);
1737 		}
1738 
1739 		raw_list = &((struct mda_lists *) fmt->private)->raws;
1740 
1741 		dm_list_iterate_items(rl, raw_list) {
1742 			/* FIXME Cache this; rescan below if some missing */
1743 			if (!_raw_holds_vgname(fid, &rl->dev_area, vgname))
1744 				continue;
1745 
1746 			if (!(mda = dm_pool_alloc(fmt->cmd->mem, sizeof(*mda))))
1747 				return_NULL;
1748 
1749 			if (!(mdac = dm_pool_alloc(fmt->cmd->mem, sizeof(*mdac))))
1750 				return_NULL;
1751 			mda->metadata_locn = mdac;
1752 			/* FIXME Allow multiple dev_areas inside area */
1753 			memcpy(&mdac->area, &rl->dev_area, sizeof(mdac->area));
1754 			mda->ops = &_metadata_text_raw_ops;
1755 			/* FIXME MISTAKE? mda->metadata_locn = context; */
1756 			dm_list_add(&fid->metadata_areas, &mda->list);
1757 		}
1758 
1759 		/* Scan PVs in VG for any further MDAs */
1760 		lvmcache_label_scan(fmt->cmd, 0);
1761 		if (!(vginfo = vginfo_from_vgname(vgname, vgid)))
1762 			goto_out;
1763 		dm_list_iterate_items(info, &vginfo->infos) {
1764 			mdas = &info->mdas;
1765 			dm_list_iterate_items(mda, mdas) {
1766 				mdac =
1767 				    (struct mda_context *) mda->metadata_locn;
1768 
1769 				/* FIXME Check it holds this VG */
1770 				if (!(mda_new = dm_pool_alloc(fmt->cmd->mem,
1771 							   sizeof(*mda_new))))
1772 					return_NULL;
1773 
1774 				if (!(mdac_new = dm_pool_alloc(fmt->cmd->mem,
1775 							    sizeof(*mdac_new))))
1776 					return_NULL;
1777 				/* FIXME multiple dev_areas inside area */
1778 				memcpy(mda_new, mda, sizeof(*mda));
1779 				memcpy(mdac_new, mdac, sizeof(*mdac));
1780 				mda_new->metadata_locn = mdac_new;
1781 				dm_list_add(&fid->metadata_areas, &mda_new->list);
1782 			}
1783 		}
1784 		/* FIXME Check raw metadata area count - rescan if required */
1785 	}
1786 
1787       out:
1788 	return fid;
1789 }
1790 
1791 void *create_text_context(struct cmd_context *cmd, const char *path,
1792 			  const char *desc)
1793 {
1794 	struct text_context *tc;
1795 	char *tmp;
1796 
1797 	if ((tmp = strstr(path, ".tmp")) && (tmp == path + strlen(path) - 4)) {
1798 		log_error("%s: Volume group filename may not end in .tmp",
1799 			  path);
1800 		return NULL;
1801 	}
1802 
1803 	if (!(tc = dm_pool_alloc(cmd->mem, sizeof(*tc))))
1804 		return_NULL;
1805 
1806 	if (!(tc->path_live = dm_pool_strdup(cmd->mem, path)))
1807 		goto_bad;
1808 
1809 	if (!(tc->path_edit = dm_pool_alloc(cmd->mem, strlen(path) + 5)))
1810 		goto_bad;
1811 
1812 	sprintf(tc->path_edit, "%s.tmp", path);
1813 
1814 	if (!desc)
1815 		desc = "";
1816 
1817 	if (!(tc->desc = dm_pool_strdup(cmd->mem, desc)))
1818 		goto_bad;
1819 
1820 	return (void *) tc;
1821 
1822       bad:
1823 	dm_pool_free(cmd->mem, tc);
1824 
1825 	log_err("Couldn't allocate text format context object.");
1826 	return NULL;
1827 }
1828 
1829 static struct format_handler _text_handler = {
1830 	.scan = _text_scan,
1831 	.pv_read = _text_pv_read,
1832 	.pv_setup = _text_pv_setup,
1833 	.pv_write = _text_pv_write,
1834 	.vg_setup = _text_vg_setup,
1835 	.lv_setup = _text_lv_setup,
1836 	.create_instance = _text_create_text_instance,
1837 	.destroy_instance = _text_destroy_instance,
1838 	.destroy = _text_destroy
1839 };
1840 
1841 static int _add_dir(const char *dir, struct dm_list *dir_list)
1842 {
1843 	struct dir_list *dl;
1844 
1845 	if (dm_create_dir(dir)) {
1846 		if (!(dl = dm_malloc(sizeof(struct dm_list) + strlen(dir) + 1))) {
1847 			log_error("_add_dir allocation failed");
1848 			return 0;
1849 		}
1850 		log_very_verbose("Adding text format metadata dir: %s", dir);
1851 		strcpy(dl->dir, dir);
1852 		dm_list_add(dir_list, &dl->list);
1853 		return 1;
1854 	}
1855 
1856 	return 0;
1857 }
1858 
1859 static int _get_config_disk_area(struct cmd_context *cmd,
1860 				 struct config_node *cn, struct dm_list *raw_list)
1861 {
1862 	struct device_area dev_area;
1863 	char *id_str;
1864 	struct id id;
1865 
1866 	if (!(cn = cn->child)) {
1867 		log_error("Empty metadata disk_area section of config file");
1868 		return 0;
1869 	}
1870 
1871 	if (!get_config_uint64(cn, "start_sector", &dev_area.start)) {
1872 		log_error("Missing start_sector in metadata disk_area section "
1873 			  "of config file");
1874 		return 0;
1875 	}
1876 	dev_area.start <<= SECTOR_SHIFT;
1877 
1878 	if (!get_config_uint64(cn, "size", &dev_area.size)) {
1879 		log_error("Missing size in metadata disk_area section "
1880 			  "of config file");
1881 		return 0;
1882 	}
1883 	dev_area.size <<= SECTOR_SHIFT;
1884 
1885 	if (!get_config_str(cn, "id", &id_str)) {
1886 		log_error("Missing uuid in metadata disk_area section "
1887 			  "of config file");
1888 		return 0;
1889 	}
1890 
1891 	if (!id_read_format(&id, id_str)) {
1892 		log_error("Invalid uuid in metadata disk_area section "
1893 			  "of config file: %s", id_str);
1894 		return 0;
1895 	}
1896 
1897 	if (!(dev_area.dev = device_from_pvid(cmd, &id))) {
1898 		char buffer[64] __attribute((aligned(8)));
1899 
1900 		if (!id_write_format(&id, buffer, sizeof(buffer)))
1901 			log_err("Couldn't find device.");
1902 		else
1903 			log_err("Couldn't find device with uuid '%s'.", buffer);
1904 
1905 		return 0;
1906 	}
1907 
1908 	return _add_raw(raw_list, &dev_area);
1909 }
1910 
1911 struct format_type *create_text_format(struct cmd_context *cmd)
1912 {
1913 	struct format_type *fmt;
1914 	struct config_node *cn;
1915 	struct config_value *cv;
1916 	struct mda_lists *mda_lists;
1917 
1918 	if (!(fmt = dm_malloc(sizeof(*fmt))))
1919 		return_NULL;
1920 
1921 	fmt->cmd = cmd;
1922 	fmt->ops = &_text_handler;
1923 	fmt->name = FMT_TEXT_NAME;
1924 	fmt->alias = FMT_TEXT_ALIAS;
1925 	fmt->orphan_vg_name = ORPHAN_VG_NAME(FMT_TEXT_NAME);
1926 	fmt->features = FMT_SEGMENTS | FMT_MDAS | FMT_TAGS | FMT_PRECOMMIT |
1927 			FMT_UNLIMITED_VOLS | FMT_RESIZE_PV |
1928 			FMT_UNLIMITED_STRIPESIZE;
1929 
1930 	if (!(mda_lists = dm_malloc(sizeof(struct mda_lists)))) {
1931 		log_error("Failed to allocate dir_list");
1932 		dm_free(fmt);
1933 		return NULL;
1934 	}
1935 
1936 	dm_list_init(&mda_lists->dirs);
1937 	dm_list_init(&mda_lists->raws);
1938 	mda_lists->file_ops = &_metadata_text_file_ops;
1939 	mda_lists->raw_ops = &_metadata_text_raw_ops;
1940 	fmt->private = (void *) mda_lists;
1941 
1942 	if (!(fmt->labeller = text_labeller_create(fmt))) {
1943 		log_error("Couldn't create text label handler.");
1944 		dm_free(fmt);
1945 		return NULL;
1946 	}
1947 
1948 	if (!(label_register_handler(FMT_TEXT_NAME, fmt->labeller))) {
1949 		log_error("Couldn't register text label handler.");
1950 		dm_free(fmt);
1951 		return NULL;
1952 	}
1953 
1954 	if ((cn = find_config_tree_node(cmd, "metadata/dirs"))) {
1955 		for (cv = cn->v; cv; cv = cv->next) {
1956 			if (cv->type != CFG_STRING) {
1957 				log_error("Invalid string in config file: "
1958 					  "metadata/dirs");
1959 				goto err;
1960 			}
1961 
1962 			if (!_add_dir(cv->v.str, &mda_lists->dirs)) {
1963 				log_error("Failed to add %s to internal device "
1964 					  "cache", cv->v.str);
1965 				goto err;
1966 			}
1967 		}
1968 	}
1969 
1970 	if ((cn = find_config_tree_node(cmd, "metadata/disk_areas"))) {
1971 		for (cn = cn->child; cn; cn = cn->sib) {
1972 			if (!_get_config_disk_area(cmd, cn, &mda_lists->raws))
1973 				goto err;
1974 		}
1975 	}
1976 
1977 	log_very_verbose("Initialised format: %s", fmt->name);
1978 
1979 	return fmt;
1980 
1981       err:
1982 	_free_dirs(&mda_lists->dirs);
1983 
1984 	dm_free(fmt);
1985 	return NULL;
1986 }
1987