struct slab * slab_alloc(void) { struct slab *slb; slb = psc_pool_get(slab_pool); slb->slb_base = PSCALLOC(SLASH_SLVR_SIZE); INIT_LISTENTRY(&slb->slb_mgmt_lentry); return (slb); }
/* * Lookup and optionally create a new bmap structure. * @f: file's bmap tree to search. * @n: bmap index number to search for. * @new_bmap: whether to allow creation and also value-result of whether * it was newly created or not. */ struct bmap * bmap_lookup_cache(struct fidc_membh *f, sl_bmapno_t n, int bmaprw, int *new_bmap) { struct bmap lb, *b, *bnew = NULL; int doalloc; doalloc = *new_bmap; lb.bcm_bmapno = n; restart: if (bnew) pfl_rwlock_wrlock(&f->fcmh_rwlock); else pfl_rwlock_rdlock(&f->fcmh_rwlock); b = RB_FIND(bmaptree, &f->fcmh_bmaptree, &lb); if (b) { if (!BMAP_TRYLOCK(b)) { pfl_rwlock_unlock(&f->fcmh_rwlock); usleep(10); goto restart; } if (b->bcm_flags & BMAPF_TOFREE) { /* * This bmap is going away; wait for it so we * can reload it back. */ DEBUG_BMAP(PLL_DIAG, b, "wait on to-free bmap"); BMAP_ULOCK(b); /* * We don't want to spin if we are waiting for a * flush to clear. */ psc_waitq_waitrelf_us(&f->fcmh_waitq, PFL_LOCKPRIMT_RWLOCK, &f->fcmh_rwlock, 100); goto restart; } bmap_op_start_type(b, BMAP_OPCNT_LOOKUP); } if (doalloc == 0 || b) { pfl_rwlock_unlock(&f->fcmh_rwlock); if (bnew) psc_pool_return(bmap_pool, bnew); *new_bmap = 0; OPSTAT_INCR("bmapcache.hit"); return (b); } if (bnew == NULL) { pfl_rwlock_unlock(&f->fcmh_rwlock); if (sl_bmap_ops.bmo_reapf) sl_bmap_ops.bmo_reapf(); bnew = psc_pool_get(bmap_pool); goto restart; } b = bnew; OPSTAT_INCR("bmapcache.miss"); *new_bmap = 1; memset(b, 0, bmap_pool->ppm_master->pms_entsize); INIT_PSC_LISTENTRY(&b->bcm_lentry); INIT_SPINLOCK(&b->bcm_lock); psc_atomic32_set(&b->bcm_opcnt, 0); b->bcm_fcmh = f; b->bcm_bmapno = n; /* * Signify that the bmap is newly initialized and therefore may * not contain certain structures. */ psc_assert(bmaprw == BMAPF_RD || bmaprw == BMAPF_WR); b->bcm_flags = bmaprw; bmap_op_start_type(b, BMAP_OPCNT_LOOKUP); /* * Perform app-specific substructure initialization, which is * msl_bmap_init(), iod_bmap_init(), or mds_bmap_init(). */ sl_bmap_ops.bmo_init_privatef(b); /* Add to the fcmh's bmap cache */ PSC_RB_XINSERT(bmaptree, &f->fcmh_bmaptree, b); pfl_rwlock_unlock(&f->fcmh_rwlock); fcmh_op_start_type(f, FCMH_OPCNT_BMAP); BMAP_LOCK(b); return (b); }