Lines Matching full:tm

105 static int is_shadow(struct dm_transaction_manager *tm, dm_block_t b)  in is_shadow()  argument
111 spin_lock(&tm->lock); in is_shadow()
112 hlist_for_each_entry(si, tm->buckets + bucket, hlist) in is_shadow()
117 spin_unlock(&tm->lock); in is_shadow()
126 static void insert_shadow(struct dm_transaction_manager *tm, dm_block_t b) in insert_shadow() argument
135 spin_lock(&tm->lock); in insert_shadow()
136 hlist_add_head(&si->hlist, tm->buckets + bucket); in insert_shadow()
137 spin_unlock(&tm->lock); in insert_shadow()
141 static void wipe_shadow_table(struct dm_transaction_manager *tm) in wipe_shadow_table() argument
148 spin_lock(&tm->lock); in wipe_shadow_table()
150 bucket = tm->buckets + i; in wipe_shadow_table()
157 spin_unlock(&tm->lock); in wipe_shadow_table()
166 struct dm_transaction_manager *tm; in dm_tm_create() local
168 tm = kmalloc(sizeof(*tm), GFP_KERNEL); in dm_tm_create()
169 if (!tm) in dm_tm_create()
172 tm->is_clone = 0; in dm_tm_create()
173 tm->real = NULL; in dm_tm_create()
174 tm->bm = bm; in dm_tm_create()
175 tm->sm = sm; in dm_tm_create()
177 spin_lock_init(&tm->lock); in dm_tm_create()
179 INIT_HLIST_HEAD(tm->buckets + i); in dm_tm_create()
181 prefetch_init(&tm->prefetches); in dm_tm_create()
183 return tm; in dm_tm_create()
188 struct dm_transaction_manager *tm; in dm_tm_create_non_blocking_clone() local
190 tm = kmalloc(sizeof(*tm), GFP_KERNEL); in dm_tm_create_non_blocking_clone()
191 if (tm) { in dm_tm_create_non_blocking_clone()
192 tm->is_clone = 1; in dm_tm_create_non_blocking_clone()
193 tm->real = real; in dm_tm_create_non_blocking_clone()
196 return tm; in dm_tm_create_non_blocking_clone()
200 void dm_tm_destroy(struct dm_transaction_manager *tm) in dm_tm_destroy() argument
202 if (!tm) in dm_tm_destroy()
205 if (!tm->is_clone) in dm_tm_destroy()
206 wipe_shadow_table(tm); in dm_tm_destroy()
208 kfree(tm); in dm_tm_destroy()
212 int dm_tm_pre_commit(struct dm_transaction_manager *tm) in dm_tm_pre_commit() argument
216 if (tm->is_clone) in dm_tm_pre_commit()
219 r = dm_sm_commit(tm->sm); in dm_tm_pre_commit()
223 return dm_bm_flush(tm->bm); in dm_tm_pre_commit()
227 int dm_tm_commit(struct dm_transaction_manager *tm, struct dm_block *root) in dm_tm_commit() argument
229 if (tm->is_clone) in dm_tm_commit()
232 wipe_shadow_table(tm); in dm_tm_commit()
235 return dm_bm_flush(tm->bm); in dm_tm_commit()
239 int dm_tm_new_block(struct dm_transaction_manager *tm, in dm_tm_new_block() argument
246 if (tm->is_clone) in dm_tm_new_block()
249 r = dm_sm_new_block(tm->sm, &new_block); in dm_tm_new_block()
253 r = dm_bm_write_lock_zero(tm->bm, new_block, v, result); in dm_tm_new_block()
255 dm_sm_dec_block(tm->sm, new_block); in dm_tm_new_block()
263 insert_shadow(tm, new_block); in dm_tm_new_block()
268 static int __shadow_block(struct dm_transaction_manager *tm, dm_block_t orig, in __shadow_block() argument
276 r = dm_sm_new_block(tm->sm, &new); in __shadow_block()
280 r = dm_sm_dec_block(tm->sm, orig); in __shadow_block()
284 r = dm_bm_read_lock(tm->bm, orig, v, &orig_block); in __shadow_block()
295 r = dm_bm_write_lock_zero(tm->bm, new, v, result); in __shadow_block()
302 dm_bm_block_size(tm->bm)); in __shadow_block()
308 int dm_tm_shadow_block(struct dm_transaction_manager *tm, dm_block_t orig, in dm_tm_shadow_block() argument
314 if (tm->is_clone) in dm_tm_shadow_block()
317 r = dm_sm_count_is_more_than_one(tm->sm, orig, inc_children); in dm_tm_shadow_block()
321 if (is_shadow(tm, orig) && !*inc_children) in dm_tm_shadow_block()
322 return dm_bm_write_lock(tm->bm, orig, v, result); in dm_tm_shadow_block()
324 r = __shadow_block(tm, orig, v, result); in dm_tm_shadow_block()
327 insert_shadow(tm, dm_block_location(*result)); in dm_tm_shadow_block()
333 int dm_tm_read_lock(struct dm_transaction_manager *tm, dm_block_t b, in dm_tm_read_lock() argument
337 if (tm->is_clone) { in dm_tm_read_lock()
338 int r = dm_bm_read_try_lock(tm->real->bm, b, v, blk); in dm_tm_read_lock()
341 prefetch_add(&tm->real->prefetches, b); in dm_tm_read_lock()
346 return dm_bm_read_lock(tm->bm, b, v, blk); in dm_tm_read_lock()
350 void dm_tm_unlock(struct dm_transaction_manager *tm, struct dm_block *b) in dm_tm_unlock() argument
356 void dm_tm_inc(struct dm_transaction_manager *tm, dm_block_t b) in dm_tm_inc() argument
361 BUG_ON(tm->is_clone); in dm_tm_inc()
363 dm_sm_inc_block(tm->sm, b); in dm_tm_inc()
367 void dm_tm_inc_range(struct dm_transaction_manager *tm, dm_block_t b, dm_block_t e) in dm_tm_inc_range() argument
372 BUG_ON(tm->is_clone); in dm_tm_inc_range()
374 dm_sm_inc_blocks(tm->sm, b, e); in dm_tm_inc_range()
378 void dm_tm_dec(struct dm_transaction_manager *tm, dm_block_t b) in dm_tm_dec() argument
383 BUG_ON(tm->is_clone); in dm_tm_dec()
385 dm_sm_dec_block(tm->sm, b); in dm_tm_dec()
389 void dm_tm_dec_range(struct dm_transaction_manager *tm, dm_block_t b, dm_block_t e) in dm_tm_dec_range() argument
394 BUG_ON(tm->is_clone); in dm_tm_dec_range()
396 dm_sm_dec_blocks(tm->sm, b, e); in dm_tm_dec_range()
400 void dm_tm_with_runs(struct dm_transaction_manager *tm, in dm_tm_with_runs() argument
414 fn(tm, begin, end); in dm_tm_with_runs()
426 fn(tm, begin, end); in dm_tm_with_runs()
430 int dm_tm_ref(struct dm_transaction_manager *tm, dm_block_t b, in dm_tm_ref() argument
433 if (tm->is_clone) in dm_tm_ref()
436 return dm_sm_get_count(tm->sm, b, result); in dm_tm_ref()
439 int dm_tm_block_is_shared(struct dm_transaction_manager *tm, dm_block_t b, in dm_tm_block_is_shared() argument
442 if (tm->is_clone) in dm_tm_block_is_shared()
445 return dm_sm_count_is_more_than_one(tm->sm, b, result); in dm_tm_block_is_shared()
448 struct dm_block_manager *dm_tm_get_bm(struct dm_transaction_manager *tm) in dm_tm_get_bm() argument
450 return tm->bm; in dm_tm_get_bm()
453 void dm_tm_issue_prefetches(struct dm_transaction_manager *tm) in dm_tm_issue_prefetches() argument
455 prefetch_issue(&tm->prefetches, tm->bm); in dm_tm_issue_prefetches()
463 struct dm_transaction_manager **tm, in dm_tm_create_internal() argument
474 *tm = dm_tm_create(bm, *sm); in dm_tm_create_internal()
475 if (IS_ERR(*tm)) { in dm_tm_create_internal()
477 return PTR_ERR(*tm); in dm_tm_create_internal()
481 r = dm_sm_metadata_create(*sm, *tm, dm_bm_nr_blocks(bm), in dm_tm_create_internal()
489 r = dm_sm_metadata_open(*sm, *tm, sm_root, sm_len); in dm_tm_create_internal()
499 dm_tm_destroy(*tm); in dm_tm_create_internal()
505 struct dm_transaction_manager **tm, in dm_tm_create_with_sm() argument
508 return dm_tm_create_internal(bm, sb_location, tm, sm, 1, NULL, 0); in dm_tm_create_with_sm()
514 struct dm_transaction_manager **tm, in dm_tm_open_with_sm() argument
517 return dm_tm_create_internal(bm, sb_location, tm, sm, 0, sm_root, root_len); in dm_tm_open_with_sm()