Lines Matching full:tm
103 static int is_shadow(struct dm_transaction_manager *tm, dm_block_t b) in is_shadow() argument
109 spin_lock(&tm->lock); in is_shadow()
110 hlist_for_each_entry(si, tm->buckets + bucket, hlist) in is_shadow()
115 spin_unlock(&tm->lock); in is_shadow()
124 static void insert_shadow(struct dm_transaction_manager *tm, dm_block_t b) in insert_shadow() argument
133 spin_lock(&tm->lock); in insert_shadow()
134 hlist_add_head(&si->hlist, tm->buckets + bucket); in insert_shadow()
135 spin_unlock(&tm->lock); in insert_shadow()
139 static void wipe_shadow_table(struct dm_transaction_manager *tm) in wipe_shadow_table() argument
146 spin_lock(&tm->lock); in wipe_shadow_table()
148 bucket = tm->buckets + i; in wipe_shadow_table()
155 spin_unlock(&tm->lock); in wipe_shadow_table()
164 struct dm_transaction_manager *tm; in dm_tm_create() local
166 tm = kmalloc(sizeof(*tm), GFP_KERNEL); in dm_tm_create()
167 if (!tm) in dm_tm_create()
170 tm->is_clone = 0; in dm_tm_create()
171 tm->real = NULL; in dm_tm_create()
172 tm->bm = bm; in dm_tm_create()
173 tm->sm = sm; in dm_tm_create()
175 spin_lock_init(&tm->lock); in dm_tm_create()
177 INIT_HLIST_HEAD(tm->buckets + i); in dm_tm_create()
179 prefetch_init(&tm->prefetches); in dm_tm_create()
181 return tm; in dm_tm_create()
186 struct dm_transaction_manager *tm; in dm_tm_create_non_blocking_clone() local
188 tm = kmalloc(sizeof(*tm), GFP_KERNEL); in dm_tm_create_non_blocking_clone()
189 if (tm) { in dm_tm_create_non_blocking_clone()
190 tm->is_clone = 1; in dm_tm_create_non_blocking_clone()
191 tm->real = real; in dm_tm_create_non_blocking_clone()
194 return tm; in dm_tm_create_non_blocking_clone()
198 void dm_tm_destroy(struct dm_transaction_manager *tm) in dm_tm_destroy() argument
200 if (!tm->is_clone) in dm_tm_destroy()
201 wipe_shadow_table(tm); in dm_tm_destroy()
203 kfree(tm); in dm_tm_destroy()
207 int dm_tm_pre_commit(struct dm_transaction_manager *tm) in dm_tm_pre_commit() argument
211 if (tm->is_clone) in dm_tm_pre_commit()
214 r = dm_sm_commit(tm->sm); in dm_tm_pre_commit()
218 return dm_bm_flush(tm->bm); in dm_tm_pre_commit()
222 int dm_tm_commit(struct dm_transaction_manager *tm, struct dm_block *root) in dm_tm_commit() argument
224 if (tm->is_clone) in dm_tm_commit()
227 wipe_shadow_table(tm); in dm_tm_commit()
230 return dm_bm_flush(tm->bm); in dm_tm_commit()
234 int dm_tm_new_block(struct dm_transaction_manager *tm, in dm_tm_new_block() argument
241 if (tm->is_clone) in dm_tm_new_block()
244 r = dm_sm_new_block(tm->sm, &new_block); in dm_tm_new_block()
248 r = dm_bm_write_lock_zero(tm->bm, new_block, v, result); in dm_tm_new_block()
250 dm_sm_dec_block(tm->sm, new_block); in dm_tm_new_block()
258 insert_shadow(tm, new_block); in dm_tm_new_block()
263 static int __shadow_block(struct dm_transaction_manager *tm, dm_block_t orig, in __shadow_block() argument
271 r = dm_sm_new_block(tm->sm, &new); in __shadow_block()
275 r = dm_sm_dec_block(tm->sm, orig); in __shadow_block()
279 r = dm_bm_read_lock(tm->bm, orig, v, &orig_block); in __shadow_block()
290 r = dm_bm_write_lock_zero(tm->bm, new, v, result); in __shadow_block()
297 dm_bm_block_size(tm->bm)); in __shadow_block()
303 int dm_tm_shadow_block(struct dm_transaction_manager *tm, dm_block_t orig, in dm_tm_shadow_block() argument
309 if (tm->is_clone) in dm_tm_shadow_block()
312 r = dm_sm_count_is_more_than_one(tm->sm, orig, inc_children); in dm_tm_shadow_block()
316 if (is_shadow(tm, orig) && !*inc_children) in dm_tm_shadow_block()
317 return dm_bm_write_lock(tm->bm, orig, v, result); in dm_tm_shadow_block()
319 r = __shadow_block(tm, orig, v, result); in dm_tm_shadow_block()
322 insert_shadow(tm, dm_block_location(*result)); in dm_tm_shadow_block()
328 int dm_tm_read_lock(struct dm_transaction_manager *tm, dm_block_t b, in dm_tm_read_lock() argument
332 if (tm->is_clone) { in dm_tm_read_lock()
333 int r = dm_bm_read_try_lock(tm->real->bm, b, v, blk); in dm_tm_read_lock()
336 prefetch_add(&tm->real->prefetches, b); in dm_tm_read_lock()
341 return dm_bm_read_lock(tm->bm, b, v, blk); in dm_tm_read_lock()
345 void dm_tm_unlock(struct dm_transaction_manager *tm, struct dm_block *b) in dm_tm_unlock() argument
351 void dm_tm_inc(struct dm_transaction_manager *tm, dm_block_t b) in dm_tm_inc() argument
356 BUG_ON(tm->is_clone); in dm_tm_inc()
358 dm_sm_inc_block(tm->sm, b); in dm_tm_inc()
362 void dm_tm_dec(struct dm_transaction_manager *tm, dm_block_t b) in dm_tm_dec() argument
367 BUG_ON(tm->is_clone); in dm_tm_dec()
369 dm_sm_dec_block(tm->sm, b); in dm_tm_dec()
373 int dm_tm_ref(struct dm_transaction_manager *tm, dm_block_t b, in dm_tm_ref() argument
376 if (tm->is_clone) in dm_tm_ref()
379 return dm_sm_get_count(tm->sm, b, result); in dm_tm_ref()
382 struct dm_block_manager *dm_tm_get_bm(struct dm_transaction_manager *tm) in dm_tm_get_bm() argument
384 return tm->bm; in dm_tm_get_bm()
387 void dm_tm_issue_prefetches(struct dm_transaction_manager *tm) in dm_tm_issue_prefetches() argument
389 prefetch_issue(&tm->prefetches, tm->bm); in dm_tm_issue_prefetches()
397 struct dm_transaction_manager **tm, in dm_tm_create_internal() argument
408 *tm = dm_tm_create(bm, *sm); in dm_tm_create_internal()
409 if (IS_ERR(*tm)) { in dm_tm_create_internal()
411 return PTR_ERR(*tm); in dm_tm_create_internal()
415 r = dm_sm_metadata_create(*sm, *tm, dm_bm_nr_blocks(bm), in dm_tm_create_internal()
423 r = dm_sm_metadata_open(*sm, *tm, sm_root, sm_len); in dm_tm_create_internal()
433 dm_tm_destroy(*tm); in dm_tm_create_internal()
439 struct dm_transaction_manager **tm, in dm_tm_create_with_sm() argument
442 return dm_tm_create_internal(bm, sb_location, tm, sm, 1, NULL, 0); in dm_tm_create_with_sm()
448 struct dm_transaction_manager **tm, in dm_tm_open_with_sm() argument
451 return dm_tm_create_internal(bm, sb_location, tm, sm, 0, sm_root, root_len); in dm_tm_open_with_sm()