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