Lines Matching refs:prison

9 #include "dm-bio-prison-v1.h"
10 #include "dm-bio-prison-v2.h"
44 struct dm_bio_prison *prison;
47 prison = kzalloc(struct_size(prison, regions, num_locks), GFP_KERNEL);
48 if (!prison)
50 prison->num_locks = num_locks;
52 for (i = 0; i < prison->num_locks; i++) {
53 spin_lock_init(&prison->regions[i].lock);
54 prison->regions[i].cell = RB_ROOT;
57 ret = mempool_init_slab_pool(&prison->cell_pool, MIN_CELLS, _cell_cache);
59 kfree(prison);
63 return prison;
67 void dm_bio_prison_destroy(struct dm_bio_prison *prison)
69 mempool_exit(&prison->cell_pool);
70 kfree(prison);
74 struct dm_bio_prison_cell *dm_bio_prison_alloc_cell(struct dm_bio_prison *prison, gfp_t gfp)
76 return mempool_alloc(&prison->cell_pool, gfp);
80 void dm_bio_prison_free_cell(struct dm_bio_prison *prison,
83 mempool_free(cell, &prison->cell_pool);
175 static int bio_detain(struct dm_bio_prison *prison,
182 unsigned l = lock_nr(key, prison->num_locks);
184 spin_lock_irq(&prison->regions[l].lock);
185 r = __bio_detain(&prison->regions[l].cell, key, inmate, cell_prealloc, cell_result);
186 spin_unlock_irq(&prison->regions[l].lock);
191 int dm_bio_detain(struct dm_bio_prison *prison,
197 return bio_detain(prison, key, inmate, cell_prealloc, cell_result);
201 int dm_get_cell(struct dm_bio_prison *prison,
206 return bio_detain(prison, key, NULL, cell_prealloc, cell_result);
226 void dm_cell_release(struct dm_bio_prison *prison,
230 unsigned l = lock_nr(&cell->key, prison->num_locks);
232 spin_lock_irq(&prison->regions[l].lock);
233 __cell_release(&prison->regions[l].cell, cell, bios);
234 spin_unlock_irq(&prison->regions[l].lock);
249 void dm_cell_release_no_holder(struct dm_bio_prison *prison,
253 unsigned l = lock_nr(&cell->key, prison->num_locks);
256 spin_lock_irqsave(&prison->regions[l].lock, flags);
257 __cell_release_no_holder(&prison->regions[l].cell, cell, inmates);
258 spin_unlock_irqrestore(&prison->regions[l].lock, flags);
262 void dm_cell_error(struct dm_bio_prison *prison,
269 dm_cell_release(prison, cell, &bios);
278 void dm_cell_visit_release(struct dm_bio_prison *prison,
283 unsigned l = lock_nr(&cell->key, prison->num_locks);
284 spin_lock_irq(&prison->regions[l].lock);
286 rb_erase(&cell->node, &prison->regions[l].cell);
287 spin_unlock_irq(&prison->regions[l].lock);
303 int dm_cell_promote_or_release(struct dm_bio_prison *prison,
307 unsigned l = lock_nr(&cell->key, prison->num_locks);
309 spin_lock_irq(&prison->regions[l].lock);
310 r = __promote_or_release(&prison->regions[l].cell, cell);
311 spin_unlock_irq(&prison->regions[l].lock);
491 MODULE_DESCRIPTION(DM_NAME " bio prison");