/* * Initialize a module for the file system processing stack. */ void pflfs_module_init(struct pscfs *m) { m->pf_opst_read_err = pfl_opstat_initf(OPSTF_BASE10, "fs.%s.read.err", m->pf_name); m->pf_opst_write_err = pfl_opstat_initf(OPSTF_BASE10, "fs.%s.write.err", m->pf_name); m->pf_opst_read_reply = pfl_opstat_init("fs.%s.read.reply", m->pf_name); m->pf_opst_write_reply = pfl_opstat_init("fs.%s.write.reply", m->pf_name); }
void pfl_odt_load(struct pfl_odt **tp, struct pfl_odt_ops *odtops, int oflg, const char *fn, const char *fmt, ...) { struct pfl_odt_hdr *h; struct pfl_odt *t; uint64_t crc; va_list ap; *tp = t = PSCALLOC(sizeof(*t)); t->odt_ops = *odtops; INIT_SPINLOCK(&t->odt_lock); INIT_PSC_LISTENTRY(&t->odt_lentry); va_start(ap, fmt); vsnprintf(t->odt_name, sizeof(t->odt_name), fmt, ap); va_end(ap); t->odt_iostats.rd = pfl_opstat_init("odt-%s-rd", t->odt_name); t->odt_iostats.wr = pfl_opstat_init("odt-%s-wr", t->odt_name); h = t->odt_hdr = PSCALLOC(sizeof(*h)); /* pfl_odt_open() and slm_odt_open() */ odtops->odtop_open(t, fn, oflg); psc_crc64_calc(&crc, t->odt_hdr, sizeof(*t->odt_hdr) - sizeof(t->odt_hdr->odth_crc)); pfl_assert(h->odth_crc == crc); t->odt_bitmap = psc_vbitmap_newf(h->odth_nitems, PVBF_AUTO); pfl_assert(t->odt_bitmap); /* * Skip the first slot, so that we can detect whether we have * assigned a lease easily. */ psc_vbitmap_set(t->odt_bitmap, 0); PFLOG_ODT(PLL_DIAG, t, "loaded"); pll_add(&pfl_odtables, t); }
int pfl_odt_create(const char *fn, int64_t nitems, size_t itemsz, int overwrite, size_t startoff, size_t pad, int tflg) { int rc; int64_t item; struct pfl_odt_slotftr f; struct pfl_odt_hdr *h; struct pfl_odt *t; t = PSCALLOC(sizeof(*t)); t->odt_ops = pfl_odtops; INIT_SPINLOCK(&t->odt_lock); snprintf(t->odt_name, sizeof(t->odt_name), "%s", pfl_basename(fn)); t->odt_iostats.rd = pfl_opstat_init("odt-%s-rd", t->odt_name); t->odt_iostats.wr = pfl_opstat_init("odt-%s-wr", t->odt_name); h = PSCALLOC(sizeof(*h)); memset(h, 0, sizeof(*h)); h->odth_nitems = nitems; h->odth_itemsz = itemsz; h->odth_slotsz = itemsz + pad + sizeof(f); h->odth_options = tflg; h->odth_start = startoff; t->odt_hdr = h; psc_crc64_calc(&h->odth_crc, h, sizeof(*h) - sizeof(h->odth_crc)); /* pfl_odt_new() and slm_odt_new() */ rc = t->odt_ops.odtop_new(t, fn, overwrite); if (rc) return (rc); for (item = 0; item < nitems; item++) _pfl_odt_doput(t, item, NULL, &f, 0); PFLOG_ODT(PLL_DIAG, t, "created"); pfl_odt_release(t); return (0); }