1 jbd2: unify revoke and tag block checksum handling
3 From: Jan Kara <jack@suse.cz>
5 Revoke and tag descriptor blocks are just different kinds of descriptor
6 blocks and thus have checksum in the same place. Unify computation and
7 checking of checksums for these.
9 Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
10 Signed-off-by: Jan Kara <jack@suse.cz>
11 Signed-off-by: Theodore Ts'o <tytso@mit.edu>
13 fs/jbd2/commit.c | 18 +-----------------
14 fs/jbd2/journal.c | 15 +++++++++++++++
15 fs/jbd2/recovery.c | 31 +++++--------------------------
16 fs/jbd2/revoke.c | 19 ++-----------------
17 include/linux/jbd2.h | 8 ++------
18 5 files changed, 25 insertions(+), 66 deletions(-)
20 diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c
21 index cf221f3d955a..ae832cd44dd8 100644
22 --- a/fs/jbd2/commit.c
23 +++ b/fs/jbd2/commit.c
24 @@ -317,22 +317,6 @@ static void write_tag_block(journal_t *j, journal_block_tag_t *tag,
25 tag->t_blocknr_high = cpu_to_be32((block >> 31) >> 1);
28 -static void jbd2_descr_block_csum_set(journal_t *j,
29 - struct buffer_head *bh)
31 - struct jbd2_journal_block_tail *tail;
34 - if (!jbd2_journal_has_csum_v2or3(j))
37 - tail = (struct jbd2_journal_block_tail *)(bh->b_data + j->j_blocksize -
38 - sizeof(struct jbd2_journal_block_tail));
39 - tail->t_checksum = 0;
40 - csum = jbd2_chksum(j, j->j_csum_seed, bh->b_data, j->j_blocksize);
41 - tail->t_checksum = cpu_to_be32(csum);
44 static void jbd2_block_tag_csum_set(journal_t *j, journal_block_tag_t *tag,
45 struct buffer_head *bh, __u32 sequence)
47 @@ -714,7 +698,7 @@ void jbd2_journal_commit_transaction(journal_t *journal)
49 tag->t_flags |= cpu_to_be16(JBD2_FLAG_LAST_TAG);
51 - jbd2_descr_block_csum_set(journal, descriptor);
52 + jbd2_descriptor_block_csum_set(journal, descriptor);
54 for (i = 0; i < bufs; i++) {
55 struct buffer_head *bh = wbuf[i];
56 diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c
57 index 28d05bd9a588..defa962a8e15 100644
58 --- a/fs/jbd2/journal.c
59 +++ b/fs/jbd2/journal.c
60 @@ -834,6 +834,21 @@ jbd2_journal_get_descriptor_buffer(transaction_t *transaction, int type)
64 +void jbd2_descriptor_block_csum_set(journal_t *j, struct buffer_head *bh)
66 + struct jbd2_journal_block_tail *tail;
69 + if (!jbd2_journal_has_csum_v2or3(j))
72 + tail = (struct jbd2_journal_block_tail *)(bh->b_data + j->j_blocksize -
73 + sizeof(struct jbd2_journal_block_tail));
74 + tail->t_checksum = 0;
75 + csum = jbd2_chksum(j, j->j_csum_seed, bh->b_data, j->j_blocksize);
76 + tail->t_checksum = cpu_to_be32(csum);
80 * Return tid of the oldest transaction in the journal and block in the journal
81 * where the transaction starts.
82 diff --git a/fs/jbd2/recovery.c b/fs/jbd2/recovery.c
83 index 7f277e49fe88..08a456b96e4e 100644
84 --- a/fs/jbd2/recovery.c
85 +++ b/fs/jbd2/recovery.c
86 @@ -174,8 +174,7 @@ static int jread(struct buffer_head **bhp, journal_t *journal,
90 -static int jbd2_descr_block_csum_verify(journal_t *j,
92 +static int jbd2_descriptor_block_csum_verify(journal_t *j, void *buf)
94 struct jbd2_journal_block_tail *tail;
96 @@ -522,8 +521,8 @@ static int do_one_pass(journal_t *journal,
98 sizeof(struct jbd2_journal_block_tail);
99 if (descr_csum_size > 0 &&
100 - !jbd2_descr_block_csum_verify(journal,
102 + !jbd2_descriptor_block_csum_verify(journal,
104 printk(KERN_ERR "JBD2: Invalid checksum "
105 "recovering block %lu in log\n",
107 @@ -811,26 +810,6 @@ static int do_one_pass(journal_t *journal,
111 -static int jbd2_revoke_block_csum_verify(journal_t *j,
114 - struct jbd2_journal_revoke_tail *tail;
118 - if (!jbd2_journal_has_csum_v2or3(j))
121 - tail = (struct jbd2_journal_revoke_tail *)(buf + j->j_blocksize -
122 - sizeof(struct jbd2_journal_revoke_tail));
123 - provided = tail->r_checksum;
124 - tail->r_checksum = 0;
125 - calculated = jbd2_chksum(j, j->j_csum_seed, buf, j->j_blocksize);
126 - tail->r_checksum = provided;
128 - return provided == cpu_to_be32(calculated);
131 /* Scan a revoke record, marking all blocks mentioned as revoked. */
133 static int scan_revoke_records(journal_t *journal, struct buffer_head *bh,
134 @@ -846,11 +825,11 @@ static int scan_revoke_records(journal_t *journal, struct buffer_head *bh,
135 offset = sizeof(jbd2_journal_revoke_header_t);
136 rcount = be32_to_cpu(header->r_count);
138 - if (!jbd2_revoke_block_csum_verify(journal, header))
139 + if (!jbd2_descriptor_block_csum_verify(journal, header))
142 if (jbd2_journal_has_csum_v2or3(journal))
143 - csum_size = sizeof(struct jbd2_journal_revoke_tail);
144 + csum_size = sizeof(struct jbd2_journal_block_tail);
145 if (rcount > journal->j_blocksize - csum_size)
148 diff --git a/fs/jbd2/revoke.c b/fs/jbd2/revoke.c
149 index d1ebb1d41d17..91171dc352cb 100644
150 --- a/fs/jbd2/revoke.c
151 +++ b/fs/jbd2/revoke.c
152 @@ -583,7 +583,7 @@ static void write_one_revoke_record(transaction_t *transaction,
154 /* Do we need to leave space at the end for a checksum? */
155 if (jbd2_journal_has_csum_v2or3(journal))
156 - csum_size = sizeof(struct jbd2_journal_revoke_tail);
157 + csum_size = sizeof(struct jbd2_journal_block_tail);
159 if (jbd2_has_feature_64bit(journal))
161 @@ -623,21 +623,6 @@ static void write_one_revoke_record(transaction_t *transaction,
165 -static void jbd2_revoke_csum_set(journal_t *j, struct buffer_head *bh)
167 - struct jbd2_journal_revoke_tail *tail;
170 - if (!jbd2_journal_has_csum_v2or3(j))
173 - tail = (struct jbd2_journal_revoke_tail *)(bh->b_data + j->j_blocksize -
174 - sizeof(struct jbd2_journal_revoke_tail));
175 - tail->r_checksum = 0;
176 - csum = jbd2_chksum(j, j->j_csum_seed, bh->b_data, j->j_blocksize);
177 - tail->r_checksum = cpu_to_be32(csum);
181 * Flush a revoke descriptor out to the journal. If we are aborting,
182 * this is a noop; otherwise we are generating a buffer which needs to
183 @@ -658,7 +643,7 @@ static void flush_descriptor(journal_t *journal,
185 header = (jbd2_journal_revoke_header_t *)descriptor->b_data;
186 header->r_count = cpu_to_be32(offset);
187 - jbd2_revoke_csum_set(journal, descriptor);
188 + jbd2_descriptor_block_csum_set(journal, descriptor);
190 set_buffer_jwrite(descriptor);
191 BUFFER_TRACE(descriptor, "write");
192 diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h
193 index 3649cb8d3a41..fd1083c46c61 100644
194 --- a/include/linux/jbd2.h
195 +++ b/include/linux/jbd2.h
196 @@ -200,7 +200,7 @@ typedef struct journal_block_tag_s
197 __be32 t_blocknr_high; /* most-significant high 32bits. */
198 } journal_block_tag_t;
200 -/* Tail of descriptor block, for checksumming */
201 +/* Tail of descriptor or revoke block, for checksumming */
202 struct jbd2_journal_block_tail {
203 __be32 t_checksum; /* crc32c(uuid+descr_block) */
205 @@ -215,11 +215,6 @@ typedef struct jbd2_journal_revoke_header_s
206 __be32 r_count; /* Count of bytes used in the block */
207 } jbd2_journal_revoke_header_t;
209 -/* Tail of revoke block, for checksumming */
210 -struct jbd2_journal_revoke_tail {
211 - __be32 r_checksum; /* crc32c(uuid+revoke_block) */
214 /* Definitions for the journal tag flags word: */
215 #define JBD2_FLAG_ESCAPE 1 /* on-disk block is escaped */
216 #define JBD2_FLAG_SAME_UUID 2 /* block has same uuid as previous */
217 @@ -1138,6 +1133,7 @@ static inline void jbd2_unfile_log_bh(struct buffer_head *bh)
219 /* Log buffer allocation */
220 struct buffer_head *jbd2_journal_get_descriptor_buffer(transaction_t *, int);
221 +void jbd2_descriptor_block_csum_set(journal_t *, struct buffer_head *);
222 int jbd2_journal_next_log_block(journal_t *, unsigned long long *);
223 int jbd2_journal_get_log_tail(journal_t *journal, tid_t *tid,
224 unsigned long *block);