/* * pmempool_info_pool_hdr -- print pool header information */ static int pmempool_info_pool_hdr(struct pmem_info *pip, int v) { int ret = 0; struct pool_hdr *hdr = malloc(sizeof (struct pool_hdr)); if (!hdr) err(1, "Cannot allocate memory for pool_hdr"); if (pmempool_info_read(pip, hdr, sizeof (*hdr), 0)) { outv_err("cannot read pool header\n"); free(hdr); return -1; } outv(v, "POOL Header:\n"); outv_hexdump(pip->args.vhdrdump, hdr, sizeof (*hdr), 0, 1); util_convert2h_pool_hdr(hdr); outv_field(v, "Signature", "%.*s%s", POOL_HDR_SIG_LEN, hdr->signature, pip->params.is_part ? " [part file]" : ""); outv_field(v, "Major", "%d", hdr->major); outv_field(v, "Mandatory features", "0x%x", hdr->incompat_features); outv_field(v, "Not mandatory features", "0x%x", hdr->compat_features); outv_field(v, "Forced RO", "0x%x", hdr->ro_compat_features); outv_field(v, "Pool set UUID", "%s", out_get_uuid_str(hdr->poolset_uuid)); outv_field(v, "UUID", "%s", out_get_uuid_str(hdr->uuid)); outv_field(v, "Previous part UUID", "%s", out_get_uuid_str(hdr->prev_part_uuid)); outv_field(v, "Next part UUID", "%s", out_get_uuid_str(hdr->next_part_uuid)); outv_field(v, "Previous replica UUID", "%s", out_get_uuid_str(hdr->prev_repl_uuid)); outv_field(v, "Next replica UUID", "%s", out_get_uuid_str(hdr->next_repl_uuid)); outv_field(v, "Creation Time", "%s", out_get_time_str((time_t)hdr->crtime)); outv_field(v, "Checksum", "%s", out_get_checksum(hdr, sizeof (*hdr), &hdr->checksum)); free(hdr); return ret; }
/* * pmempool_info_pool_hdr -- print pool header information */ static int pmempool_info_pool_hdr(struct pmem_info *pip, int v) { static const char *alignment_desc_str[] = { " char", " short", " int", " long", " long long", " size_t", " off_t", " float", " double", " long double", " void *", }; static const size_t alignment_desc_n = sizeof(alignment_desc_str) / sizeof(alignment_desc_str[0]); int ret = 0; struct pool_hdr *hdr = malloc(sizeof(struct pool_hdr)); if (!hdr) err(1, "Cannot allocate memory for pool_hdr"); if (pmempool_info_read(pip, hdr, sizeof(*hdr), 0)) { outv_err("cannot read pool header\n"); free(hdr); return -1; } struct arch_flags arch_flags; if (util_get_arch_flags(&arch_flags)) { outv_err("cannot read architecture flags\n"); free(hdr); return -1; } outv(v, "POOL Header:\n"); outv_hexdump(pip->args.vhdrdump, hdr, sizeof(*hdr), 0, 1); util_convert2h_pool_hdr(hdr); outv_field(v, "Signature", "%.*s%s", POOL_HDR_SIG_LEN, hdr->signature, pip->params.is_part ? " [part file]" : ""); outv_field(v, "Major", "%d", hdr->major); outv_field(v, "Mandatory features", "0x%x", hdr->incompat_features); outv_field(v, "Not mandatory features", "0x%x", hdr->compat_features); outv_field(v, "Forced RO", "0x%x", hdr->ro_compat_features); outv_field(v, "Pool set UUID", "%s", out_get_uuid_str(hdr->poolset_uuid)); outv_field(v, "UUID", "%s", out_get_uuid_str(hdr->uuid)); outv_field(v, "Previous part UUID", "%s", out_get_uuid_str(hdr->prev_part_uuid)); outv_field(v, "Next part UUID", "%s", out_get_uuid_str(hdr->next_part_uuid)); outv_field(v, "Previous replica UUID", "%s", out_get_uuid_str(hdr->prev_repl_uuid)); outv_field(v, "Next replica UUID", "%s", out_get_uuid_str(hdr->next_repl_uuid)); outv_field(v, "Creation Time", "%s", out_get_time_str((time_t)hdr->crtime)); uint64_t ad = hdr->arch_flags.alignment_desc; uint64_t cur_ad = arch_flags.alignment_desc; outv_field(v, "Alignment Descriptor", "%s", out_get_alignment_desc_str(ad, cur_ad)); for (size_t i = 0; i < alignment_desc_n; i++) { uint64_t a = GET_ALIGNMENT(ad, i); if (ad == cur_ad) { outv_field(v + 1, alignment_desc_str[i], "%2d", a); } else { uint64_t av = GET_ALIGNMENT(cur_ad, i); if (a == av) { outv_field(v + 1, alignment_desc_str[i], "%2d [OK]", a); } else { outv_field(v + 1, alignment_desc_str[i], "%2d [wrong! should be %2d]", a, av); } } } outv_field(v, "Class", "%s", out_get_ei_class_str(hdr->arch_flags.ei_class)); outv_field(v, "Data", "%s", out_get_ei_data_str(hdr->arch_flags.ei_data)); outv_field(v, "Machine", "%s", out_get_e_machine_str(hdr->arch_flags.e_machine)); outv_field(v, "Checksum", "%s", out_get_checksum(hdr, sizeof(*hdr), &hdr->checksum)); free(hdr); return ret; }
/* * pmempool_setup_poolset -- parse poolset file and setup reading from it */ static int pmempool_setup_poolset(struct pmem_info *pip) { struct pool_set *set = NULL; int fd = -1; struct pool_hdr hdr; /* parse poolset file */ if (util_poolset_parse(pip->file_name, pip->fd, &set)) { outv_err("parsing poolset file failed\n"); return -1; } close(pip->fd); pip->fd = -1; /* open the first part set file to read the pool header values */ int ret = 0; fd = util_file_open(set->replica[0]->part[0].path, NULL, 0, O_RDONLY); if (fd < 0) { outv_err("cannot open poolset part file\n"); ret = -1; goto err_pool_set; } /* read the pool header from first pool set file */ if (pread(fd, &hdr, sizeof (hdr), 0) != sizeof (hdr)) { outv_err("cannot read pool header from poolset\n"); ret = -1; goto err_close; } close(fd); fd = -1; util_convert2h_pool_hdr(&hdr); /* parse pool type from first pool set file */ pmem_pool_type_t type = pmem_pool_type_parse_hdr(&hdr); if (type == PMEM_POOL_TYPE_UNKNOWN) { outv_err("cannot determine pool type from poolset\n"); ret = -1; goto err_close; } /* get minimum size based on pool type for util_pool_open */ size_t minsize = pmem_pool_get_min_size(type); /* * Open the poolset, the values passed to util_pool_open are read * from the first poolset file, these values are then compared with * the values from all headers of poolset files. */ if (util_pool_open(&pip->poolset, pip->file_name, 1, minsize, sizeof (struct pool_hdr), hdr.signature, hdr.major, hdr.compat_features, hdr.incompat_features, hdr.ro_compat_features)) { outv_err("openning poolset failed\n"); ret = -1; } err_close: if (fd != -1) close(fd); err_pool_set: util_poolset_free(set); return ret; }