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

2  * Copyright (C) 2012-2017 Red Hat, Inc.
8 #include "dm-bio-prison-v2.h"
16 /*----------------------------------------------------------------*/
30 /*----------------------------------------------------------------*/
44 prison->wq = wq; in dm_bio_prison_create_v2()
45 spin_lock_init(&prison->lock); in dm_bio_prison_create_v2()
47 ret = mempool_init_slab_pool(&prison->cell_pool, MIN_CELLS, _cell_cache); in dm_bio_prison_create_v2()
53 prison->cells = RB_ROOT; in dm_bio_prison_create_v2()
61 mempool_exit(&prison->cell_pool); in dm_bio_prison_destroy_v2()
68 return mempool_alloc(&prison->cell_pool, gfp); in dm_bio_prison_alloc_cell_v2()
73 struct dm_bio_prison_cell_v2 *cell) in dm_bio_prison_free_cell_v2() argument
75 mempool_free(cell, &prison->cell_pool); in dm_bio_prison_free_cell_v2()
80 struct dm_bio_prison_cell_v2 *cell) in __setup_new_cell() argument
82 memset(cell, 0, sizeof(*cell)); in __setup_new_cell()
83 memcpy(&cell->key, key, sizeof(cell->key)); in __setup_new_cell()
84 bio_list_init(&cell->bios); in __setup_new_cell()
90 if (lhs->virtual < rhs->virtual) in cmp_keys()
91 return -1; in cmp_keys()
93 if (lhs->virtual > rhs->virtual) in cmp_keys()
94 return 1; in cmp_keys()
96 if (lhs->dev < rhs->dev) in cmp_keys()
97 return -1; in cmp_keys()
99 if (lhs->dev > rhs->dev) in cmp_keys()
100 return 1; in cmp_keys()
102 if (lhs->block_end <= rhs->block_begin) in cmp_keys()
103 return -1; in cmp_keys()
105 if (lhs->block_begin >= rhs->block_end) in cmp_keys()
106 return 1; in cmp_keys()
120 struct rb_node **new = &prison->cells.rb_node, *parent = NULL; in __find_or_insert()
123 struct dm_bio_prison_cell_v2 *cell = in __find_or_insert() local
126 r = cmp_keys(key, &cell->key); in __find_or_insert()
130 new = &((*new)->rb_left); in __find_or_insert()
133 new = &((*new)->rb_right); in __find_or_insert()
136 *result = cell; in __find_or_insert()
143 rb_link_node(&cell_prealloc->node, parent, new); in __find_or_insert()
144 rb_insert_color(&cell_prealloc->node, &prison->cells); in __find_or_insert()
154 struct dm_bio_prison_cell_v2 **cell) in __get() argument
156 if (__find_or_insert(prison, key, cell_prealloc, cell)) { in __get()
157 if ((*cell)->exclusive_lock) { in __get()
158 if (lock_level <= (*cell)->exclusive_level) { in __get()
159 bio_list_add(&(*cell)->bios, inmate); in __get()
164 (*cell)->shared_count++; in __get()
167 (*cell)->shared_count = 1; in __get()
181 spin_lock_irq(&prison->lock); in dm_cell_get_v2()
183 spin_unlock_irq(&prison->lock); in dm_cell_get_v2()
190 struct dm_bio_prison_cell_v2 *cell) in __put() argument
192 BUG_ON(!cell->shared_count); in __put()
193 cell->shared_count--; in __put()
196 if (!cell->shared_count) { in __put()
197 if (cell->exclusive_lock){ in __put()
198 if (cell->quiesce_continuation) { in __put()
199 queue_work(prison->wq, cell->quiesce_continuation); in __put()
200 cell->quiesce_continuation = NULL; in __put()
203 rb_erase(&cell->node, &prison->cells); in __put()
212 struct dm_bio_prison_cell_v2 *cell) in dm_cell_put_v2() argument
217 spin_lock_irqsave(&prison->lock, flags); in dm_cell_put_v2()
218 r = __put(prison, cell); in dm_cell_put_v2()
219 spin_unlock_irqrestore(&prison->lock, flags); in dm_cell_put_v2()
231 struct dm_bio_prison_cell_v2 *cell; in __lock() local
233 if (__find_or_insert(prison, key, cell_prealloc, &cell)) { in __lock()
234 if (cell->exclusive_lock) in __lock()
235 return -EBUSY; in __lock()
237 cell->exclusive_lock = true; in __lock()
238 cell->exclusive_level = lock_level; in __lock()
239 *cell_result = cell; in __lock()
243 return cell->shared_count > 0; in __lock()
246 cell = cell_prealloc; in __lock()
247 cell->shared_count = 0; in __lock()
248 cell->exclusive_lock = true; in __lock()
249 cell->exclusive_level = lock_level; in __lock()
250 *cell_result = cell; in __lock()
264 spin_lock_irq(&prison->lock); in dm_cell_lock_v2()
266 spin_unlock_irq(&prison->lock); in dm_cell_lock_v2()
273 struct dm_bio_prison_cell_v2 *cell, in __quiesce() argument
276 if (!cell->shared_count) in __quiesce()
277 queue_work(prison->wq, continuation); in __quiesce()
279 cell->quiesce_continuation = continuation; in __quiesce()
283 struct dm_bio_prison_cell_v2 *cell, in dm_cell_quiesce_v2() argument
286 spin_lock_irq(&prison->lock); in dm_cell_quiesce_v2()
287 __quiesce(prison, cell, continuation); in dm_cell_quiesce_v2()
288 spin_unlock_irq(&prison->lock); in dm_cell_quiesce_v2()
293 struct dm_bio_prison_cell_v2 *cell, in __promote() argument
296 if (!cell->exclusive_lock) in __promote()
297 return -EINVAL; in __promote()
299 cell->exclusive_level = new_lock_level; in __promote()
300 return cell->shared_count > 0; in __promote()
304 struct dm_bio_prison_cell_v2 *cell, in dm_cell_lock_promote_v2() argument
309 spin_lock_irq(&prison->lock); in dm_cell_lock_promote_v2()
310 r = __promote(prison, cell, new_lock_level); in dm_cell_lock_promote_v2()
311 spin_unlock_irq(&prison->lock); in dm_cell_lock_promote_v2()
318 struct dm_bio_prison_cell_v2 *cell, in __unlock() argument
321 BUG_ON(!cell->exclusive_lock); in __unlock()
323 bio_list_merge(bios, &cell->bios); in __unlock()
324 bio_list_init(&cell->bios); in __unlock()
326 if (cell->shared_count) { in __unlock()
327 cell->exclusive_lock = false; in __unlock()
331 rb_erase(&cell->node, &prison->cells); in __unlock()
336 struct dm_bio_prison_cell_v2 *cell, in dm_cell_unlock_v2() argument
341 spin_lock_irq(&prison->lock); in dm_cell_unlock_v2()
342 r = __unlock(prison, cell, bios); in dm_cell_unlock_v2()
343 spin_unlock_irq(&prison->lock); in dm_cell_unlock_v2()
349 /*----------------------------------------------------------------*/
355 return -ENOMEM; in dm_bio_prison_init_v2()