Lines Matching full:tm
106 static int is_shadow(struct dm_transaction_manager *tm, dm_block_t b) in is_shadow() argument
112 spin_lock(&tm->lock); in is_shadow()
113 node = &tm->buckets[bucket].rb_node; in is_shadow()
126 spin_unlock(&tm->lock); in is_shadow()
135 static void insert_shadow(struct dm_transaction_manager *tm, dm_block_t b) in insert_shadow() argument
146 spin_lock(&tm->lock); in insert_shadow()
147 node = &tm->buckets[bucket].rb_node; in insert_shadow()
159 rb_insert_color(&si->node, &tm->buckets[bucket]); in insert_shadow()
160 spin_unlock(&tm->lock); in insert_shadow()
164 static void wipe_shadow_table(struct dm_transaction_manager *tm) in wipe_shadow_table() argument
168 spin_lock(&tm->lock); in wipe_shadow_table()
170 while (!RB_EMPTY_ROOT(&tm->buckets[i])) { in wipe_shadow_table()
172 rb_entry(tm->buckets[i].rb_node, struct shadow_info, node); in wipe_shadow_table()
173 rb_erase(&si->node, &tm->buckets[i]); in wipe_shadow_table()
177 spin_unlock(&tm->lock); in wipe_shadow_table()
186 struct dm_transaction_manager *tm; in dm_tm_create() local
188 tm = kmalloc(sizeof(*tm), GFP_KERNEL); in dm_tm_create()
189 if (!tm) in dm_tm_create()
192 tm->is_clone = 0; in dm_tm_create()
193 tm->real = NULL; in dm_tm_create()
194 tm->bm = bm; in dm_tm_create()
195 tm->sm = sm; in dm_tm_create()
197 spin_lock_init(&tm->lock); in dm_tm_create()
199 tm->buckets[i] = RB_ROOT; in dm_tm_create()
201 prefetch_init(&tm->prefetches); in dm_tm_create()
203 return tm; in dm_tm_create()
208 struct dm_transaction_manager *tm; in dm_tm_create_non_blocking_clone() local
210 tm = kmalloc(sizeof(*tm), GFP_KERNEL); in dm_tm_create_non_blocking_clone()
211 if (tm) { in dm_tm_create_non_blocking_clone()
212 tm->is_clone = 1; in dm_tm_create_non_blocking_clone()
213 tm->real = real; in dm_tm_create_non_blocking_clone()
216 return tm; in dm_tm_create_non_blocking_clone()
220 void dm_tm_destroy(struct dm_transaction_manager *tm) in dm_tm_destroy() argument
222 if (!tm) in dm_tm_destroy()
225 if (!tm->is_clone) in dm_tm_destroy()
226 wipe_shadow_table(tm); in dm_tm_destroy()
228 kfree(tm); in dm_tm_destroy()
232 int dm_tm_pre_commit(struct dm_transaction_manager *tm) in dm_tm_pre_commit() argument
236 if (tm->is_clone) in dm_tm_pre_commit()
239 r = dm_sm_commit(tm->sm); in dm_tm_pre_commit()
243 return dm_bm_flush(tm->bm); in dm_tm_pre_commit()
247 int dm_tm_commit(struct dm_transaction_manager *tm, struct dm_block *root) in dm_tm_commit() argument
249 if (tm->is_clone) in dm_tm_commit()
252 wipe_shadow_table(tm); in dm_tm_commit()
255 return dm_bm_flush(tm->bm); in dm_tm_commit()
259 int dm_tm_new_block(struct dm_transaction_manager *tm, in dm_tm_new_block() argument
266 if (tm->is_clone) in dm_tm_new_block()
269 r = dm_sm_new_block(tm->sm, &new_block); in dm_tm_new_block()
273 r = dm_bm_write_lock_zero(tm->bm, new_block, v, result); in dm_tm_new_block()
275 dm_sm_dec_block(tm->sm, new_block); in dm_tm_new_block()
283 insert_shadow(tm, new_block); in dm_tm_new_block()
288 static int __shadow_block(struct dm_transaction_manager *tm, dm_block_t orig, in __shadow_block() argument
296 r = dm_sm_new_block(tm->sm, &new); in __shadow_block()
300 r = dm_sm_dec_block(tm->sm, orig); in __shadow_block()
304 r = dm_bm_read_lock(tm->bm, orig, v, &orig_block); in __shadow_block()
315 r = dm_bm_write_lock_zero(tm->bm, new, v, result); in __shadow_block()
322 dm_bm_block_size(tm->bm)); in __shadow_block()
328 int dm_tm_shadow_block(struct dm_transaction_manager *tm, dm_block_t orig, in dm_tm_shadow_block() argument
334 if (tm->is_clone) in dm_tm_shadow_block()
337 r = dm_sm_count_is_more_than_one(tm->sm, orig, inc_children); in dm_tm_shadow_block()
341 if (is_shadow(tm, orig) && !*inc_children) in dm_tm_shadow_block()
342 return dm_bm_write_lock(tm->bm, orig, v, result); in dm_tm_shadow_block()
344 r = __shadow_block(tm, orig, v, result); in dm_tm_shadow_block()
347 insert_shadow(tm, dm_block_location(*result)); in dm_tm_shadow_block()
353 int dm_tm_read_lock(struct dm_transaction_manager *tm, dm_block_t b, in dm_tm_read_lock() argument
357 if (tm->is_clone) { in dm_tm_read_lock()
358 int r = dm_bm_read_try_lock(tm->real->bm, b, v, blk); in dm_tm_read_lock()
361 prefetch_add(&tm->real->prefetches, b); in dm_tm_read_lock()
366 return dm_bm_read_lock(tm->bm, b, v, blk); in dm_tm_read_lock()
370 void dm_tm_unlock(struct dm_transaction_manager *tm, struct dm_block *b) in dm_tm_unlock() argument
376 void dm_tm_inc(struct dm_transaction_manager *tm, dm_block_t b) in dm_tm_inc() argument
381 BUG_ON(tm->is_clone); in dm_tm_inc()
383 dm_sm_inc_block(tm->sm, b); in dm_tm_inc()
387 void dm_tm_inc_range(struct dm_transaction_manager *tm, dm_block_t b, dm_block_t e) in dm_tm_inc_range() argument
392 BUG_ON(tm->is_clone); in dm_tm_inc_range()
394 dm_sm_inc_blocks(tm->sm, b, e); in dm_tm_inc_range()
398 void dm_tm_dec(struct dm_transaction_manager *tm, dm_block_t b) in dm_tm_dec() argument
403 BUG_ON(tm->is_clone); in dm_tm_dec()
405 dm_sm_dec_block(tm->sm, b); in dm_tm_dec()
409 void dm_tm_dec_range(struct dm_transaction_manager *tm, dm_block_t b, dm_block_t e) in dm_tm_dec_range() argument
414 BUG_ON(tm->is_clone); in dm_tm_dec_range()
416 dm_sm_dec_blocks(tm->sm, b, e); in dm_tm_dec_range()
420 void dm_tm_with_runs(struct dm_transaction_manager *tm, in dm_tm_with_runs() argument
434 fn(tm, begin, end); in dm_tm_with_runs()
446 fn(tm, begin, end); in dm_tm_with_runs()
450 int dm_tm_ref(struct dm_transaction_manager *tm, dm_block_t b, in dm_tm_ref() argument
453 if (tm->is_clone) in dm_tm_ref()
456 return dm_sm_get_count(tm->sm, b, result); in dm_tm_ref()
459 int dm_tm_block_is_shared(struct dm_transaction_manager *tm, dm_block_t b, in dm_tm_block_is_shared() argument
462 if (tm->is_clone) in dm_tm_block_is_shared()
465 return dm_sm_count_is_more_than_one(tm->sm, b, result); in dm_tm_block_is_shared()
468 struct dm_block_manager *dm_tm_get_bm(struct dm_transaction_manager *tm) in dm_tm_get_bm() argument
470 return tm->bm; in dm_tm_get_bm()
473 void dm_tm_issue_prefetches(struct dm_transaction_manager *tm) in dm_tm_issue_prefetches() argument
475 prefetch_issue(&tm->prefetches, tm->bm); in dm_tm_issue_prefetches()
483 struct dm_transaction_manager **tm, in dm_tm_create_internal() argument
494 *tm = dm_tm_create(bm, *sm); in dm_tm_create_internal()
495 if (IS_ERR(*tm)) { in dm_tm_create_internal()
497 return PTR_ERR(*tm); in dm_tm_create_internal()
501 r = dm_sm_metadata_create(*sm, *tm, dm_bm_nr_blocks(bm), in dm_tm_create_internal()
509 r = dm_sm_metadata_open(*sm, *tm, sm_root, sm_len); in dm_tm_create_internal()
519 dm_tm_destroy(*tm); in dm_tm_create_internal()
525 struct dm_transaction_manager **tm, in dm_tm_create_with_sm() argument
528 return dm_tm_create_internal(bm, sb_location, tm, sm, 1, NULL, 0); in dm_tm_create_with_sm()
534 struct dm_transaction_manager **tm, in dm_tm_open_with_sm() argument
537 return dm_tm_create_internal(bm, sb_location, tm, sm, 0, sm_root, root_len); in dm_tm_open_with_sm()