Lines Matching +full:pass +full:- +full:1

1 // SPDX-License-Identifier: GPL-2.0+
7 * Copyright 1999-2000 Red Hat Software --- All Rights Reserved
39 struct recovery_info *info, enum passtype pass);
48 while (--n >= 0) in journal_brelse_array()
61 * the readahead size, though. 128K is a purely arbitrary, good-enough
76 max = start + (128 * 1024 / journal->j_blocksize); in do_readahead()
77 if (max > journal->j_total_len) in do_readahead()
78 max = journal->j_total_len; in do_readahead()
94 bh = __getblk(journal->j_dev, blocknr, journal->j_blocksize); in do_readahead()
96 err = -ENOMEM; in do_readahead()
137 if (offset >= journal->j_total_len) { in jread()
139 return -EFSCORRUPTED; in jread()
150 bh = __getblk(journal->j_dev, blocknr, journal->j_blocksize); in jread()
152 return -ENOMEM; in jread()
166 return -EIO; in jread()
180 return 1; in jbd2_descriptor_block_csum_verify()
183 j->j_blocksize - sizeof(struct jbd2_journal_block_tail)); in jbd2_descriptor_block_csum_verify()
184 provided = tail->t_checksum; in jbd2_descriptor_block_csum_verify()
185 tail->t_checksum = 0; in jbd2_descriptor_block_csum_verify()
186 calculated = jbd2_chksum(j, j->j_csum_seed, buf, j->j_blocksize); in jbd2_descriptor_block_csum_verify()
187 tail->t_checksum = provided; in jbd2_descriptor_block_csum_verify()
193 * Count the number of in-use tags in a journal descriptor block.
200 int nr = 0, size = journal->j_blocksize; in count_tags()
204 size -= sizeof(struct jbd2_journal_block_tail); in count_tags()
206 tagp = &bh->b_data[sizeof(journal_header_t)]; in count_tags()
208 while ((tagp - bh->b_data + tag_bytes) <= size) { in count_tags()
229 (journal)->j_fc_last : (journal)->j_last; \
232 var -= (_wrap_last - (journal)->j_first); \
236 struct recovery_info *info, enum passtype pass) in fc_do_one_pass() argument
238 unsigned int expected_commit_id = info->end_transaction; in fc_do_one_pass()
243 next_fc_block = journal->j_fc_first; in fc_do_one_pass()
244 if (!journal->j_fc_replay_callback) in fc_do_one_pass()
247 while (next_fc_block <= journal->j_fc_last) { in fc_do_one_pass()
256 err = journal->j_fc_replay_callback(journal, bh, pass, in fc_do_one_pass()
257 next_fc_block - journal->j_fc_first, in fc_do_one_pass()
272 * jbd2_journal_recover - recovers a on-disk journal
278 * Recovery is done in three passes. In the first pass, we look for the
280 * blocks. In the third and final pass, we replay any un-revoked blocks
291 sb = journal->j_superblock; in jbd2_journal_recover()
299 if (!sb->s_start) { in jbd2_journal_recover()
300 jbd_debug(1, "No recovery required, last transaction %d\n", in jbd2_journal_recover()
301 be32_to_cpu(sb->s_sequence)); in jbd2_journal_recover()
302 journal->j_transaction_sequence = be32_to_cpu(sb->s_sequence) + 1; in jbd2_journal_recover()
312 jbd_debug(1, "JBD2: recovery, exit status %d, " in jbd2_journal_recover()
315 jbd_debug(1, "JBD2: Replayed %d and revoked %d/%d blocks\n", in jbd2_journal_recover()
320 journal->j_transaction_sequence = ++info.end_transaction; in jbd2_journal_recover()
323 err2 = sync_blockdev(journal->j_fs_dev); in jbd2_journal_recover()
327 if (journal->j_flags & JBD2_BARRIER) { in jbd2_journal_recover()
328 err2 = blkdev_issue_flush(journal->j_fs_dev); in jbd2_journal_recover()
336 * jbd2_journal_skip_recovery - Start journal and wipe exiting records
344 * We perform one pass over the journal to allow us to tell the user how
360 ++journal->j_transaction_sequence; in jbd2_journal_skip_recovery()
363 int dropped = info.end_transaction - in jbd2_journal_skip_recovery()
364 be32_to_cpu(journal->j_superblock->s_sequence); in jbd2_journal_skip_recovery()
365 jbd_debug(1, in jbd2_journal_skip_recovery()
367 dropped, (dropped == 1) ? "" : "s"); in jbd2_journal_skip_recovery()
369 journal->j_transaction_sequence = ++info.end_transaction; in jbd2_journal_skip_recovery()
372 journal->j_tail = 0; in jbd2_journal_skip_recovery()
379 unsigned long long block = be32_to_cpu(tag->t_blocknr); in read_tag_block()
381 block |= (u64)be32_to_cpu(tag->t_blocknr_high) << 32; in read_tag_block()
398 *crc32_sum = crc32_be(*crc32_sum, (void *)bh->b_data, bh->b_size); in calc_chksums()
407 return 1; in calc_chksums()
409 *crc32_sum = crc32_be(*crc32_sum, (void *)obh->b_data, in calc_chksums()
410 obh->b_size); in calc_chksums()
424 return 1; in jbd2_commit_block_csum_verify()
427 provided = h->h_chksum[0]; in jbd2_commit_block_csum_verify()
428 h->h_chksum[0] = 0; in jbd2_commit_block_csum_verify()
429 calculated = jbd2_chksum(j, j->j_csum_seed, buf, j->j_blocksize); in jbd2_commit_block_csum_verify()
430 h->h_chksum[0] = provided; in jbd2_commit_block_csum_verify()
443 return 1; in jbd2_block_tag_csum_verify()
446 csum32 = jbd2_chksum(j, j->j_csum_seed, (__u8 *)&seq, sizeof(seq)); in jbd2_block_tag_csum_verify()
447 csum32 = jbd2_chksum(j, csum32, buf, j->j_blocksize); in jbd2_block_tag_csum_verify()
450 return tag3->t_checksum == cpu_to_be32(csum32); in jbd2_block_tag_csum_verify()
452 return tag->t_checksum == cpu_to_be16(csum32); in jbd2_block_tag_csum_verify()
456 struct recovery_info *info, enum passtype pass) in do_one_pass() argument
479 sb = journal->j_superblock; in do_one_pass()
480 next_commit_ID = be32_to_cpu(sb->s_sequence); in do_one_pass()
481 next_log_block = be32_to_cpu(sb->s_start); in do_one_pass()
484 if (pass == PASS_SCAN) in do_one_pass()
485 info->start_transaction = first_commit_ID; in do_one_pass()
487 jbd_debug(1, "Starting recovery pass %d\n", pass); in do_one_pass()
496 while (1) { in do_one_pass()
509 if (pass != PASS_SCAN) in do_one_pass()
510 if (tid_geq(next_commit_ID, info->end_transaction)) in do_one_pass()
516 journal->j_fc_last : journal->j_last); in do_one_pass()
536 tmp = (journal_header_t *)bh->b_data; in do_one_pass()
538 if (tmp->h_magic != cpu_to_be32(JBD2_MAGIC_NUMBER)) { in do_one_pass()
543 blocktype = be32_to_cpu(tmp->h_blocktype); in do_one_pass()
544 sequence = be32_to_cpu(tmp->h_sequence); in do_one_pass()
555 * to do with it? That depends on the pass... */ in do_one_pass()
565 bh->b_data)) { in do_one_pass()
570 if (pass != PASS_SCAN) { in do_one_pass()
573 err = -EFSBADCRC; in do_one_pass()
578 jbd_debug(1, in do_one_pass()
584 * in pass REPLAY; if journal_checksums enabled, then in do_one_pass()
587 if (pass != PASS_REPLAY) { in do_one_pass()
588 if (pass == PASS_SCAN && in do_one_pass()
591 !info->end_transaction) { in do_one_pass()
611 tagp = &bh->b_data[sizeof(journal_header_t)]; in do_one_pass()
612 while ((tagp - bh->b_data + tag_bytes) in do_one_pass()
613 <= journal->j_blocksize - descr_csum_size) { in do_one_pass()
644 ++info->nr_revoke_hits; in do_one_pass()
651 obh->b_data, be32_to_cpu(tmp->h_sequence))) { in do_one_pass()
653 success = -EFSBADCRC; in do_one_pass()
658 block_error = 1; in do_one_pass()
664 nbh = __getblk(journal->j_fs_dev, in do_one_pass()
666 journal->j_blocksize); in do_one_pass()
671 err = -ENOMEM; in do_one_pass()
678 memcpy(nbh->b_data, obh->b_data, in do_one_pass()
679 journal->j_blocksize); in do_one_pass()
681 *((__be32 *)nbh->b_data) = in do_one_pass()
689 ++info->nr_replays; in do_one_pass()
690 /* ll_rw_block(WRITE, 1, &nbh); */ in do_one_pass()
722 * {(n+1)th transanction} in do_one_pass()
732 * and (n+1)th interrupted interrupted in do_one_pass()
740 ((struct commit_header *)bh->b_data)->h_commit_sec); in do_one_pass()
752 err = -EFSBADCRC; in do_one_pass()
761 jbd_debug(1, "JBD2: Invalid checksum ignored in transaction %u, likely stale data\n", in do_one_pass()
773 if (pass == PASS_SCAN && in do_one_pass()
776 (struct commit_header *)bh->b_data; in do_one_pass()
778 be32_to_cpu(cbh->h_chksum[0]); in do_one_pass()
780 if (info->end_transaction) { in do_one_pass()
781 journal->j_failed_commit = in do_one_pass()
782 info->end_transaction; in do_one_pass()
789 cbh->h_chksum_type == in do_one_pass()
791 cbh->h_chksum_size == in do_one_pass()
793 (cbh->h_chksum_type == 0 && in do_one_pass()
794 cbh->h_chksum_size == 0 && in do_one_pass()
800 if (pass == PASS_SCAN && in do_one_pass()
802 bh->b_data)) { in do_one_pass()
806 info->end_transaction = next_commit_ID; in do_one_pass()
809 journal->j_failed_commit = in do_one_pass()
815 if (pass == PASS_SCAN) in do_one_pass()
826 if (pass == PASS_SCAN && in do_one_pass()
828 bh->b_data)) { in do_one_pass()
829 jbd_debug(1, "JBD2: invalid revoke block found in %lu\n", in do_one_pass()
833 /* If we aren't in the REVOKE pass, then we can in do_one_pass()
835 if (pass != PASS_REVOKE) { in do_one_pass()
863 if (pass == PASS_SCAN) { in do_one_pass()
864 if (!info->end_transaction) in do_one_pass()
865 info->end_transaction = next_commit_ID; in do_one_pass()
869 if (info->end_transaction != next_commit_ID) { in do_one_pass()
870 printk(KERN_ERR "JBD2: recovery pass %d ended at " in do_one_pass()
872 pass, next_commit_ID, info->end_transaction); in do_one_pass()
874 success = -EIO; in do_one_pass()
878 if (jbd2_has_feature_fast_commit(journal) && pass != PASS_REVOKE) { in do_one_pass()
879 err = fc_do_one_pass(journal, info, pass); in do_one_pass()
885 success = -EIO; in do_one_pass()
903 header = (jbd2_journal_revoke_header_t *) bh->b_data; in scan_revoke_records()
905 rcount = be32_to_cpu(header->r_count); in scan_revoke_records()
909 if (rcount > journal->j_blocksize - csum_size) in scan_revoke_records()
910 return -EINVAL; in scan_revoke_records()
921 blocknr = be32_to_cpu(* ((__be32 *) (bh->b_data+offset))); in scan_revoke_records()
923 blocknr = be64_to_cpu(* ((__be64 *) (bh->b_data+offset))); in scan_revoke_records()
928 ++info->nr_revokes; in scan_revoke_records()