int main(int argc, char *argv[]) { START(argc, argv, "blk_nblock"); if (argc < 2) FATAL("usage: %s bsize:file...", argv[0]); /* map each file argument with the given map type */ for (int arg = 1; arg < argc; arg++) { char *fname; size_t bsize = strtoul(argv[arg], &fname, 0); if (*fname != ':') FATAL("usage: %s bsize:file...", argv[0]); fname++; PMEMblkpool *handle; handle = pmemblk_create(fname, bsize, 0, S_IWUSR | S_IRUSR); if (handle == NULL) { OUT("!%s: pmemblk_create", fname); } else { OUT("%s: block size %zu usable blocks: %zu", fname, bsize, pmemblk_nblock(handle)); ASSERTeq(pmemblk_bsize(handle), bsize); pmemblk_close(handle); int result = pmemblk_check(fname, bsize); if (result < 0) OUT("!%s: pmemblk_check", fname); else if (result == 0) OUT("%s: pmemblk_check: not consistent", fname); else { ASSERTeq(pmemblk_check(fname, bsize + 1), -1); ASSERTeq(pmemblk_check(fname, 0), 1); handle = pmemblk_open(fname, 0); ASSERTeq(pmemblk_bsize(handle), bsize); pmemblk_close(handle); } } } DONE(NULL); }
static fio_pmemblk_file_t pmb_open(const char *pathspec, int flags) { fio_pmemblk_file_t pmb; char *path = NULL; uint64_t bsize = 0; uint64_t fsize = 0; pmb_parse_path(pathspec, &path, &bsize, &fsize); if (!path) return NULL; pthread_mutex_lock(&CacheLock); pmb = fio_pmemblk_cache_lookup(path); if (!pmb) { /* load libpmemblk if needed */ if (!pmemblk_open) if (load_libpmemblk(getenv("FIO_PMEMBLK_LIB"))) goto error; pmb = malloc(sizeof(*pmb)); if (!pmb) goto error; /* try opening existing first, create it if needed */ pmb->pmb_pool = pmemblk_open(path, bsize); if (!pmb->pmb_pool && (errno == ENOENT) && (flags & PMB_CREATE) && (0 < fsize) && (0 < bsize)) { pmb->pmb_pool = pmemblk_create(path, bsize, fsize, 0644); } if (!pmb->pmb_pool) { log_err ("fio: enable to open pmemblk pool file (errno %d)\n", errno); goto error; } pmb->pmb_filename = path; pmb->pmb_next = NULL; pmb->pmb_refcnt = 0; pmb->pmb_bsize = pmemblk_bsize(pmb->pmb_pool); pmb->pmb_nblocks = pmemblk_nblock(pmb->pmb_pool); fio_pmemblk_cache_insert(pmb); } pmb->pmb_refcnt += 1; pthread_mutex_unlock(&CacheLock); return pmb; error: if (pmb) { if (pmb->pmb_pool) pmemblk_close(pmb->pmb_pool); pmb->pmb_pool = NULL; pmb->pmb_filename = NULL; free(pmb); } if (path) free(path); pthread_mutex_unlock(&CacheLock); return NULL; }