Esempio n. 1
0
File: pool.c Progetto: mslusarz/nvml
/*
 * pool_set_part_copy -- make a copy of the poolset part
 */
int
pool_set_part_copy(struct pool_set_part *dpart, struct pool_set_part *spart,
	int overwrite)
{
	LOG(3, "dpart %p spart %p", dpart, spart);

	int result = 0;

	util_stat_t stat_buf;
	if (util_stat(spart->path, &stat_buf)) {
		ERR("!util_stat");
		return -1;
	}

	size_t smapped = 0;
	void *saddr = pmem_map_file(spart->path, 0, 0, S_IREAD, &smapped, NULL);
	if (!saddr)
		return -1;

	size_t dmapped = 0;
	int is_pmem;
	void *daddr;

	if (!access(dpart->path, F_OK)) {
		if (!overwrite) {
			errno = EEXIST;
			result = -1;
			goto out_sunmap;
		}

		daddr = pmem_map_file(dpart->path, 0, 0, S_IWRITE, &dmapped,
			&is_pmem);
	} else {
		if (errno == ENOENT) {
			errno = 0;
			daddr = pmem_map_file(dpart->path, dpart->filesize,
				PMEM_FILE_CREATE | PMEM_FILE_EXCL,
				stat_buf.st_mode, &dmapped, &is_pmem);
		} else {
			result = -1;
			goto out_sunmap;
		}
	}
	if (!daddr) {
		result = -1;
		goto out_sunmap;
	}

	if (is_pmem) {
		pmem_memcpy_persist(daddr, saddr, smapped);
	} else {
		memcpy(daddr, saddr, smapped);
		PERSIST_GENERIC(dpart->is_dax, daddr, smapped);
	}

	pmem_unmap(daddr, dmapped);
out_sunmap:
	pmem_unmap(saddr, smapped);
	return result;
}
Esempio n. 2
0
/*
 * pmemlog_descr_create -- (internal) create log memory pool descriptor
 */
static int
pmemlog_descr_create(PMEMlogpool *plp, size_t poolsize)
{
    LOG(3, "plp %p poolsize %zu", plp, poolsize);

    ASSERTeq(poolsize % Pagesize, 0);

    /* create required metadata */
    plp->start_offset = htole64(roundup(sizeof(*plp),
                                        LOG_FORMAT_DATA_ALIGN));
    plp->end_offset = htole64(poolsize);
    plp->write_offset = plp->start_offset;

    /* store non-volatile part of pool's descriptor */
    PERSIST_GENERIC(plp->is_pmem, &plp->start_offset, 3 * sizeof(uint64_t));

    return 0;
}