• Home
  • Raw
  • Download

Lines Matching +full:1 +full:- +full:cell

8 #include "dm-bio-prison-v1.h"
9 #include "dm-bio-prison-v2.h"
16 /*----------------------------------------------------------------*/
28 /*----------------------------------------------------------------*/
42 spin_lock_init(&prison->lock); in dm_bio_prison_create()
44 ret = mempool_init_slab_pool(&prison->cell_pool, MIN_CELLS, _cell_cache); in dm_bio_prison_create()
50 prison->cells = RB_ROOT; in dm_bio_prison_create()
58 mempool_exit(&prison->cell_pool); in dm_bio_prison_destroy()
65 return mempool_alloc(&prison->cell_pool, gfp); in dm_bio_prison_alloc_cell()
70 struct dm_bio_prison_cell *cell) in dm_bio_prison_free_cell() argument
72 mempool_free(cell, &prison->cell_pool); in dm_bio_prison_free_cell()
78 struct dm_bio_prison_cell *cell) in __setup_new_cell() argument
80 memcpy(&cell->key, key, sizeof(cell->key)); in __setup_new_cell()
81 cell->holder = holder; in __setup_new_cell()
82 bio_list_init(&cell->bios); in __setup_new_cell()
88 if (lhs->virtual < rhs->virtual) in cmp_keys()
89 return -1; in cmp_keys()
91 if (lhs->virtual > rhs->virtual) in cmp_keys()
92 return 1; in cmp_keys()
94 if (lhs->dev < rhs->dev) in cmp_keys()
95 return -1; in cmp_keys()
97 if (lhs->dev > rhs->dev) in cmp_keys()
98 return 1; in cmp_keys()
100 if (lhs->block_end <= rhs->block_begin) in cmp_keys()
101 return -1; in cmp_keys()
103 if (lhs->block_begin >= rhs->block_end) in cmp_keys()
104 return 1; in cmp_keys()
116 struct rb_node **new = &prison->cells.rb_node, *parent = NULL; in __bio_detain()
119 struct dm_bio_prison_cell *cell = in __bio_detain() local
122 r = cmp_keys(key, &cell->key); in __bio_detain()
126 new = &((*new)->rb_left); in __bio_detain()
128 new = &((*new)->rb_right); in __bio_detain()
131 bio_list_add(&cell->bios, inmate); in __bio_detain()
132 *cell_result = cell; in __bio_detain()
133 return 1; in __bio_detain()
140 rb_link_node(&cell_prealloc->node, parent, new); in __bio_detain()
141 rb_insert_color(&cell_prealloc->node, &prison->cells); in __bio_detain()
155 spin_lock_irqsave(&prison->lock, flags); in bio_detain()
157 spin_unlock_irqrestore(&prison->lock, flags); in bio_detain()
185 struct dm_bio_prison_cell *cell, in __cell_release() argument
188 rb_erase(&cell->node, &prison->cells); in __cell_release()
191 if (cell->holder) in __cell_release()
192 bio_list_add(inmates, cell->holder); in __cell_release()
193 bio_list_merge(inmates, &cell->bios); in __cell_release()
198 struct dm_bio_prison_cell *cell, in dm_cell_release() argument
203 spin_lock_irqsave(&prison->lock, flags); in dm_cell_release()
204 __cell_release(prison, cell, bios); in dm_cell_release()
205 spin_unlock_irqrestore(&prison->lock, flags); in dm_cell_release()
213 struct dm_bio_prison_cell *cell, in __cell_release_no_holder() argument
216 rb_erase(&cell->node, &prison->cells); in __cell_release_no_holder()
217 bio_list_merge(inmates, &cell->bios); in __cell_release_no_holder()
221 struct dm_bio_prison_cell *cell, in dm_cell_release_no_holder() argument
226 spin_lock_irqsave(&prison->lock, flags); in dm_cell_release_no_holder()
227 __cell_release_no_holder(prison, cell, inmates); in dm_cell_release_no_holder()
228 spin_unlock_irqrestore(&prison->lock, flags); in dm_cell_release_no_holder()
233 struct dm_bio_prison_cell *cell, blk_status_t error) in dm_cell_error() argument
239 dm_cell_release(prison, cell, &bios); in dm_cell_error()
242 bio->bi_status = error; in dm_cell_error()
251 struct dm_bio_prison_cell *cell) in dm_cell_visit_release() argument
255 spin_lock_irqsave(&prison->lock, flags); in dm_cell_visit_release()
256 visit_fn(context, cell); in dm_cell_visit_release()
257 rb_erase(&cell->node, &prison->cells); in dm_cell_visit_release()
258 spin_unlock_irqrestore(&prison->lock, flags); in dm_cell_visit_release()
263 struct dm_bio_prison_cell *cell) in __promote_or_release() argument
265 if (bio_list_empty(&cell->bios)) { in __promote_or_release()
266 rb_erase(&cell->node, &prison->cells); in __promote_or_release()
267 return 1; in __promote_or_release()
270 cell->holder = bio_list_pop(&cell->bios); in __promote_or_release()
275 struct dm_bio_prison_cell *cell) in dm_cell_promote_or_release() argument
280 spin_lock_irqsave(&prison->lock, flags); in dm_cell_promote_or_release()
281 r = __promote_or_release(prison, cell); in dm_cell_promote_or_release()
282 spin_unlock_irqrestore(&prison->lock, flags); in dm_cell_promote_or_release()
288 /*----------------------------------------------------------------*/
314 spin_lock_init(&ds->lock); in dm_deferred_set_create()
315 ds->current_entry = 0; in dm_deferred_set_create()
316 ds->sweeper = 0; in dm_deferred_set_create()
318 ds->entries[i].ds = ds; in dm_deferred_set_create()
319 ds->entries[i].count = 0; in dm_deferred_set_create()
320 INIT_LIST_HEAD(&ds->entries[i].work_items); in dm_deferred_set_create()
338 spin_lock_irqsave(&ds->lock, flags); in dm_deferred_entry_inc()
339 entry = ds->entries + ds->current_entry; in dm_deferred_entry_inc()
340 entry->count++; in dm_deferred_entry_inc()
341 spin_unlock_irqrestore(&ds->lock, flags); in dm_deferred_entry_inc()
349 return (index + 1) % DEFERRED_SET_SIZE; in ds_next()
354 while ((ds->sweeper != ds->current_entry) && in __sweep()
355 !ds->entries[ds->sweeper].count) { in __sweep()
356 list_splice_init(&ds->entries[ds->sweeper].work_items, head); in __sweep()
357 ds->sweeper = ds_next(ds->sweeper); in __sweep()
360 if ((ds->sweeper == ds->current_entry) && !ds->entries[ds->sweeper].count) in __sweep()
361 list_splice_init(&ds->entries[ds->sweeper].work_items, head); in __sweep()
368 spin_lock_irqsave(&entry->ds->lock, flags); in dm_deferred_entry_dec()
369 BUG_ON(!entry->count); in dm_deferred_entry_dec()
370 --entry->count; in dm_deferred_entry_dec()
371 __sweep(entry->ds, head); in dm_deferred_entry_dec()
372 spin_unlock_irqrestore(&entry->ds->lock, flags); in dm_deferred_entry_dec()
377 * Returns 1 if deferred or 0 if no pending items to delay job.
381 int r = 1; in dm_deferred_set_add_work()
385 spin_lock_irqsave(&ds->lock, flags); in dm_deferred_set_add_work()
386 if ((ds->sweeper == ds->current_entry) && in dm_deferred_set_add_work()
387 !ds->entries[ds->current_entry].count) in dm_deferred_set_add_work()
390 list_add(work, &ds->entries[ds->current_entry].work_items); in dm_deferred_set_add_work()
391 next_entry = ds_next(ds->current_entry); in dm_deferred_set_add_work()
392 if (!ds->entries[next_entry].count) in dm_deferred_set_add_work()
393 ds->current_entry = next_entry; in dm_deferred_set_add_work()
395 spin_unlock_irqrestore(&ds->lock, flags); in dm_deferred_set_add_work()
401 /*----------------------------------------------------------------*/
407 return -ENOMEM; in dm_bio_prison_init_v1()
443 while (i--) in dm_bio_prison_init()
453 while (i--) in dm_bio_prison_exit()
464 MODULE_AUTHOR("Joe Thornber <dm-devel@redhat.com>");