1 // SPDX-License-Identifier: GPL-2.0+ 1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 2 /* 3 * linux/fs/jbd2/recovery.c 3 * linux/fs/jbd2/recovery.c 4 * 4 * 5 * Written by Stephen C. Tweedie <sct@redhat.c 5 * Written by Stephen C. Tweedie <sct@redhat.com>, 1999 6 * 6 * 7 * Copyright 1999-2000 Red Hat Software --- Al 7 * Copyright 1999-2000 Red Hat Software --- All Rights Reserved 8 * 8 * 9 * Journal recovery routines for the generic f 9 * Journal recovery routines for the generic filesystem journaling code; 10 * part of the ext2fs journaling system. 10 * part of the ext2fs journaling system. 11 */ 11 */ 12 12 13 #ifndef __KERNEL__ 13 #ifndef __KERNEL__ 14 #include "jfs_user.h" 14 #include "jfs_user.h" 15 #else 15 #else 16 #include <linux/time.h> 16 #include <linux/time.h> 17 #include <linux/fs.h> 17 #include <linux/fs.h> 18 #include <linux/jbd2.h> 18 #include <linux/jbd2.h> 19 #include <linux/errno.h> 19 #include <linux/errno.h> 20 #include <linux/crc32.h> 20 #include <linux/crc32.h> 21 #include <linux/blkdev.h> 21 #include <linux/blkdev.h> 22 #include <linux/string_choices.h> << 23 #endif 22 #endif 24 23 25 /* 24 /* 26 * Maintain information about the progress of 25 * Maintain information about the progress of the recovery job, so that 27 * the different passes can carry information 26 * the different passes can carry information between them. 28 */ 27 */ 29 struct recovery_info 28 struct recovery_info 30 { 29 { 31 tid_t start_transaction; 30 tid_t start_transaction; 32 tid_t end_transaction; 31 tid_t end_transaction; 33 unsigned long head_block; << 34 32 35 int nr_replays; 33 int nr_replays; 36 int nr_revokes; 34 int nr_revokes; 37 int nr_revoke_hits; 35 int nr_revoke_hits; 38 }; 36 }; 39 37 40 static int do_one_pass(journal_t *journal, 38 static int do_one_pass(journal_t *journal, 41 struct recover 39 struct recovery_info *info, enum passtype pass); 42 static int scan_revoke_records(journal_t *, st 40 static int scan_revoke_records(journal_t *, struct buffer_head *, 43 tid_t, struct 41 tid_t, struct recovery_info *); 44 42 45 #ifdef __KERNEL__ 43 #ifdef __KERNEL__ 46 44 47 /* Release readahead buffers after use */ 45 /* Release readahead buffers after use */ 48 static void journal_brelse_array(struct buffer 46 static void journal_brelse_array(struct buffer_head *b[], int n) 49 { 47 { 50 while (--n >= 0) 48 while (--n >= 0) 51 brelse (b[n]); 49 brelse (b[n]); 52 } 50 } 53 51 54 52 55 /* 53 /* 56 * When reading from the journal, we are going 54 * When reading from the journal, we are going through the block device 57 * layer directly and so there is no readahead 55 * layer directly and so there is no readahead being done for us. We 58 * need to implement any readahead ourselves i 56 * need to implement any readahead ourselves if we want it to happen at 59 * all. Recovery is basically one long sequen 57 * all. Recovery is basically one long sequential read, so make sure we 60 * do the IO in reasonably large chunks. 58 * do the IO in reasonably large chunks. 61 * 59 * 62 * This is not so critical that we need to be 60 * This is not so critical that we need to be enormously clever about 63 * the readahead size, though. 128K is a pure 61 * the readahead size, though. 128K is a purely arbitrary, good-enough 64 * fixed value. 62 * fixed value. 65 */ 63 */ 66 64 67 #define MAXBUF 8 65 #define MAXBUF 8 68 static int do_readahead(journal_t *journal, un 66 static int do_readahead(journal_t *journal, unsigned int start) 69 { 67 { 70 int err; 68 int err; 71 unsigned int max, nbufs, next; 69 unsigned int max, nbufs, next; 72 unsigned long long blocknr; 70 unsigned long long blocknr; 73 struct buffer_head *bh; 71 struct buffer_head *bh; 74 72 75 struct buffer_head * bufs[MAXBUF]; 73 struct buffer_head * bufs[MAXBUF]; 76 74 77 /* Do up to 128K of readahead */ 75 /* Do up to 128K of readahead */ 78 max = start + (128 * 1024 / journal->j 76 max = start + (128 * 1024 / journal->j_blocksize); 79 if (max > journal->j_total_len) 77 if (max > journal->j_total_len) 80 max = journal->j_total_len; 78 max = journal->j_total_len; 81 79 82 /* Do the readahead itself. We'll sub 80 /* Do the readahead itself. We'll submit MAXBUF buffer_heads at 83 * a time to the block device IO layer 81 * a time to the block device IO layer. */ 84 82 85 nbufs = 0; 83 nbufs = 0; 86 84 87 for (next = start; next < max; next++) 85 for (next = start; next < max; next++) { 88 err = jbd2_journal_bmap(journa 86 err = jbd2_journal_bmap(journal, next, &blocknr); 89 87 90 if (err) { 88 if (err) { 91 printk(KERN_ERR "JBD2: 89 printk(KERN_ERR "JBD2: bad block at offset %u\n", 92 next); 90 next); 93 goto failed; 91 goto failed; 94 } 92 } 95 93 96 bh = __getblk(journal->j_dev, 94 bh = __getblk(journal->j_dev, blocknr, journal->j_blocksize); 97 if (!bh) { 95 if (!bh) { 98 err = -ENOMEM; 96 err = -ENOMEM; 99 goto failed; 97 goto failed; 100 } 98 } 101 99 102 if (!buffer_uptodate(bh) && !b 100 if (!buffer_uptodate(bh) && !buffer_locked(bh)) { 103 bufs[nbufs++] = bh; 101 bufs[nbufs++] = bh; 104 if (nbufs == MAXBUF) { 102 if (nbufs == MAXBUF) { 105 bh_readahead_b !! 103 ll_rw_block(REQ_OP_READ, 0, nbufs, bufs); 106 journal_brelse 104 journal_brelse_array(bufs, nbufs); 107 nbufs = 0; 105 nbufs = 0; 108 } 106 } 109 } else 107 } else 110 brelse(bh); 108 brelse(bh); 111 } 109 } 112 110 113 if (nbufs) 111 if (nbufs) 114 bh_readahead_batch(nbufs, bufs !! 112 ll_rw_block(REQ_OP_READ, 0, nbufs, bufs); 115 err = 0; 113 err = 0; 116 114 117 failed: 115 failed: 118 if (nbufs) 116 if (nbufs) 119 journal_brelse_array(bufs, nbu 117 journal_brelse_array(bufs, nbufs); 120 return err; 118 return err; 121 } 119 } 122 120 123 #endif /* __KERNEL__ */ 121 #endif /* __KERNEL__ */ 124 122 125 123 126 /* 124 /* 127 * Read a block from the journal 125 * Read a block from the journal 128 */ 126 */ 129 127 130 static int jread(struct buffer_head **bhp, jou 128 static int jread(struct buffer_head **bhp, journal_t *journal, 131 unsigned int offset) 129 unsigned int offset) 132 { 130 { 133 int err; 131 int err; 134 unsigned long long blocknr; 132 unsigned long long blocknr; 135 struct buffer_head *bh; 133 struct buffer_head *bh; 136 134 137 *bhp = NULL; 135 *bhp = NULL; 138 136 139 if (offset >= journal->j_total_len) { 137 if (offset >= journal->j_total_len) { 140 printk(KERN_ERR "JBD2: corrupt 138 printk(KERN_ERR "JBD2: corrupted journal superblock\n"); 141 return -EFSCORRUPTED; 139 return -EFSCORRUPTED; 142 } 140 } 143 141 144 err = jbd2_journal_bmap(journal, offse 142 err = jbd2_journal_bmap(journal, offset, &blocknr); 145 143 146 if (err) { 144 if (err) { 147 printk(KERN_ERR "JBD2: bad blo 145 printk(KERN_ERR "JBD2: bad block at offset %u\n", 148 offset); 146 offset); 149 return err; 147 return err; 150 } 148 } 151 149 152 bh = __getblk(journal->j_dev, blocknr, 150 bh = __getblk(journal->j_dev, blocknr, journal->j_blocksize); 153 if (!bh) 151 if (!bh) 154 return -ENOMEM; 152 return -ENOMEM; 155 153 156 if (!buffer_uptodate(bh)) { 154 if (!buffer_uptodate(bh)) { 157 /* !! 155 /* If this is a brand new buffer, start readahead. 158 * If this is a brand new buff !! 156 Otherwise, we assume we are already reading it. */ 159 * Otherwise, we assume we are !! 157 if (!buffer_req(bh)) 160 */ << 161 bool need_readahead = !buffer_ << 162 << 163 bh_read_nowait(bh, 0); << 164 if (need_readahead) << 165 do_readahead(journal, 158 do_readahead(journal, offset); 166 wait_on_buffer(bh); 159 wait_on_buffer(bh); 167 } 160 } 168 161 169 if (!buffer_uptodate(bh)) { 162 if (!buffer_uptodate(bh)) { 170 printk(KERN_ERR "JBD2: Failed 163 printk(KERN_ERR "JBD2: Failed to read block at offset %u\n", 171 offset); 164 offset); 172 brelse(bh); 165 brelse(bh); 173 return -EIO; 166 return -EIO; 174 } 167 } 175 168 176 *bhp = bh; 169 *bhp = bh; 177 return 0; 170 return 0; 178 } 171 } 179 172 180 static int jbd2_descriptor_block_csum_verify(j 173 static int jbd2_descriptor_block_csum_verify(journal_t *j, void *buf) 181 { 174 { 182 struct jbd2_journal_block_tail *tail; 175 struct jbd2_journal_block_tail *tail; 183 __be32 provided; 176 __be32 provided; 184 __u32 calculated; 177 __u32 calculated; 185 178 186 if (!jbd2_journal_has_csum_v2or3(j)) 179 if (!jbd2_journal_has_csum_v2or3(j)) 187 return 1; 180 return 1; 188 181 189 tail = (struct jbd2_journal_block_tail !! 182 tail = (struct jbd2_journal_block_tail *)(buf + j->j_blocksize - 190 j->j_blocksize - sizeof(struct !! 183 sizeof(struct jbd2_journal_block_tail)); 191 provided = tail->t_checksum; 184 provided = tail->t_checksum; 192 tail->t_checksum = 0; 185 tail->t_checksum = 0; 193 calculated = jbd2_chksum(j, j->j_csum_ 186 calculated = jbd2_chksum(j, j->j_csum_seed, buf, j->j_blocksize); 194 tail->t_checksum = provided; 187 tail->t_checksum = provided; 195 188 196 return provided == cpu_to_be32(calcula 189 return provided == cpu_to_be32(calculated); 197 } 190 } 198 191 199 /* 192 /* 200 * Count the number of in-use tags in a journa 193 * Count the number of in-use tags in a journal descriptor block. 201 */ 194 */ 202 195 203 static int count_tags(journal_t *journal, stru 196 static int count_tags(journal_t *journal, struct buffer_head *bh) 204 { 197 { 205 char * tagp; 198 char * tagp; 206 journal_block_tag_t tag; !! 199 journal_block_tag_t * tag; 207 int nr = 0, size = 200 int nr = 0, size = journal->j_blocksize; 208 int tag_bytes = jo 201 int tag_bytes = journal_tag_bytes(journal); 209 202 210 if (jbd2_journal_has_csum_v2or3(journa 203 if (jbd2_journal_has_csum_v2or3(journal)) 211 size -= sizeof(struct jbd2_jou 204 size -= sizeof(struct jbd2_journal_block_tail); 212 205 213 tagp = &bh->b_data[sizeof(journal_head 206 tagp = &bh->b_data[sizeof(journal_header_t)]; 214 207 215 while ((tagp - bh->b_data + tag_bytes) 208 while ((tagp - bh->b_data + tag_bytes) <= size) { 216 memcpy(&tag, tagp, sizeof(tag) !! 209 tag = (journal_block_tag_t *) tagp; 217 210 218 nr++; 211 nr++; 219 tagp += tag_bytes; 212 tagp += tag_bytes; 220 if (!(tag.t_flags & cpu_to_be1 !! 213 if (!(tag->t_flags & cpu_to_be16(JBD2_FLAG_SAME_UUID))) 221 tagp += 16; 214 tagp += 16; 222 215 223 if (tag.t_flags & cpu_to_be16( !! 216 if (tag->t_flags & cpu_to_be16(JBD2_FLAG_LAST_TAG)) 224 break; 217 break; 225 } 218 } 226 219 227 return nr; 220 return nr; 228 } 221 } 229 222 230 223 231 /* Make sure we wrap around the log correctly! 224 /* Make sure we wrap around the log correctly! */ 232 #define wrap(journal, var) 225 #define wrap(journal, var) \ 233 do { 226 do { \ 234 if (var >= (journal)->j_last) !! 227 unsigned long _wrap_last = \ 235 var -= ((journal)->j_last - (j !! 228 jbd2_has_feature_fast_commit(journal) ? \ >> 229 (journal)->j_fc_last : (journal)->j_last; \ >> 230 \ >> 231 if (var >= _wrap_last) \ >> 232 var -= (_wrap_last - (journal)->j_first); \ 236 } while (0) 233 } while (0) 237 234 238 static int fc_do_one_pass(journal_t *journal, 235 static int fc_do_one_pass(journal_t *journal, 239 struct recovery_info 236 struct recovery_info *info, enum passtype pass) 240 { 237 { 241 unsigned int expected_commit_id = info 238 unsigned int expected_commit_id = info->end_transaction; 242 unsigned long next_fc_block; 239 unsigned long next_fc_block; 243 struct buffer_head *bh; 240 struct buffer_head *bh; 244 int err = 0; 241 int err = 0; 245 242 246 next_fc_block = journal->j_fc_first; 243 next_fc_block = journal->j_fc_first; 247 if (!journal->j_fc_replay_callback) 244 if (!journal->j_fc_replay_callback) 248 return 0; 245 return 0; 249 246 250 while (next_fc_block <= journal->j_fc_ 247 while (next_fc_block <= journal->j_fc_last) { 251 jbd2_debug(3, "Fast commit rep !! 248 jbd_debug(3, "Fast commit replay: next block %ld\n", 252 next_fc_block); 249 next_fc_block); 253 err = jread(&bh, journal, next 250 err = jread(&bh, journal, next_fc_block); 254 if (err) { 251 if (err) { 255 jbd2_debug(3, "Fast co !! 252 jbd_debug(3, "Fast commit replay: read error\n"); 256 break; 253 break; 257 } 254 } 258 255 259 err = journal->j_fc_replay_cal 256 err = journal->j_fc_replay_callback(journal, bh, pass, 260 next_f 257 next_fc_block - journal->j_fc_first, 261 expect 258 expected_commit_id); 262 brelse(bh); << 263 next_fc_block++; 259 next_fc_block++; 264 if (err < 0 || err == JBD2_FC_ 260 if (err < 0 || err == JBD2_FC_REPLAY_STOP) 265 break; 261 break; 266 err = 0; 262 err = 0; 267 } 263 } 268 264 269 if (err) 265 if (err) 270 jbd2_debug(3, "Fast commit rep !! 266 jbd_debug(3, "Fast commit replay failed, err = %d\n", err); 271 267 272 return err; 268 return err; 273 } 269 } 274 270 275 /** 271 /** 276 * jbd2_journal_recover - recovers a on-disk j 272 * jbd2_journal_recover - recovers a on-disk journal 277 * @journal: the journal to recover 273 * @journal: the journal to recover 278 * 274 * 279 * The primary function for recovering the log 275 * The primary function for recovering the log contents when mounting a 280 * journaled device. 276 * journaled device. 281 * 277 * 282 * Recovery is done in three passes. In the f 278 * Recovery is done in three passes. In the first pass, we look for the 283 * end of the log. In the second, we assemble 279 * end of the log. In the second, we assemble the list of revoke 284 * blocks. In the third and final pass, we re 280 * blocks. In the third and final pass, we replay any un-revoked blocks 285 * in the log. 281 * in the log. 286 */ 282 */ 287 int jbd2_journal_recover(journal_t *journal) 283 int jbd2_journal_recover(journal_t *journal) 288 { 284 { 289 int err, err2; 285 int err, err2; 290 journal_superblock_t * sb; 286 journal_superblock_t * sb; 291 287 292 struct recovery_info info; 288 struct recovery_info info; 293 289 294 memset(&info, 0, sizeof(info)); 290 memset(&info, 0, sizeof(info)); 295 sb = journal->j_superblock; 291 sb = journal->j_superblock; 296 292 297 /* 293 /* 298 * The journal superblock's s_start fi 294 * The journal superblock's s_start field (the current log head) 299 * is always zero if, and only if, the 295 * is always zero if, and only if, the journal was cleanly 300 * unmounted. 296 * unmounted. 301 */ 297 */ >> 298 302 if (!sb->s_start) { 299 if (!sb->s_start) { 303 jbd2_debug(1, "No recovery req !! 300 jbd_debug(1, "No recovery required, last transaction %d\n", 304 be32_to_cpu(sb->s_se !! 301 be32_to_cpu(sb->s_sequence)); 305 journal->j_transaction_sequenc 302 journal->j_transaction_sequence = be32_to_cpu(sb->s_sequence) + 1; 306 journal->j_head = be32_to_cpu( << 307 return 0; 303 return 0; 308 } 304 } 309 305 310 err = do_one_pass(journal, &info, PASS 306 err = do_one_pass(journal, &info, PASS_SCAN); 311 if (!err) 307 if (!err) 312 err = do_one_pass(journal, &in 308 err = do_one_pass(journal, &info, PASS_REVOKE); 313 if (!err) 309 if (!err) 314 err = do_one_pass(journal, &in 310 err = do_one_pass(journal, &info, PASS_REPLAY); 315 311 316 jbd2_debug(1, "JBD2: recovery, exit st !! 312 jbd_debug(1, "JBD2: recovery, exit status %d, " 317 "recovered transactions %u t 313 "recovered transactions %u to %u\n", 318 err, info.start_transaction, 314 err, info.start_transaction, info.end_transaction); 319 jbd2_debug(1, "JBD2: Replayed %d and r !! 315 jbd_debug(1, "JBD2: Replayed %d and revoked %d/%d blocks\n", 320 info.nr_replays, info.nr_rev 316 info.nr_replays, info.nr_revoke_hits, info.nr_revokes); 321 317 322 /* Restart the log at the next transac 318 /* Restart the log at the next transaction ID, thus invalidating 323 * any existing commit records in the 319 * any existing commit records in the log. */ 324 journal->j_transaction_sequence = ++in 320 journal->j_transaction_sequence = ++info.end_transaction; 325 journal->j_head = info.head_block; << 326 jbd2_debug(1, "JBD2: last transaction << 327 journal->j_transaction_seque << 328 321 329 jbd2_journal_clear_revoke(journal); 322 jbd2_journal_clear_revoke(journal); 330 err2 = sync_blockdev(journal->j_fs_dev 323 err2 = sync_blockdev(journal->j_fs_dev); 331 if (!err) 324 if (!err) 332 err = err2; 325 err = err2; 333 err2 = jbd2_check_fs_dev_write_error(j << 334 if (!err) << 335 err = err2; << 336 /* Make sure all replayed data is on p 326 /* Make sure all replayed data is on permanent storage */ 337 if (journal->j_flags & JBD2_BARRIER) { 327 if (journal->j_flags & JBD2_BARRIER) { 338 err2 = blkdev_issue_flush(jour 328 err2 = blkdev_issue_flush(journal->j_fs_dev); 339 if (!err) 329 if (!err) 340 err = err2; 330 err = err2; 341 } 331 } 342 return err; 332 return err; 343 } 333 } 344 334 345 /** 335 /** 346 * jbd2_journal_skip_recovery - Start journal 336 * jbd2_journal_skip_recovery - Start journal and wipe exiting records 347 * @journal: journal to startup 337 * @journal: journal to startup 348 * 338 * 349 * Locate any valid recovery information from 339 * Locate any valid recovery information from the journal and set up the 350 * journal structures in memory to ignore it ( 340 * journal structures in memory to ignore it (presumably because the 351 * caller has evidence that it is out of date) 341 * caller has evidence that it is out of date). 352 * This function doesn't appear to be exported 342 * This function doesn't appear to be exported.. 353 * 343 * 354 * We perform one pass over the journal to all 344 * We perform one pass over the journal to allow us to tell the user how 355 * much recovery information is being erased, 345 * much recovery information is being erased, and to let us initialise 356 * the journal transaction sequence numbers to 346 * the journal transaction sequence numbers to the next unused ID. 357 */ 347 */ 358 int jbd2_journal_skip_recovery(journal_t *jour 348 int jbd2_journal_skip_recovery(journal_t *journal) 359 { 349 { 360 int err; 350 int err; 361 351 362 struct recovery_info info; 352 struct recovery_info info; 363 353 364 memset (&info, 0, sizeof(info)); 354 memset (&info, 0, sizeof(info)); 365 355 366 err = do_one_pass(journal, &info, PASS 356 err = do_one_pass(journal, &info, PASS_SCAN); 367 357 368 if (err) { 358 if (err) { 369 printk(KERN_ERR "JBD2: error % 359 printk(KERN_ERR "JBD2: error %d scanning journal\n", err); 370 ++journal->j_transaction_seque 360 ++journal->j_transaction_sequence; 371 journal->j_head = journal->j_f << 372 } else { 361 } else { 373 #ifdef CONFIG_JBD2_DEBUG 362 #ifdef CONFIG_JBD2_DEBUG 374 int dropped = info.end_transac 363 int dropped = info.end_transaction - 375 be32_to_cpu(journal->j 364 be32_to_cpu(journal->j_superblock->s_sequence); 376 jbd2_debug(1, !! 365 jbd_debug(1, 377 "JBD2: ignoring %d t 366 "JBD2: ignoring %d transaction%s from the journal.\n", 378 dropped, str_plural( !! 367 dropped, (dropped == 1) ? "" : "s"); 379 #endif 368 #endif 380 journal->j_transaction_sequenc 369 journal->j_transaction_sequence = ++info.end_transaction; 381 journal->j_head = info.head_bl << 382 } 370 } 383 371 384 journal->j_tail = 0; 372 journal->j_tail = 0; 385 return err; 373 return err; 386 } 374 } 387 375 388 static inline unsigned long long read_tag_bloc 376 static inline unsigned long long read_tag_block(journal_t *journal, 389 377 journal_block_tag_t *tag) 390 { 378 { 391 unsigned long long block = be32_to_cpu 379 unsigned long long block = be32_to_cpu(tag->t_blocknr); 392 if (jbd2_has_feature_64bit(journal)) 380 if (jbd2_has_feature_64bit(journal)) 393 block |= (u64)be32_to_cpu(tag- 381 block |= (u64)be32_to_cpu(tag->t_blocknr_high) << 32; 394 return block; 382 return block; 395 } 383 } 396 384 397 /* 385 /* 398 * calc_chksums calculates the checksums for t 386 * calc_chksums calculates the checksums for the blocks described in the 399 * descriptor block. 387 * descriptor block. 400 */ 388 */ 401 static int calc_chksums(journal_t *journal, st 389 static int calc_chksums(journal_t *journal, struct buffer_head *bh, 402 unsigned long *next_lo 390 unsigned long *next_log_block, __u32 *crc32_sum) 403 { 391 { 404 int i, num_blks, err; 392 int i, num_blks, err; 405 unsigned long io_block; 393 unsigned long io_block; 406 struct buffer_head *obh; 394 struct buffer_head *obh; 407 395 408 num_blks = count_tags(journal, bh); 396 num_blks = count_tags(journal, bh); 409 /* Calculate checksum of the descripto 397 /* Calculate checksum of the descriptor block. */ 410 *crc32_sum = crc32_be(*crc32_sum, (voi 398 *crc32_sum = crc32_be(*crc32_sum, (void *)bh->b_data, bh->b_size); 411 399 412 for (i = 0; i < num_blks; i++) { 400 for (i = 0; i < num_blks; i++) { 413 io_block = (*next_log_block)++ 401 io_block = (*next_log_block)++; 414 wrap(journal, *next_log_block) 402 wrap(journal, *next_log_block); 415 err = jread(&obh, journal, io_ 403 err = jread(&obh, journal, io_block); 416 if (err) { 404 if (err) { 417 printk(KERN_ERR "JBD2: 405 printk(KERN_ERR "JBD2: IO error %d recovering block " 418 "%lu in log\n" 406 "%lu in log\n", err, io_block); 419 return 1; 407 return 1; 420 } else { 408 } else { 421 *crc32_sum = crc32_be( 409 *crc32_sum = crc32_be(*crc32_sum, (void *)obh->b_data, 422 obh->b_si 410 obh->b_size); 423 } 411 } 424 put_bh(obh); 412 put_bh(obh); 425 } 413 } 426 return 0; 414 return 0; 427 } 415 } 428 416 429 static int jbd2_commit_block_csum_verify(journ 417 static int jbd2_commit_block_csum_verify(journal_t *j, void *buf) 430 { 418 { 431 struct commit_header *h; 419 struct commit_header *h; 432 __be32 provided; 420 __be32 provided; 433 __u32 calculated; 421 __u32 calculated; 434 422 435 if (!jbd2_journal_has_csum_v2or3(j)) 423 if (!jbd2_journal_has_csum_v2or3(j)) 436 return 1; 424 return 1; 437 425 438 h = buf; 426 h = buf; 439 provided = h->h_chksum[0]; 427 provided = h->h_chksum[0]; 440 h->h_chksum[0] = 0; 428 h->h_chksum[0] = 0; 441 calculated = jbd2_chksum(j, j->j_csum_ 429 calculated = jbd2_chksum(j, j->j_csum_seed, buf, j->j_blocksize); 442 h->h_chksum[0] = provided; 430 h->h_chksum[0] = provided; 443 431 444 return provided == cpu_to_be32(calcula 432 return provided == cpu_to_be32(calculated); 445 } 433 } 446 434 447 static bool jbd2_commit_block_csum_verify_part << 448 { << 449 struct commit_header *h; << 450 __be32 provided; << 451 __u32 calculated; << 452 void *tmpbuf; << 453 << 454 tmpbuf = kzalloc(j->j_blocksize, GFP_K << 455 if (!tmpbuf) << 456 return false; << 457 << 458 memcpy(tmpbuf, buf, sizeof(struct comm << 459 h = tmpbuf; << 460 provided = h->h_chksum[0]; << 461 h->h_chksum[0] = 0; << 462 calculated = jbd2_chksum(j, j->j_csum_ << 463 kfree(tmpbuf); << 464 << 465 return provided == cpu_to_be32(calcula << 466 } << 467 << 468 static int jbd2_block_tag_csum_verify(journal_ 435 static int jbd2_block_tag_csum_verify(journal_t *j, journal_block_tag_t *tag, 469 journal_ << 470 void *bu 436 void *buf, __u32 sequence) 471 { 437 { >> 438 journal_block_tag3_t *tag3 = (journal_block_tag3_t *)tag; 472 __u32 csum32; 439 __u32 csum32; 473 __be32 seq; 440 __be32 seq; 474 441 475 if (!jbd2_journal_has_csum_v2or3(j)) 442 if (!jbd2_journal_has_csum_v2or3(j)) 476 return 1; 443 return 1; 477 444 478 seq = cpu_to_be32(sequence); 445 seq = cpu_to_be32(sequence); 479 csum32 = jbd2_chksum(j, j->j_csum_seed 446 csum32 = jbd2_chksum(j, j->j_csum_seed, (__u8 *)&seq, sizeof(seq)); 480 csum32 = jbd2_chksum(j, csum32, buf, j 447 csum32 = jbd2_chksum(j, csum32, buf, j->j_blocksize); 481 448 482 if (jbd2_has_feature_csum3(j)) 449 if (jbd2_has_feature_csum3(j)) 483 return tag3->t_checksum == cpu 450 return tag3->t_checksum == cpu_to_be32(csum32); 484 else 451 else 485 return tag->t_checksum == cpu_ 452 return tag->t_checksum == cpu_to_be16(csum32); 486 } 453 } 487 454 488 static int do_one_pass(journal_t *journal, 455 static int do_one_pass(journal_t *journal, 489 struct recovery_info * 456 struct recovery_info *info, enum passtype pass) 490 { 457 { 491 unsigned int first_commit_I 458 unsigned int first_commit_ID, next_commit_ID; 492 unsigned long next_log_block !! 459 unsigned long next_log_block; 493 int err, success = 460 int err, success = 0; 494 journal_superblock_t * sb; 461 journal_superblock_t * sb; 495 journal_header_t * tmp; 462 journal_header_t * tmp; 496 struct buffer_head * bh; 463 struct buffer_head * bh; 497 unsigned int sequence; 464 unsigned int sequence; 498 int blocktype; 465 int blocktype; 499 int tag_bytes = jo 466 int tag_bytes = journal_tag_bytes(journal); 500 __u32 crc32_sum = ~0 467 __u32 crc32_sum = ~0; /* Transactional Checksums */ 501 int descr_csum_siz 468 int descr_csum_size = 0; 502 int block_error = 469 int block_error = 0; 503 bool need_check_com 470 bool need_check_commit_time = false; 504 __u64 last_trans_com 471 __u64 last_trans_commit_time = 0, commit_time; 505 472 506 /* 473 /* 507 * First thing is to establish what we 474 * First thing is to establish what we expect to find in the log 508 * (in terms of transaction IDs), and 475 * (in terms of transaction IDs), and where (in terms of log 509 * block offsets): query the superbloc 476 * block offsets): query the superblock. 510 */ 477 */ 511 478 512 sb = journal->j_superblock; 479 sb = journal->j_superblock; 513 next_commit_ID = be32_to_cpu(sb->s_seq 480 next_commit_ID = be32_to_cpu(sb->s_sequence); 514 next_log_block = be32_to_cpu(sb->s_sta 481 next_log_block = be32_to_cpu(sb->s_start); 515 head_block = next_log_block; << 516 482 517 first_commit_ID = next_commit_ID; 483 first_commit_ID = next_commit_ID; 518 if (pass == PASS_SCAN) 484 if (pass == PASS_SCAN) 519 info->start_transaction = firs 485 info->start_transaction = first_commit_ID; 520 486 521 jbd2_debug(1, "Starting recovery pass !! 487 jbd_debug(1, "Starting recovery pass %d\n", pass); 522 488 523 /* 489 /* 524 * Now we walk through the log, transa 490 * Now we walk through the log, transaction by transaction, 525 * making sure that each transaction h 491 * making sure that each transaction has a commit block in the 526 * expected place. Each complete tran 492 * expected place. Each complete transaction gets replayed back 527 * into the main filesystem. 493 * into the main filesystem. 528 */ 494 */ 529 495 530 while (1) { 496 while (1) { 531 int flags; 497 int flags; 532 char * tagp; 498 char * tagp; 533 journal_block_tag_t tag; !! 499 journal_block_tag_t * tag; 534 struct buffer_head * obh; 500 struct buffer_head * obh; 535 struct buffer_head * nbh; 501 struct buffer_head * nbh; 536 502 537 cond_resched(); 503 cond_resched(); 538 504 539 /* If we already know where to 505 /* If we already know where to stop the log traversal, 540 * check right now that we hav 506 * check right now that we haven't gone past the end of 541 * the log. */ 507 * the log. */ 542 508 543 if (pass != PASS_SCAN) 509 if (pass != PASS_SCAN) 544 if (tid_geq(next_commi 510 if (tid_geq(next_commit_ID, info->end_transaction)) 545 break; 511 break; 546 512 547 jbd2_debug(2, "Scanning for se !! 513 jbd_debug(2, "Scanning for sequence ID %u at %lu/%lu\n", 548 next_commit_ID, next !! 514 next_commit_ID, next_log_block, >> 515 jbd2_has_feature_fast_commit(journal) ? >> 516 journal->j_fc_last : journal->j_last); 549 517 550 /* Skip over each chunk of the 518 /* Skip over each chunk of the transaction looking 551 * either the next descriptor 519 * either the next descriptor block or the final commit 552 * record. */ 520 * record. */ 553 521 554 jbd2_debug(3, "JBD2: checking !! 522 jbd_debug(3, "JBD2: checking block %ld\n", next_log_block); 555 err = jread(&bh, journal, next 523 err = jread(&bh, journal, next_log_block); 556 if (err) 524 if (err) 557 goto failed; 525 goto failed; 558 526 559 next_log_block++; 527 next_log_block++; 560 wrap(journal, next_log_block); 528 wrap(journal, next_log_block); 561 529 562 /* What kind of buffer is it? 530 /* What kind of buffer is it? 563 * 531 * 564 * If it is a descriptor block 532 * If it is a descriptor block, check that it has the 565 * expected sequence number. 533 * expected sequence number. Otherwise, we're all done 566 * here. */ 534 * here. */ 567 535 568 tmp = (journal_header_t *)bh-> 536 tmp = (journal_header_t *)bh->b_data; 569 537 570 if (tmp->h_magic != cpu_to_be3 538 if (tmp->h_magic != cpu_to_be32(JBD2_MAGIC_NUMBER)) { 571 brelse(bh); 539 brelse(bh); 572 break; 540 break; 573 } 541 } 574 542 575 blocktype = be32_to_cpu(tmp->h 543 blocktype = be32_to_cpu(tmp->h_blocktype); 576 sequence = be32_to_cpu(tmp->h_ 544 sequence = be32_to_cpu(tmp->h_sequence); 577 jbd2_debug(3, "Found magic %d, !! 545 jbd_debug(3, "Found magic %d, sequence %d\n", 578 blocktype, sequence) 546 blocktype, sequence); 579 547 580 if (sequence != next_commit_ID 548 if (sequence != next_commit_ID) { 581 brelse(bh); 549 brelse(bh); 582 break; 550 break; 583 } 551 } 584 552 585 /* OK, we have a valid descrip 553 /* OK, we have a valid descriptor block which matches 586 * all of the sequence number 554 * all of the sequence number checks. What are we going 587 * to do with it? That depend 555 * to do with it? That depends on the pass... */ 588 556 589 switch(blocktype) { 557 switch(blocktype) { 590 case JBD2_DESCRIPTOR_BLOCK: 558 case JBD2_DESCRIPTOR_BLOCK: 591 /* Verify checksum fir 559 /* Verify checksum first */ 592 if (jbd2_journal_has_c 560 if (jbd2_journal_has_csum_v2or3(journal)) 593 descr_csum_siz 561 descr_csum_size = 594 sizeof 562 sizeof(struct jbd2_journal_block_tail); 595 if (descr_csum_size > 563 if (descr_csum_size > 0 && 596 !jbd2_descriptor_b 564 !jbd2_descriptor_block_csum_verify(journal, 597 565 bh->b_data)) { 598 /* 566 /* 599 * PASS_SCAN c 567 * PASS_SCAN can see stale blocks due to lazy 600 * journal ini 568 * journal init. Don't error out on those yet. 601 */ 569 */ 602 if (pass != PA 570 if (pass != PASS_SCAN) { 603 pr_err 571 pr_err("JBD2: Invalid checksum recovering block %lu in log\n", 604 572 next_log_block); 605 err = 573 err = -EFSBADCRC; 606 brelse 574 brelse(bh); 607 goto f 575 goto failed; 608 } 576 } 609 need_check_com 577 need_check_commit_time = true; 610 jbd2_debug(1, !! 578 jbd_debug(1, 611 "inval 579 "invalid descriptor block found in %lu\n", 612 next_l 580 next_log_block); 613 } 581 } 614 582 615 /* If it is a valid de 583 /* If it is a valid descriptor block, replay it 616 * in pass REPLAY; if 584 * in pass REPLAY; if journal_checksums enabled, then 617 * calculate checksums 585 * calculate checksums in PASS_SCAN, otherwise, 618 * just skip over the 586 * just skip over the blocks it describes. */ 619 if (pass != PASS_REPLA 587 if (pass != PASS_REPLAY) { 620 if (pass == PA 588 if (pass == PASS_SCAN && 621 jbd2_has_f 589 jbd2_has_feature_checksum(journal) && 622 !need_chec 590 !need_check_commit_time && 623 !info->end 591 !info->end_transaction) { 624 if (ca 592 if (calc_chksums(journal, bh, 625 593 &next_log_block, 626 594 &crc32_sum)) { 627 595 put_bh(bh); 628 596 break; 629 } 597 } 630 put_bh 598 put_bh(bh); 631 contin 599 continue; 632 } 600 } 633 next_log_block 601 next_log_block += count_tags(journal, bh); 634 wrap(journal, 602 wrap(journal, next_log_block); 635 put_bh(bh); 603 put_bh(bh); 636 continue; 604 continue; 637 } 605 } 638 606 639 /* A descriptor block: 607 /* A descriptor block: we can now write all of 640 * the data blocks. Y 608 * the data blocks. Yay, useful work is finally 641 * getting done here! 609 * getting done here! */ 642 610 643 tagp = &bh->b_data[siz 611 tagp = &bh->b_data[sizeof(journal_header_t)]; 644 while ((tagp - bh->b_d 612 while ((tagp - bh->b_data + tag_bytes) 645 <= journal->j_b 613 <= journal->j_blocksize - descr_csum_size) { 646 unsigned long 614 unsigned long io_block; 647 615 648 memcpy(&tag, t !! 616 tag = (journal_block_tag_t *) tagp; 649 flags = be16_t !! 617 flags = be16_to_cpu(tag->t_flags); 650 618 651 io_block = nex 619 io_block = next_log_block++; 652 wrap(journal, 620 wrap(journal, next_log_block); 653 err = jread(&o 621 err = jread(&obh, journal, io_block); 654 if (err) { 622 if (err) { 655 /* Rec 623 /* Recover what we can, but 656 * rep 624 * report failure at the end. */ 657 succes 625 success = err; 658 printk 626 printk(KERN_ERR 659 627 "JBD2: IO error %d recovering " 660 !! 628 "block %ld in log\n", 661 629 err, io_block); 662 } else { 630 } else { 663 unsign 631 unsigned long long blocknr; 664 632 665 J_ASSE 633 J_ASSERT(obh != NULL); 666 blockn 634 blocknr = read_tag_block(journal, 667 !! 635 tag); 668 636 669 /* If 637 /* If the block has been 670 * rev 638 * revoked, then we're all done 671 * her 639 * here. */ 672 if (jb 640 if (jbd2_journal_test_revoke 673 (j 641 (journal, blocknr, 674 n 642 next_commit_ID)) { 675 643 brelse(obh); 676 644 ++info->nr_revoke_hits; 677 645 goto skip_write; 678 } 646 } 679 647 680 /* Loo 648 /* Look for block corruption */ 681 if (!j 649 if (!jbd2_block_tag_csum_verify( 682 journal, &tag, (journa !! 650 journal, tag, obh->b_data, 683 obh->b_data, be32_to_c !! 651 be32_to_cpu(tmp->h_sequence))) { 684 652 brelse(obh); 685 653 success = -EFSBADCRC; 686 654 printk(KERN_ERR "JBD2: Invalid " 687 655 "checksum recovering " 688 656 "data block %llu in " 689 !! 657 "log\n", blocknr); 690 << 691 658 block_error = 1; 692 659 goto skip_write; 693 } 660 } 694 661 695 /* Fin 662 /* Find a buffer for the new 696 * dat 663 * data being restored */ 697 nbh = 664 nbh = __getblk(journal->j_fs_dev, 698 665 blocknr, 699 666 journal->j_blocksize); 700 if (nb 667 if (nbh == NULL) { 701 668 printk(KERN_ERR 702 669 "JBD2: Out of memory " 703 670 "during recovery.\n"); 704 671 err = -ENOMEM; 705 672 brelse(bh); 706 673 brelse(obh); 707 674 goto failed; 708 } 675 } 709 676 710 lock_b 677 lock_buffer(nbh); 711 memcpy 678 memcpy(nbh->b_data, obh->b_data, 712 679 journal->j_blocksize); 713 if (fl 680 if (flags & JBD2_FLAG_ESCAPE) { 714 681 *((__be32 *)nbh->b_data) = 715 682 cpu_to_be32(JBD2_MAGIC_NUMBER); 716 } 683 } 717 684 718 BUFFER 685 BUFFER_TRACE(nbh, "marking dirty"); 719 set_bu 686 set_buffer_uptodate(nbh); 720 mark_b 687 mark_buffer_dirty(nbh); 721 BUFFER 688 BUFFER_TRACE(nbh, "marking uptodate"); 722 ++info 689 ++info->nr_replays; >> 690 /* ll_rw_block(WRITE, 1, &nbh); */ 723 unlock 691 unlock_buffer(nbh); 724 brelse 692 brelse(obh); 725 brelse 693 brelse(nbh); 726 } 694 } 727 695 728 skip_write: 696 skip_write: 729 tagp += tag_by 697 tagp += tag_bytes; 730 if (!(flags & 698 if (!(flags & JBD2_FLAG_SAME_UUID)) 731 tagp + 699 tagp += 16; 732 700 733 if (flags & JB 701 if (flags & JBD2_FLAG_LAST_TAG) 734 break; 702 break; 735 } 703 } 736 704 737 brelse(bh); 705 brelse(bh); 738 continue; 706 continue; 739 707 740 case JBD2_COMMIT_BLOCK: 708 case JBD2_COMMIT_BLOCK: 741 /* How to differen 709 /* How to differentiate between interrupted commit 742 * and j 710 * and journal corruption ? 743 * 711 * 744 * {nth transaction} 712 * {nth transaction} 745 * Checksum Ver 713 * Checksum Verification Failed 746 * 714 * | 747 * _____ 715 * ____________________ 748 * | 716 * | | 749 * async_commit 717 * async_commit sync_commit 750 * | 718 * | | 751 * | GO T 719 * | GO TO NEXT "Journal Corruption" 752 * | TRAN 720 * | TRANSACTION 753 * | 721 * | 754 * {(n+1)th transancti 722 * {(n+1)th transanction} 755 * | 723 * | 756 * _______|_____ 724 * _______|______________ 757 * | 725 * | | 758 * Commit block found 726 * Commit block found Commit block not found 759 * | 727 * | | 760 * "Journal Corruption 728 * "Journal Corruption" | 761 * _____ 729 * _____________|_________ 762 * | 730 * | | 763 * nth trans corr 731 * nth trans corrupt OR nth trans 764 * and (n+1)th in 732 * and (n+1)th interrupted interrupted 765 * before commit 733 * before commit block 766 * could reach th 734 * could reach the disk. 767 * (Cannot find t 735 * (Cannot find the difference in above 768 * mentioned con 736 * mentioned conditions. Hence assume 769 * "Interrupted 737 * "Interrupted Commit".) 770 */ 738 */ 771 commit_time = be64_to_ 739 commit_time = be64_to_cpu( 772 ((struct commi 740 ((struct commit_header *)bh->b_data)->h_commit_sec); 773 /* 741 /* 774 * If need_check_commi 742 * If need_check_commit_time is set, it means we are in 775 * PASS_SCAN and csum 743 * PASS_SCAN and csum verify failed before. If 776 * commit_time is incr 744 * commit_time is increasing, it's the same journal, 777 * otherwise it is sta 745 * otherwise it is stale journal block, just end this 778 * recovery. 746 * recovery. 779 */ 747 */ 780 if (need_check_commit_ 748 if (need_check_commit_time) { 781 if (commit_tim 749 if (commit_time >= last_trans_commit_time) { 782 pr_err 750 pr_err("JBD2: Invalid checksum found in transaction %u\n", 783 751 next_commit_ID); 784 err = 752 err = -EFSBADCRC; 785 brelse 753 brelse(bh); 786 goto f 754 goto failed; 787 } 755 } 788 ignore_crc_mismatch: 756 ignore_crc_mismatch: 789 /* 757 /* 790 * It likely d 758 * It likely does not belong to same journal, 791 * just end th 759 * just end this recovery with success. 792 */ 760 */ 793 jbd2_debug(1, !! 761 jbd_debug(1, "JBD2: Invalid checksum ignored in transaction %u, likely stale data\n", 794 next 762 next_commit_ID); >> 763 err = 0; 795 brelse(bh); 764 brelse(bh); 796 goto done; 765 goto done; 797 } 766 } 798 767 799 /* 768 /* 800 * Found an expected c 769 * Found an expected commit block: if checksums 801 * are present, verify 770 * are present, verify them in PASS_SCAN; else not 802 * much to do other th 771 * much to do other than move on to the next sequence 803 * number. 772 * number. 804 */ 773 */ 805 if (pass == PASS_SCAN 774 if (pass == PASS_SCAN && 806 jbd2_has_feature_c 775 jbd2_has_feature_checksum(journal)) { 807 struct commit_ 776 struct commit_header *cbh = 808 (struc 777 (struct commit_header *)bh->b_data; 809 unsigned found 778 unsigned found_chksum = 810 be32_t 779 be32_to_cpu(cbh->h_chksum[0]); 811 780 812 if (info->end_ 781 if (info->end_transaction) { 813 journa 782 journal->j_failed_commit = 814 783 info->end_transaction; 815 brelse 784 brelse(bh); 816 break; 785 break; 817 } 786 } 818 787 819 /* Neither che 788 /* Neither checksum match nor unused? */ 820 if (!((crc32_s 789 if (!((crc32_sum == found_chksum && 821 cbh->h_ 790 cbh->h_chksum_type == 822 791 JBD2_CRC32_CHKSUM && 823 cbh->h_ 792 cbh->h_chksum_size == 824 793 JBD2_CRC32_CHKSUM_SIZE) || 825 (cbh->h_ 794 (cbh->h_chksum_type == 0 && 826 cbh->h_ 795 cbh->h_chksum_size == 0 && 827 found_c 796 found_chksum == 0))) 828 goto c 797 goto chksum_error; 829 798 830 crc32_sum = ~0 799 crc32_sum = ~0; 831 } 800 } 832 if (pass == PASS_SCAN 801 if (pass == PASS_SCAN && 833 !jbd2_commit_block 802 !jbd2_commit_block_csum_verify(journal, 834 803 bh->b_data)) { 835 if (jbd2_commi << 836 << 837 << 838 pr_not << 839 << 840 goto c << 841 } << 842 chksum_error: 804 chksum_error: 843 if (commit_tim 805 if (commit_time < last_trans_commit_time) 844 goto i 806 goto ignore_crc_mismatch; 845 info->end_tran 807 info->end_transaction = next_commit_ID; 846 info->head_blo << 847 808 848 if (!jbd2_has_ 809 if (!jbd2_has_feature_async_commit(journal)) { 849 journa 810 journal->j_failed_commit = 850 811 next_commit_ID; 851 brelse 812 brelse(bh); 852 break; 813 break; 853 } 814 } 854 } 815 } 855 if (pass == PASS_SCAN) !! 816 if (pass == PASS_SCAN) 856 chksum_ok: << 857 last_trans_com 817 last_trans_commit_time = commit_time; 858 head_block = n << 859 } << 860 brelse(bh); 818 brelse(bh); 861 next_commit_ID++; 819 next_commit_ID++; 862 continue; 820 continue; 863 821 864 case JBD2_REVOKE_BLOCK: 822 case JBD2_REVOKE_BLOCK: 865 /* 823 /* 866 * Check revoke block 824 * Check revoke block crc in pass_scan, if csum verify 867 * failed, check commi 825 * failed, check commit block time later. 868 */ 826 */ 869 if (pass == PASS_SCAN 827 if (pass == PASS_SCAN && 870 !jbd2_descriptor_b 828 !jbd2_descriptor_block_csum_verify(journal, 871 829 bh->b_data)) { 872 jbd2_debug(1, !! 830 jbd_debug(1, "JBD2: invalid revoke block found in %lu\n", 873 next 831 next_log_block); 874 need_check_com 832 need_check_commit_time = true; 875 } 833 } 876 << 877 /* If we aren't in the 834 /* If we aren't in the REVOKE pass, then we can 878 * just skip over this 835 * just skip over this block. */ 879 if (pass != PASS_REVOK 836 if (pass != PASS_REVOKE) { 880 brelse(bh); 837 brelse(bh); 881 continue; 838 continue; 882 } 839 } 883 840 884 err = scan_revoke_reco 841 err = scan_revoke_records(journal, bh, 885 842 next_commit_ID, info); 886 brelse(bh); 843 brelse(bh); 887 if (err) 844 if (err) 888 goto failed; 845 goto failed; 889 continue; 846 continue; 890 847 891 default: 848 default: 892 jbd2_debug(3, "Unrecog !! 849 jbd_debug(3, "Unrecognised magic %d, end of scan.\n", 893 blocktype); 850 blocktype); 894 brelse(bh); 851 brelse(bh); 895 goto done; 852 goto done; 896 } 853 } 897 } 854 } 898 855 899 done: 856 done: 900 /* 857 /* 901 * We broke out of the log scan loop: 858 * We broke out of the log scan loop: either we came to the 902 * known end of the log or we found an 859 * known end of the log or we found an unexpected block in the 903 * log. If the latter happened, then 860 * log. If the latter happened, then we know that the "current" 904 * transaction marks the end of the va 861 * transaction marks the end of the valid log. 905 */ 862 */ 906 863 907 if (pass == PASS_SCAN) { 864 if (pass == PASS_SCAN) { 908 if (!info->end_transaction) 865 if (!info->end_transaction) 909 info->end_transaction 866 info->end_transaction = next_commit_ID; 910 if (!info->head_block) << 911 info->head_block = hea << 912 } else { 867 } else { 913 /* It's really bad news if dif 868 /* It's really bad news if different passes end up at 914 * different places (but possi 869 * different places (but possible due to IO errors). */ 915 if (info->end_transaction != n 870 if (info->end_transaction != next_commit_ID) { 916 printk(KERN_ERR "JBD2: 871 printk(KERN_ERR "JBD2: recovery pass %d ended at " 917 "transaction % 872 "transaction %u, expected %u\n", 918 pass, next_com 873 pass, next_commit_ID, info->end_transaction); 919 if (!success) 874 if (!success) 920 success = -EIO 875 success = -EIO; 921 } 876 } 922 } 877 } 923 878 924 if (jbd2_has_feature_fast_commit(journ 879 if (jbd2_has_feature_fast_commit(journal) && pass != PASS_REVOKE) { 925 err = fc_do_one_pass(journal, 880 err = fc_do_one_pass(journal, info, pass); 926 if (err) 881 if (err) 927 success = err; 882 success = err; 928 } 883 } 929 884 930 if (block_error && success == 0) 885 if (block_error && success == 0) 931 success = -EIO; 886 success = -EIO; 932 return success; 887 return success; 933 888 934 failed: 889 failed: 935 return err; 890 return err; 936 } 891 } 937 892 938 /* Scan a revoke record, marking all blocks me 893 /* Scan a revoke record, marking all blocks mentioned as revoked. */ 939 894 940 static int scan_revoke_records(journal_t *jour 895 static int scan_revoke_records(journal_t *journal, struct buffer_head *bh, 941 tid_t sequence, 896 tid_t sequence, struct recovery_info *info) 942 { 897 { 943 jbd2_journal_revoke_header_t *header; 898 jbd2_journal_revoke_header_t *header; 944 int offset, max; 899 int offset, max; 945 unsigned csum_size = 0; !! 900 int csum_size = 0; 946 __u32 rcount; 901 __u32 rcount; 947 int record_len = 4; 902 int record_len = 4; 948 903 949 header = (jbd2_journal_revoke_header_t 904 header = (jbd2_journal_revoke_header_t *) bh->b_data; 950 offset = sizeof(jbd2_journal_revoke_he 905 offset = sizeof(jbd2_journal_revoke_header_t); 951 rcount = be32_to_cpu(header->r_count); 906 rcount = be32_to_cpu(header->r_count); 952 907 953 if (jbd2_journal_has_csum_v2or3(journa 908 if (jbd2_journal_has_csum_v2or3(journal)) 954 csum_size = sizeof(struct jbd2 909 csum_size = sizeof(struct jbd2_journal_block_tail); 955 if (rcount > journal->j_blocksize - cs 910 if (rcount > journal->j_blocksize - csum_size) 956 return -EINVAL; 911 return -EINVAL; 957 max = rcount; 912 max = rcount; 958 913 959 if (jbd2_has_feature_64bit(journal)) 914 if (jbd2_has_feature_64bit(journal)) 960 record_len = 8; 915 record_len = 8; 961 916 962 while (offset + record_len <= max) { 917 while (offset + record_len <= max) { 963 unsigned long long blocknr; 918 unsigned long long blocknr; 964 int err; 919 int err; 965 920 966 if (record_len == 4) 921 if (record_len == 4) 967 blocknr = be32_to_cpu( 922 blocknr = be32_to_cpu(* ((__be32 *) (bh->b_data+offset))); 968 else 923 else 969 blocknr = be64_to_cpu( 924 blocknr = be64_to_cpu(* ((__be64 *) (bh->b_data+offset))); 970 offset += record_len; 925 offset += record_len; 971 err = jbd2_journal_set_revoke( 926 err = jbd2_journal_set_revoke(journal, blocknr, sequence); 972 if (err) 927 if (err) 973 return err; 928 return err; 974 ++info->nr_revokes; 929 ++info->nr_revokes; 975 } 930 } 976 return 0; 931 return 0; 977 } 932 } 978 933
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.