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