/* * pmempool_info_part -- (internal) print info about poolset part */ static int pmempool_info_part(struct pmem_info *pip, unsigned repn, unsigned partn, int v) { /* get path of the part file */ const char *path = NULL; if (repn != UNDEF_REPLICA && partn != UNDEF_PART) { outv(v, "part %u:\n", partn); struct pool_set_part *part = &pip->pfile->poolset->replica[repn]->part[partn]; path = part->path; } else { outv(v, "Part file:\n"); path = pip->file_name; } outv_field(v, "path", "%s", path); /* get type of the part file */ int is_dev_dax = util_file_is_device_dax(path); const char *type_str = is_dev_dax ? "device dax" : "regular file"; outv_field(v, "type", "%s", type_str); /* get size of the part file */ ssize_t size = util_file_get_size(path); if (size < 0) { outv_err("couldn't get size of %s", path); return -1; } outv_field(v, "size", "%s", out_get_size_str((size_t)size, pip->args.human)); return 0; }
/* * pmempool_info_poolset -- (internal) print info about poolset structure */ static int pmempool_info_poolset(struct pmem_info *pip, int v) { ASSERTeq(pip->params.is_poolset, 1); outv(v, "Poolset structure:\n"); outv_field(v, "Number of replicas", "%u", pip->pfile->poolset->nreplicas); for (unsigned r = 0; r < pip->pfile->poolset->nreplicas; ++r) { if (pmempool_info_replica(pip, r, v)) return -1; } return 0; }
/* * pmempool_info_replica -- (internal) print info about replica */ static int pmempool_info_replica(struct pmem_info *pip, unsigned repn, int v) { struct pool_replica *rep = pip->pfile->poolset->replica[repn]; outv(v, "Replica %u%s - %s", repn, repn == 0 ? " (master)" : "", rep->remote == NULL ? "local" : "remote"); if (rep->remote) { outv(v, ":\n"); outv_field(v, "node", "%s", rep->remote->node_addr); outv_field(v, "pool set", "%s", rep->remote->pool_desc); return 0; } outv(v, ", %u part(s):\n", rep->nparts); for (unsigned p = 0; p < rep->nparts; ++p) { if (pmempool_info_part(pip, repn, p, v)) return -1; } return 0; }
/* * 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_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", POOL_HDR_SIG_LEN, hdr->signature); 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; }