/* * pmemobj_runtime_init -- (internal) initialize runtime part of the pool header */ static int pmemobj_runtime_init(PMEMobjpool *pop, int rdonly, int boot) { LOG(3, "pop %p rdonly %d boot %d", pop, rdonly, boot); if (pop->replica != NULL) { /* switch to functions that replicate data */ pop->persist = obj_rep_persist; pop->flush = obj_rep_flush; pop->drain = obj_rep_drain; pop->memcpy_persist = obj_rep_memcpy_persist; pop->memset_persist = obj_rep_memset_persist; } /* run_id is made unique by incrementing the previous value */ pop->run_id += 2; if (pop->run_id == 0) pop->run_id += 2; pop->persist(pop, &pop->run_id, sizeof (pop->run_id)); /* * Use some of the memory pool area for run-time info. This * run-time state is never loaded from the file, it is always * created here, so no need to worry about byte-order. */ pop->rdonly = rdonly; pop->lanes = NULL; pop->uuid_lo = pmemobj_get_uuid_lo(pop); pop->store = (struct object_store *) ((uintptr_t)pop + pop->obj_store_offset); if (boot) { if ((errno = pmemobj_boot(pop)) != 0) return -1; if ((errno = cuckoo_insert(pools_ht, pop->uuid_lo, pop)) != 0) { ERR("!cuckoo_insert"); return -1; } if ((errno = ctree_insert(pools_tree, (uint64_t)pop, pop->size)) != 0) { ERR("!ctree_insert"); return -1; } } /* * If possible, turn off all permissions on the pool header page. * * The prototype PMFS doesn't allow this when large pages are in * use. It is not considered an error if this fails. */ util_range_none(pop->addr, sizeof (struct pool_hdr)); return 0; }
/* * pmemobj_check -- transactional memory pool consistency check */ int pmemobj_check(const char *path, const char *layout) { LOG(3, "path %s layout %s", path, layout); PMEMobjpool *pop = pmemobj_open_common(path, layout, 1, 0); if (pop == NULL) return -1; /* errno set by pmemobj_open_common() */ int consistent = 1; /* * For replicated pools, basic consistency check is performed * in pmemobj_open_common(). */ if (pop->replica == NULL) consistent = pmemobj_check_basic(pop); if (consistent && (errno = pmemobj_boot(pop)) != 0) { LOG(3, "!pmemobj_boot"); consistent = 0; } if (consistent) { pmemobj_cleanup(pop); } else { /* unmap all the replicas */ PMEMobjpool *rep; do { rep = pop->replica; VALGRIND_REMOVE_PMEM_MAPPING(pop->addr, pop->size); util_unmap(pop->addr, pop->size); pop = rep; } while (pop); } if (consistent) LOG(4, "pool consistency check OK"); return consistent; }