• Home
  • Raw
  • Download

Lines Matching refs:tm

44 static int is_shadow(struct dm_transaction_manager *tm, dm_block_t b)  in is_shadow()  argument
50 spin_lock(&tm->lock); in is_shadow()
51 hlist_for_each_entry(si, tm->buckets + bucket, hlist) in is_shadow()
56 spin_unlock(&tm->lock); in is_shadow()
65 static void insert_shadow(struct dm_transaction_manager *tm, dm_block_t b) in insert_shadow() argument
74 spin_lock(&tm->lock); in insert_shadow()
75 hlist_add_head(&si->hlist, tm->buckets + bucket); in insert_shadow()
76 spin_unlock(&tm->lock); in insert_shadow()
80 static void wipe_shadow_table(struct dm_transaction_manager *tm) in wipe_shadow_table() argument
87 spin_lock(&tm->lock); in wipe_shadow_table()
89 bucket = tm->buckets + i; in wipe_shadow_table()
96 spin_unlock(&tm->lock); in wipe_shadow_table()
105 struct dm_transaction_manager *tm; in dm_tm_create() local
107 tm = kmalloc(sizeof(*tm), GFP_KERNEL); in dm_tm_create()
108 if (!tm) in dm_tm_create()
111 tm->is_clone = 0; in dm_tm_create()
112 tm->real = NULL; in dm_tm_create()
113 tm->bm = bm; in dm_tm_create()
114 tm->sm = sm; in dm_tm_create()
116 spin_lock_init(&tm->lock); in dm_tm_create()
118 INIT_HLIST_HEAD(tm->buckets + i); in dm_tm_create()
120 return tm; in dm_tm_create()
125 struct dm_transaction_manager *tm; in dm_tm_create_non_blocking_clone() local
127 tm = kmalloc(sizeof(*tm), GFP_KERNEL); in dm_tm_create_non_blocking_clone()
128 if (tm) { in dm_tm_create_non_blocking_clone()
129 tm->is_clone = 1; in dm_tm_create_non_blocking_clone()
130 tm->real = real; in dm_tm_create_non_blocking_clone()
133 return tm; in dm_tm_create_non_blocking_clone()
137 void dm_tm_destroy(struct dm_transaction_manager *tm) in dm_tm_destroy() argument
139 if (!tm->is_clone) in dm_tm_destroy()
140 wipe_shadow_table(tm); in dm_tm_destroy()
142 kfree(tm); in dm_tm_destroy()
146 int dm_tm_pre_commit(struct dm_transaction_manager *tm) in dm_tm_pre_commit() argument
150 if (tm->is_clone) in dm_tm_pre_commit()
153 r = dm_sm_commit(tm->sm); in dm_tm_pre_commit()
161 int dm_tm_commit(struct dm_transaction_manager *tm, struct dm_block *root) in dm_tm_commit() argument
163 if (tm->is_clone) in dm_tm_commit()
166 wipe_shadow_table(tm); in dm_tm_commit()
168 return dm_bm_flush_and_unlock(tm->bm, root); in dm_tm_commit()
172 int dm_tm_new_block(struct dm_transaction_manager *tm, in dm_tm_new_block() argument
179 if (tm->is_clone) in dm_tm_new_block()
182 r = dm_sm_new_block(tm->sm, &new_block); in dm_tm_new_block()
186 r = dm_bm_write_lock_zero(tm->bm, new_block, v, result); in dm_tm_new_block()
188 dm_sm_dec_block(tm->sm, new_block); in dm_tm_new_block()
196 insert_shadow(tm, new_block); in dm_tm_new_block()
201 static int __shadow_block(struct dm_transaction_manager *tm, dm_block_t orig, in __shadow_block() argument
209 r = dm_sm_new_block(tm->sm, &new); in __shadow_block()
213 r = dm_sm_dec_block(tm->sm, orig); in __shadow_block()
217 r = dm_bm_read_lock(tm->bm, orig, v, &orig_block); in __shadow_block()
228 r = dm_bm_write_lock_zero(tm->bm, new, v, result); in __shadow_block()
235 dm_bm_block_size(tm->bm)); in __shadow_block()
241 int dm_tm_shadow_block(struct dm_transaction_manager *tm, dm_block_t orig, in dm_tm_shadow_block() argument
247 if (tm->is_clone) in dm_tm_shadow_block()
250 r = dm_sm_count_is_more_than_one(tm->sm, orig, inc_children); in dm_tm_shadow_block()
254 if (is_shadow(tm, orig) && !*inc_children) in dm_tm_shadow_block()
255 return dm_bm_write_lock(tm->bm, orig, v, result); in dm_tm_shadow_block()
257 r = __shadow_block(tm, orig, v, result); in dm_tm_shadow_block()
260 insert_shadow(tm, dm_block_location(*result)); in dm_tm_shadow_block()
266 int dm_tm_read_lock(struct dm_transaction_manager *tm, dm_block_t b, in dm_tm_read_lock() argument
270 if (tm->is_clone) in dm_tm_read_lock()
271 return dm_bm_read_try_lock(tm->real->bm, b, v, blk); in dm_tm_read_lock()
273 return dm_bm_read_lock(tm->bm, b, v, blk); in dm_tm_read_lock()
277 int dm_tm_unlock(struct dm_transaction_manager *tm, struct dm_block *b) in dm_tm_unlock() argument
283 void dm_tm_inc(struct dm_transaction_manager *tm, dm_block_t b) in dm_tm_inc() argument
288 BUG_ON(tm->is_clone); in dm_tm_inc()
290 dm_sm_inc_block(tm->sm, b); in dm_tm_inc()
294 void dm_tm_dec(struct dm_transaction_manager *tm, dm_block_t b) in dm_tm_dec() argument
299 BUG_ON(tm->is_clone); in dm_tm_dec()
301 dm_sm_dec_block(tm->sm, b); in dm_tm_dec()
305 int dm_tm_ref(struct dm_transaction_manager *tm, dm_block_t b, in dm_tm_ref() argument
308 if (tm->is_clone) in dm_tm_ref()
311 return dm_sm_get_count(tm->sm, b, result); in dm_tm_ref()
314 struct dm_block_manager *dm_tm_get_bm(struct dm_transaction_manager *tm) in dm_tm_get_bm() argument
316 return tm->bm; in dm_tm_get_bm()
323 struct dm_transaction_manager **tm, in dm_tm_create_internal() argument
334 *tm = dm_tm_create(bm, *sm); in dm_tm_create_internal()
335 if (IS_ERR(*tm)) { in dm_tm_create_internal()
337 return PTR_ERR(*tm); in dm_tm_create_internal()
341 r = dm_sm_metadata_create(*sm, *tm, dm_bm_nr_blocks(bm), in dm_tm_create_internal()
349 r = dm_sm_metadata_open(*sm, *tm, sm_root, sm_len); in dm_tm_create_internal()
359 dm_tm_destroy(*tm); in dm_tm_create_internal()
365 struct dm_transaction_manager **tm, in dm_tm_create_with_sm() argument
368 return dm_tm_create_internal(bm, sb_location, tm, sm, 1, NULL, 0); in dm_tm_create_with_sm()
374 struct dm_transaction_manager **tm, in dm_tm_open_with_sm() argument
377 return dm_tm_create_internal(bm, sb_location, tm, sm, 0, sm_root, root_len); in dm_tm_open_with_sm()