1 | /* |
2 | * Copyright (c) 2015 Grzegorz Kostka (kostka.grzegorz@gmail.com) |
3 | * Copyright (c) 2015 Kaho Ng (ngkaho1234@gmail.com) |
4 | * |
5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions |
7 | * are met: |
8 | * |
9 | * - Redistributions of source code must retain the above copyright |
10 | * notice, this list of conditions and the following disclaimer. |
11 | * - Redistributions in binary form must reproduce the above copyright |
12 | * notice, this list of conditions and the following disclaimer in the |
13 | * documentation and/or other materials provided with the distribution. |
14 | * - The name of the author may not be used to endorse or promote products |
15 | * derived from this software without specific prior written permission. |
16 | * |
17 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
18 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
19 | * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
20 | * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
21 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
22 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
23 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
24 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
25 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
26 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
27 | */ |
28 | |
29 | /** @addtogroup lwext4 |
30 | * @{ |
31 | */ |
32 | /** |
33 | * @file ext4_journal.h |
34 | * @brief Journal handle functions |
35 | */ |
36 | |
37 | #ifndef EXT4_JOURNAL_H_ |
38 | #define EXT4_JOURNAL_H_ |
39 | |
40 | #ifdef __cplusplus |
41 | extern "C" { |
42 | #endif |
43 | |
44 | #include <ext4_config.h> |
45 | #include <ext4_fs.h> |
46 | #include <ext4_types.h> |
47 | #include <misc/queue.h> |
48 | #include <misc/tree.h> |
49 | |
50 | struct jbd_fs { |
51 | struct ext4_blockdev *bdev; |
52 | struct ext4_inode_ref inode_ref; |
53 | struct jbd_sb sb; |
54 | |
55 | bool dirty; |
56 | }; |
57 | |
58 | struct jbd_buf { |
59 | uint32_t jbd_lba; |
60 | struct ext4_block block; |
61 | struct jbd_trans *trans; |
62 | struct jbd_block_rec *block_rec; |
63 | TAILQ_ENTRY(jbd_buf) buf_node; |
64 | TAILQ_ENTRY(jbd_buf) dirty_buf_node; |
65 | }; |
66 | |
67 | struct jbd_revoke_rec { |
68 | ext4_fsblk_t lba; |
69 | RB_ENTRY(jbd_revoke_rec) revoke_node; |
70 | }; |
71 | |
72 | struct jbd_block_rec { |
73 | ext4_fsblk_t lba; |
74 | struct jbd_trans *trans; |
75 | RB_ENTRY(jbd_block_rec) block_rec_node; |
76 | LIST_ENTRY(jbd_block_rec) tbrec_node; |
77 | TAILQ_HEAD(jbd_buf_dirty, jbd_buf) dirty_buf_queue; |
78 | }; |
79 | |
80 | struct jbd_trans { |
81 | uint32_t trans_id; |
82 | |
83 | uint32_t start_iblock; |
84 | int alloc_blocks; |
85 | int data_cnt; |
86 | uint32_t data_csum; |
87 | int written_cnt; |
88 | int error; |
89 | |
90 | struct jbd_journal *journal; |
91 | |
92 | TAILQ_HEAD(jbd_trans_buf, jbd_buf) buf_queue; |
93 | RB_HEAD(jbd_revoke_tree, jbd_revoke_rec) revoke_root; |
94 | LIST_HEAD(jbd_trans_block_rec, jbd_block_rec) tbrec_list; |
95 | TAILQ_ENTRY(jbd_trans) trans_node; |
96 | }; |
97 | |
98 | struct jbd_journal { |
99 | uint32_t first; |
100 | uint32_t start; |
101 | uint32_t last; |
102 | uint32_t trans_id; |
103 | uint32_t alloc_trans_id; |
104 | |
105 | uint32_t block_size; |
106 | |
107 | TAILQ_HEAD(jbd_cp_queue, jbd_trans) cp_queue; |
108 | RB_HEAD(jbd_block, jbd_block_rec) block_rec_root; |
109 | |
110 | struct jbd_fs *jbd_fs; |
111 | }; |
112 | |
113 | int jbd_get_fs(struct ext4_fs *fs, |
114 | struct jbd_fs *jbd_fs); |
115 | int jbd_put_fs(struct jbd_fs *jbd_fs); |
116 | int jbd_inode_bmap(struct jbd_fs *jbd_fs, |
117 | ext4_lblk_t iblock, |
118 | ext4_fsblk_t *fblock); |
119 | int jbd_recover(struct jbd_fs *jbd_fs); |
120 | int jbd_journal_start(struct jbd_fs *jbd_fs, |
121 | struct jbd_journal *journal); |
122 | int jbd_journal_stop(struct jbd_journal *journal); |
123 | struct jbd_trans * |
124 | jbd_journal_new_trans(struct jbd_journal *journal); |
125 | int jbd_trans_set_block_dirty(struct jbd_trans *trans, |
126 | struct ext4_block *block); |
127 | int jbd_trans_revoke_block(struct jbd_trans *trans, |
128 | ext4_fsblk_t lba); |
129 | int jbd_trans_try_revoke_block(struct jbd_trans *trans, |
130 | ext4_fsblk_t lba); |
131 | void jbd_journal_free_trans(struct jbd_journal *journal, |
132 | struct jbd_trans *trans, |
133 | bool abort); |
134 | int jbd_journal_commit_trans(struct jbd_journal *journal, |
135 | struct jbd_trans *trans); |
136 | void |
137 | jbd_journal_purge_cp_trans(struct jbd_journal *journal, |
138 | bool flush, |
139 | bool once); |
140 | |
141 | #ifdef __cplusplus |
142 | } |
143 | #endif |
144 | |
145 | #endif /* EXT4_JOURNAL_H_ */ |
146 | |
147 | /** |
148 | * @} |
149 | */ |
150 | |