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