This source file includes following definitions.
- ocfs2_inc_trans_id
- ocfs2_set_ci_lock_trans
- ocfs2_ci_fully_checkpointed
- ocfs2_ci_is_new
- ocfs2_inode_is_new
- ocfs2_ci_set_new
- ocfs2_start_checkpoint
- ocfs2_checkpoint_inode
- ocfs2_quota_trans_credits
- ocfs2_inline_to_extents_credits
- ocfs2_remove_extent_credits
- ocfs2_add_dir_index_credits
- ocfs2_mknod_credits
- ocfs2_link_credits
- ocfs2_unlink_credits
- ocfs2_rename_credits
- ocfs2_calc_dxi_expand_credits
- ocfs2_calc_extend_credits
- ocfs2_calc_symlink_credits
- ocfs2_calc_group_alloc_credits
- ocfs2_calc_bg_discontig_credits
- ocfs2_jbd2_inode_add_write
- ocfs2_begin_ordered_truncate
- ocfs2_update_inode_fsync_trans
1
2
3
4
5
6
7
8
9
10
11
12 #ifndef OCFS2_JOURNAL_H
13 #define OCFS2_JOURNAL_H
14
15 #include <linux/fs.h>
16 #include <linux/jbd2.h>
17
18 enum ocfs2_journal_state {
19 OCFS2_JOURNAL_FREE = 0,
20 OCFS2_JOURNAL_LOADED,
21 OCFS2_JOURNAL_IN_SHUTDOWN,
22 };
23
24 struct ocfs2_super;
25 struct ocfs2_dinode;
26
27
28
29
30
31
32 struct ocfs2_recovery_map {
33 unsigned int rm_used;
34 unsigned int *rm_entries;
35 };
36
37
38 struct ocfs2_journal {
39 enum ocfs2_journal_state j_state;
40
41 journal_t *j_journal;
42 struct inode *j_inode;
43
44 struct ocfs2_super *j_osb;
45
46
47
48
49
50
51
52
53 struct buffer_head *j_bh;
54 atomic_t j_num_trans;
55
56 spinlock_t j_lock;
57 unsigned long j_trans_id;
58 struct rw_semaphore j_trans_barrier;
59 wait_queue_head_t j_checkpointed;
60
61
62 struct list_head j_la_cleanups;
63 struct work_struct j_recovery_work;
64 };
65
66 extern spinlock_t trans_inc_lock;
67
68
69 static inline unsigned long ocfs2_inc_trans_id(struct ocfs2_journal *j)
70 {
71 unsigned long old_id;
72 spin_lock(&trans_inc_lock);
73 old_id = j->j_trans_id++;
74 if (unlikely(!j->j_trans_id))
75 j->j_trans_id = 1;
76 spin_unlock(&trans_inc_lock);
77 return old_id;
78 }
79
80 static inline void ocfs2_set_ci_lock_trans(struct ocfs2_journal *journal,
81 struct ocfs2_caching_info *ci)
82 {
83 spin_lock(&trans_inc_lock);
84 ci->ci_last_trans = journal->j_trans_id;
85 spin_unlock(&trans_inc_lock);
86 }
87
88
89
90
91
92
93 static inline int ocfs2_ci_fully_checkpointed(struct ocfs2_caching_info *ci)
94 {
95 int ret;
96 struct ocfs2_journal *journal =
97 OCFS2_SB(ocfs2_metadata_cache_get_super(ci))->journal;
98
99 spin_lock(&trans_inc_lock);
100 ret = time_after(journal->j_trans_id, ci->ci_last_trans);
101 spin_unlock(&trans_inc_lock);
102 return ret;
103 }
104
105
106
107
108
109 static inline int ocfs2_ci_is_new(struct ocfs2_caching_info *ci)
110 {
111 int ret;
112 struct ocfs2_journal *journal =
113 OCFS2_SB(ocfs2_metadata_cache_get_super(ci))->journal;
114
115 spin_lock(&trans_inc_lock);
116 ret = !(time_after(journal->j_trans_id, ci->ci_created_trans));
117 if (!ret)
118 ci->ci_created_trans = 0;
119 spin_unlock(&trans_inc_lock);
120 return ret;
121 }
122
123
124 static inline int ocfs2_inode_is_new(struct inode *inode)
125 {
126
127
128
129 if (OCFS2_I(inode)->ip_flags & OCFS2_INODE_SYSTEM_FILE)
130 return 0;
131
132 return ocfs2_ci_is_new(INODE_CACHE(inode));
133 }
134
135 static inline void ocfs2_ci_set_new(struct ocfs2_super *osb,
136 struct ocfs2_caching_info *ci)
137 {
138 spin_lock(&trans_inc_lock);
139 ci->ci_created_trans = osb->journal->j_trans_id;
140 spin_unlock(&trans_inc_lock);
141 }
142
143
144 void ocfs2_orphan_scan_init(struct ocfs2_super *osb);
145 void ocfs2_orphan_scan_start(struct ocfs2_super *osb);
146 void ocfs2_orphan_scan_stop(struct ocfs2_super *osb);
147
148 void ocfs2_complete_recovery(struct work_struct *work);
149 void ocfs2_wait_for_recovery(struct ocfs2_super *osb);
150
151 int ocfs2_recovery_init(struct ocfs2_super *osb);
152 void ocfs2_recovery_exit(struct ocfs2_super *osb);
153
154 int ocfs2_compute_replay_slots(struct ocfs2_super *osb);
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171 void ocfs2_set_journal_params(struct ocfs2_super *osb);
172 int ocfs2_journal_init(struct ocfs2_journal *journal,
173 int *dirty);
174 void ocfs2_journal_shutdown(struct ocfs2_super *osb);
175 int ocfs2_journal_wipe(struct ocfs2_journal *journal,
176 int full);
177 int ocfs2_journal_load(struct ocfs2_journal *journal, int local,
178 int replayed);
179 int ocfs2_check_journals_nolocks(struct ocfs2_super *osb);
180 void ocfs2_recovery_thread(struct ocfs2_super *osb,
181 int node_num);
182 int ocfs2_mark_dead_nodes(struct ocfs2_super *osb);
183 void ocfs2_complete_mount_recovery(struct ocfs2_super *osb);
184 void ocfs2_complete_quota_recovery(struct ocfs2_super *osb);
185
186 static inline void ocfs2_start_checkpoint(struct ocfs2_super *osb)
187 {
188 wake_up(&osb->checkpoint_event);
189 }
190
191 static inline void ocfs2_checkpoint_inode(struct inode *inode)
192 {
193 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
194
195 if (ocfs2_mount_local(osb))
196 return;
197
198 if (!ocfs2_ci_fully_checkpointed(INODE_CACHE(inode))) {
199
200
201
202
203
204
205 ocfs2_start_checkpoint(osb);
206
207 wait_event(osb->journal->j_checkpointed,
208 ocfs2_ci_fully_checkpointed(INODE_CACHE(inode)));
209 }
210 }
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241 handle_t *ocfs2_start_trans(struct ocfs2_super *osb,
242 int max_buffs);
243 int ocfs2_commit_trans(struct ocfs2_super *osb,
244 handle_t *handle);
245 int ocfs2_extend_trans(handle_t *handle, int nblocks);
246 int ocfs2_allocate_extend_trans(handle_t *handle,
247 int thresh);
248
249
250
251
252
253
254
255
256 #define OCFS2_MAX_TRANS_DATA 64U
257
258
259
260
261
262
263
264
265
266
267
268
269 #define OCFS2_JOURNAL_ACCESS_CREATE 0
270 #define OCFS2_JOURNAL_ACCESS_WRITE 1
271 #define OCFS2_JOURNAL_ACCESS_UNDO 2
272
273
274
275 int ocfs2_journal_access_di(handle_t *handle, struct ocfs2_caching_info *ci,
276 struct buffer_head *bh, int type);
277
278 int ocfs2_journal_access_eb(handle_t *handle, struct ocfs2_caching_info *ci,
279 struct buffer_head *bh, int type);
280
281 int ocfs2_journal_access_rb(handle_t *handle, struct ocfs2_caching_info *ci,
282 struct buffer_head *bh, int type);
283
284 int ocfs2_journal_access_gd(handle_t *handle, struct ocfs2_caching_info *ci,
285 struct buffer_head *bh, int type);
286
287 int ocfs2_journal_access_xb(handle_t *handle, struct ocfs2_caching_info *ci,
288 struct buffer_head *bh, int type);
289
290 int ocfs2_journal_access_dq(handle_t *handle, struct ocfs2_caching_info *ci,
291 struct buffer_head *bh, int type);
292
293 int ocfs2_journal_access_db(handle_t *handle, struct ocfs2_caching_info *ci,
294 struct buffer_head *bh, int type);
295
296 int ocfs2_journal_access_dr(handle_t *handle, struct ocfs2_caching_info *ci,
297 struct buffer_head *bh, int type);
298
299 int ocfs2_journal_access_dl(handle_t *handle, struct ocfs2_caching_info *ci,
300 struct buffer_head *bh, int type);
301
302 int ocfs2_journal_access(handle_t *handle, struct ocfs2_caching_info *ci,
303 struct buffer_head *bh, int type);
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324 void ocfs2_journal_dirty(handle_t *handle, struct buffer_head *bh);
325
326
327
328
329
330
331
332
333
334
335
336 #define OCFS2_INODE_UPDATE_CREDITS 1
337
338
339 #define OCFS2_XATTR_BLOCK_UPDATE_CREDITS 1
340
341
342 #define OCFS2_QUOTA_BLOCK_UPDATE_CREDITS 1
343
344
345 #define OCFS2_QINFO_WRITE_CREDITS (OCFS2_INODE_UPDATE_CREDITS + \
346 OCFS2_QUOTA_BLOCK_UPDATE_CREDITS)
347
348 #define OCFS2_LOCAL_QINFO_WRITE_CREDITS OCFS2_QUOTA_BLOCK_UPDATE_CREDITS
349
350
351
352
353
354
355 #define OCFS2_QWRITE_CREDITS (OCFS2_QINFO_WRITE_CREDITS + \
356 OCFS2_QUOTA_BLOCK_UPDATE_CREDITS)
357
358
359
360 #define OCFS2_QSYNC_CREDITS (OCFS2_QINFO_WRITE_CREDITS + \
361 2 * OCFS2_QUOTA_BLOCK_UPDATE_CREDITS)
362
363 static inline int ocfs2_quota_trans_credits(struct super_block *sb)
364 {
365 int credits = 0;
366
367 if (OCFS2_HAS_RO_COMPAT_FEATURE(sb, OCFS2_FEATURE_RO_COMPAT_USRQUOTA))
368 credits += OCFS2_QWRITE_CREDITS;
369 if (OCFS2_HAS_RO_COMPAT_FEATURE(sb, OCFS2_FEATURE_RO_COMPAT_GRPQUOTA))
370 credits += OCFS2_QWRITE_CREDITS;
371 return credits;
372 }
373
374
375 #define OCFS2_GROUP_EXTEND_CREDITS (OCFS2_INODE_UPDATE_CREDITS + 1)
376
377
378 #define OCFS2_GROUP_ADD_CREDITS (OCFS2_INODE_UPDATE_CREDITS + 1)
379
380
381
382 #define OCFS2_SUBALLOC_ALLOC (3)
383
384 static inline int ocfs2_inline_to_extents_credits(struct super_block *sb)
385 {
386 return OCFS2_SUBALLOC_ALLOC + OCFS2_INODE_UPDATE_CREDITS +
387 ocfs2_quota_trans_credits(sb);
388 }
389
390
391 #define OCFS2_SUBALLOC_FREE (2)
392
393 #define OCFS2_TRUNCATE_LOG_UPDATE OCFS2_INODE_UPDATE_CREDITS
394 #define OCFS2_TRUNCATE_LOG_FLUSH_ONE_REC (OCFS2_SUBALLOC_FREE \
395 + OCFS2_TRUNCATE_LOG_UPDATE)
396
397 static inline int ocfs2_remove_extent_credits(struct super_block *sb)
398 {
399 return OCFS2_TRUNCATE_LOG_UPDATE + OCFS2_INODE_UPDATE_CREDITS +
400 ocfs2_quota_trans_credits(sb);
401 }
402
403
404
405 #define OCFS2_DIR_LINK_ADDITIONAL_CREDITS (1 + OCFS2_SUBALLOC_ALLOC + 1)
406
407 static inline int ocfs2_add_dir_index_credits(struct super_block *sb)
408 {
409
410
411 return 1 + 2 * OCFS2_SUBALLOC_ALLOC +
412 ocfs2_clusters_to_blocks(sb, 1);
413 }
414
415
416
417
418 static inline int ocfs2_mknod_credits(struct super_block *sb, int is_dir,
419 int xattr_credits)
420 {
421 int dir_credits = OCFS2_DIR_LINK_ADDITIONAL_CREDITS;
422
423 if (is_dir)
424 dir_credits += ocfs2_add_dir_index_credits(sb);
425
426 return 4 + OCFS2_SUBALLOC_ALLOC + dir_credits + xattr_credits +
427 ocfs2_quota_trans_credits(sb);
428 }
429
430
431 #define OCFS2_WINDOW_MOVE_CREDITS (OCFS2_INODE_UPDATE_CREDITS \
432 + OCFS2_SUBALLOC_ALLOC + OCFS2_SUBALLOC_FREE)
433
434
435
436 #define OCFS2_SIMPLE_DIR_EXTEND_CREDITS (2)
437
438
439
440
441 static inline int ocfs2_link_credits(struct super_block *sb)
442 {
443 return 2 * OCFS2_INODE_UPDATE_CREDITS + 4 +
444 ocfs2_quota_trans_credits(sb);
445 }
446
447
448
449 static inline int ocfs2_unlink_credits(struct super_block *sb)
450 {
451
452 return 2 * OCFS2_INODE_UPDATE_CREDITS + 3 + ocfs2_link_credits(sb);
453 }
454
455
456
457
458 #define OCFS2_DELETE_INODE_CREDITS (3 * OCFS2_INODE_UPDATE_CREDITS + 4)
459
460
461
462 #define OCFS2_INODE_ADD_TO_ORPHAN_CREDITS (2 * OCFS2_INODE_UPDATE_CREDITS + 4)
463 #define OCFS2_INODE_DEL_FROM_ORPHAN_CREDITS OCFS2_INODE_ADD_TO_ORPHAN_CREDITS
464
465
466
467
468 static inline int ocfs2_rename_credits(struct super_block *sb)
469 {
470 return 3 * OCFS2_INODE_UPDATE_CREDITS + 6 + ocfs2_unlink_credits(sb);
471 }
472
473
474
475
476 #define OCFS2_XATTR_BLOCK_CREATE_CREDITS (OCFS2_SUBALLOC_ALLOC * 2 + \
477 + OCFS2_INODE_UPDATE_CREDITS \
478 + OCFS2_XATTR_BLOCK_UPDATE_CREDITS)
479
480
481 #define OCFS2_DX_ROOT_REMOVE_CREDITS (OCFS2_INODE_UPDATE_CREDITS + \
482 OCFS2_SUBALLOC_FREE)
483
484 static inline int ocfs2_calc_dxi_expand_credits(struct super_block *sb)
485 {
486 int credits = 1 + OCFS2_SUBALLOC_ALLOC;
487
488 credits += ocfs2_clusters_to_blocks(sb, 1);
489 credits += ocfs2_quota_trans_credits(sb);
490
491 return credits;
492 }
493
494
495 #define OCFS2_REFCOUNT_TREE_CREATE_CREDITS (OCFS2_INODE_UPDATE_CREDITS + 1 \
496 + OCFS2_SUBALLOC_ALLOC)
497
498
499 #define OCFS2_REFCOUNT_TREE_SET_CREDITS (OCFS2_INODE_UPDATE_CREDITS + 1)
500
501
502
503
504
505
506 #define OCFS2_REFCOUNT_TREE_REMOVE_CREDITS (OCFS2_INODE_UPDATE_CREDITS + 1)
507
508
509 #define OCFS2_EXPAND_REFCOUNT_TREE_CREDITS (OCFS2_SUBALLOC_ALLOC * 2 + 3)
510
511
512
513
514
515
516 static inline int ocfs2_calc_extend_credits(struct super_block *sb,
517 struct ocfs2_extent_list *root_el)
518 {
519 int bitmap_blocks, sysfile_bitmap_blocks, extent_blocks;
520
521
522 bitmap_blocks = OCFS2_SUBALLOC_ALLOC;
523
524
525
526
527
528
529 sysfile_bitmap_blocks = 1 +
530 (OCFS2_SUBALLOC_ALLOC - 1) * ocfs2_extend_meta_needed(root_el);
531
532
533
534
535
536
537 extent_blocks = 1 + 1 + le16_to_cpu(root_el->l_tree_depth);
538
539 return bitmap_blocks + sysfile_bitmap_blocks + extent_blocks +
540 ocfs2_quota_trans_credits(sb);
541 }
542
543 static inline int ocfs2_calc_symlink_credits(struct super_block *sb)
544 {
545 int blocks = ocfs2_mknod_credits(sb, 0, 0);
546
547
548
549 blocks += ocfs2_clusters_to_blocks(sb, 1);
550
551 return blocks + ocfs2_quota_trans_credits(sb);
552 }
553
554 static inline int ocfs2_calc_group_alloc_credits(struct super_block *sb,
555 unsigned int cpg)
556 {
557 int blocks;
558 int bitmap_blocks = OCFS2_SUBALLOC_ALLOC + 1;
559
560
561 blocks = 1 + 1 + 1 + bitmap_blocks;
562 return blocks;
563 }
564
565
566
567
568
569
570
571
572 static inline int ocfs2_calc_bg_discontig_credits(struct super_block *sb)
573 {
574 return ocfs2_extent_recs_per_gd(sb);
575 }
576
577 static inline int ocfs2_jbd2_inode_add_write(handle_t *handle, struct inode *inode,
578 loff_t start_byte, loff_t length)
579 {
580 return jbd2_journal_inode_ranged_write(handle,
581 &OCFS2_I(inode)->ip_jinode,
582 start_byte, length);
583 }
584
585 static inline int ocfs2_begin_ordered_truncate(struct inode *inode,
586 loff_t new_size)
587 {
588 return jbd2_journal_begin_ordered_truncate(
589 OCFS2_SB(inode->i_sb)->journal->j_journal,
590 &OCFS2_I(inode)->ip_jinode,
591 new_size);
592 }
593
594 static inline void ocfs2_update_inode_fsync_trans(handle_t *handle,
595 struct inode *inode,
596 int datasync)
597 {
598 struct ocfs2_inode_info *oi = OCFS2_I(inode);
599
600 if (!is_handle_aborted(handle)) {
601 oi->i_sync_tid = handle->h_transaction->t_tid;
602 if (datasync)
603 oi->i_datasync_tid = handle->h_transaction->t_tid;
604 }
605 }
606
607 #endif