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

1 // SPDX-License-Identifier: GPL-2.0+
7 * Copyright 1999-2000 Red Hat Software --- All Rights Reserved
41 struct recovery_info *info, enum passtype pass);
50 while (--n >= 0) in journal_brelse_array()
63 * the readahead size, though. 128K is a purely arbitrary, good-enough
77 max = start + (128 * 1024 / journal->j_blocksize); in do_readahead()
78 if (max > journal->j_total_len) in do_readahead()
79 max = journal->j_total_len; in do_readahead()
95 bh = __getblk(journal->j_dev, blocknr, journal->j_blocksize); in do_readahead()
134 if (offset >= journal->j_total_len) { in jread()
136 return -EFSCORRUPTED; in jread()
147 bh = __getblk(journal->j_dev, blocknr, journal->j_blocksize); in jread()
149 return -ENOMEM; in jread()
168 return -EIO; in jread()
182 return 1; in jbd2_descriptor_block_csum_verify()
185 j->j_blocksize - sizeof(struct jbd2_journal_block_tail)); in jbd2_descriptor_block_csum_verify()
186 provided = tail->t_checksum; in jbd2_descriptor_block_csum_verify()
187 tail->t_checksum = 0; in jbd2_descriptor_block_csum_verify()
188 calculated = jbd2_chksum(j, j->j_csum_seed, buf, j->j_blocksize); in jbd2_descriptor_block_csum_verify()
189 tail->t_checksum = provided; in jbd2_descriptor_block_csum_verify()
195 * Count the number of in-use tags in a journal descriptor block.
202 int nr = 0, size = journal->j_blocksize; in count_tags()
206 size -= sizeof(struct jbd2_journal_block_tail); in count_tags()
208 tagp = &bh->b_data[sizeof(journal_header_t)]; in count_tags()
210 while ((tagp - bh->b_data + tag_bytes) <= size) { in count_tags()
229 if (var >= (journal)->j_last) \
230 var -= ((journal)->j_last - (journal)->j_first); \
234 struct recovery_info *info, enum passtype pass) in fc_do_one_pass() argument
236 unsigned int expected_commit_id = info->end_transaction; in fc_do_one_pass()
241 next_fc_block = journal->j_fc_first; in fc_do_one_pass()
242 if (!journal->j_fc_replay_callback) in fc_do_one_pass()
245 while (next_fc_block <= journal->j_fc_last) { in fc_do_one_pass()
254 err = journal->j_fc_replay_callback(journal, bh, pass, in fc_do_one_pass()
255 next_fc_block - journal->j_fc_first, in fc_do_one_pass()
271 * jbd2_journal_recover - recovers a on-disk journal
277 * Recovery is done in three passes. In the first pass, we look for the
279 * blocks. In the third and final pass, we replay any un-revoked blocks
292 * unmounted. We use its in-memory version j_tail here because in jbd2_journal_recover()
296 if (!journal->j_tail) { in jbd2_journal_recover()
297 journal_superblock_t *sb = journal->j_superblock; in jbd2_journal_recover()
299 jbd2_debug(1, "No recovery required, last transaction %d, head block %u\n", in jbd2_journal_recover()
300 be32_to_cpu(sb->s_sequence), be32_to_cpu(sb->s_head)); in jbd2_journal_recover()
301 journal->j_transaction_sequence = be32_to_cpu(sb->s_sequence) + 1; in jbd2_journal_recover()
302 journal->j_head = be32_to_cpu(sb->s_head); in jbd2_journal_recover()
312 jbd2_debug(1, "JBD2: recovery, exit status %d, " in jbd2_journal_recover()
315 jbd2_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()
321 journal->j_head = info.head_block; in jbd2_journal_recover()
322 jbd2_debug(1, "JBD2: last transaction %d, head block %lu\n", in jbd2_journal_recover()
323 journal->j_transaction_sequence, journal->j_head); in jbd2_journal_recover()
327 if (journal->j_revoke != journal->j_revoke_table[0] && in jbd2_journal_recover()
328 journal->j_revoke != journal->j_revoke_table[1]) { in jbd2_journal_recover()
329 jbd2_journal_destroy_revoke_table(journal->j_revoke); in jbd2_journal_recover()
330 journal->j_revoke = journal->j_revoke_table[1]; in jbd2_journal_recover()
332 err2 = sync_blockdev(journal->j_fs_dev); in jbd2_journal_recover()
339 if (journal->j_flags & JBD2_BARRIER) { in jbd2_journal_recover()
340 err2 = blkdev_issue_flush(journal->j_fs_dev); in jbd2_journal_recover()
348 * jbd2_journal_skip_recovery - Start journal and wipe exiting records
356 * We perform one pass over the journal to allow us to tell the user how
372 ++journal->j_transaction_sequence; in jbd2_journal_skip_recovery()
373 journal->j_head = journal->j_first; in jbd2_journal_skip_recovery()
376 int dropped = info.end_transaction - in jbd2_journal_skip_recovery()
377 be32_to_cpu(journal->j_superblock->s_sequence); in jbd2_journal_skip_recovery()
378 jbd2_debug(1, in jbd2_journal_skip_recovery()
382 journal->j_transaction_sequence = ++info.end_transaction; in jbd2_journal_skip_recovery()
383 journal->j_head = info.head_block; in jbd2_journal_skip_recovery()
386 journal->j_tail = 0; in jbd2_journal_skip_recovery()
393 unsigned long long block = be32_to_cpu(tag->t_blocknr); in read_tag_block()
395 block |= (u64)be32_to_cpu(tag->t_blocknr_high) << 32; in read_tag_block()
412 *crc32_sum = crc32_be(*crc32_sum, (void *)bh->b_data, bh->b_size); in calc_chksums()
421 return 1; in calc_chksums()
423 *crc32_sum = crc32_be(*crc32_sum, (void *)obh->b_data, in calc_chksums()
424 obh->b_size); in calc_chksums()
438 return 1; in jbd2_commit_block_csum_verify()
441 provided = h->h_chksum[0]; in jbd2_commit_block_csum_verify()
442 h->h_chksum[0] = 0; in jbd2_commit_block_csum_verify()
443 calculated = jbd2_chksum(j, j->j_csum_seed, buf, j->j_blocksize); in jbd2_commit_block_csum_verify()
444 h->h_chksum[0] = provided; in jbd2_commit_block_csum_verify()
456 tmpbuf = kzalloc(j->j_blocksize, GFP_KERNEL); in jbd2_commit_block_csum_verify_partial()
462 provided = h->h_chksum[0]; in jbd2_commit_block_csum_verify_partial()
463 h->h_chksum[0] = 0; in jbd2_commit_block_csum_verify_partial()
464 calculated = jbd2_chksum(j, j->j_csum_seed, tmpbuf, j->j_blocksize); in jbd2_commit_block_csum_verify_partial()
478 return 1; in jbd2_block_tag_csum_verify()
481 csum32 = jbd2_chksum(j, j->j_csum_seed, (__u8 *)&seq, sizeof(seq)); in jbd2_block_tag_csum_verify()
482 csum32 = jbd2_chksum(j, csum32, buf, j->j_blocksize); in jbd2_block_tag_csum_verify()
485 return tag3->t_checksum == cpu_to_be32(csum32); in jbd2_block_tag_csum_verify()
487 return tag->t_checksum == cpu_to_be16(csum32); in jbd2_block_tag_csum_verify()
509 tagp = &bh->b_data[sizeof(journal_header_t)]; in jbd2_do_replay()
510 while (tagp - bh->b_data + tag_bytes <= in jbd2_do_replay()
511 journal->j_blocksize - descr_csum_size) { in jbd2_do_replay()
535 ++info->nr_revoke_hits; in jbd2_do_replay()
542 obh->b_data, next_commit_ID)) { in jbd2_do_replay()
544 ret = -EFSBADCRC; in jbd2_do_replay()
551 nbh = __getblk(journal->j_fs_dev, blocknr, in jbd2_do_replay()
552 journal->j_blocksize); in jbd2_do_replay()
556 return -ENOMEM; in jbd2_do_replay()
560 memcpy(nbh->b_data, obh->b_data, journal->j_blocksize); in jbd2_do_replay()
562 *((__be32 *)nbh->b_data) = in jbd2_do_replay()
570 ++info->nr_replays; in jbd2_do_replay()
589 struct recovery_info *info, enum passtype pass) in do_one_pass() argument
609 sb = journal->j_superblock; in do_one_pass()
610 next_commit_ID = be32_to_cpu(sb->s_sequence); in do_one_pass()
611 next_log_block = be32_to_cpu(sb->s_start); in do_one_pass()
615 if (pass == PASS_SCAN) in do_one_pass()
616 info->start_transaction = first_commit_ID; in do_one_pass()
617 else if (pass == PASS_REVOKE) { in do_one_pass()
622 if (info->nr_revokes > JOURNAL_REVOKE_DEFAULT_HASH * 16) { in do_one_pass()
626 * Aim for average chain length of 8, limit at 1M in do_one_pass()
630 hash_size = min(roundup_pow_of_two(info->nr_revokes / 8), in do_one_pass()
631 1U << 20); in do_one_pass()
632 journal->j_revoke = in do_one_pass()
634 if (!journal->j_revoke) { in do_one_pass()
638 journal->j_revoke = journal->j_revoke_table[1]; in do_one_pass()
643 jbd2_debug(1, "Starting recovery pass %d\n", pass); in do_one_pass()
652 while (1) { in do_one_pass()
659 if (pass != PASS_SCAN) in do_one_pass()
660 if (tid_geq(next_commit_ID, info->end_transaction)) in do_one_pass()
664 next_commit_ID, next_log_block, journal->j_last); in do_one_pass()
686 tmp = (journal_header_t *)bh->b_data; in do_one_pass()
688 if (tmp->h_magic != cpu_to_be32(JBD2_MAGIC_NUMBER)) in do_one_pass()
691 blocktype = be32_to_cpu(tmp->h_blocktype); in do_one_pass()
692 sequence = be32_to_cpu(tmp->h_sequence); in do_one_pass()
701 * to do with it? That depends on the pass... */ in do_one_pass()
707 bh->b_data)) { in do_one_pass()
712 if (pass != PASS_SCAN) { in do_one_pass()
715 err = -EFSBADCRC; in do_one_pass()
719 jbd2_debug(1, in do_one_pass()
725 * in pass REPLAY; if journal_checksums enabled, then in do_one_pass()
728 if (pass != PASS_REPLAY) { in do_one_pass()
729 if (pass == PASS_SCAN && in do_one_pass()
731 !info->end_transaction) { in do_one_pass()
751 if (err == -ENOMEM) in do_one_pass()
759 if (pass != PASS_SCAN) { in do_one_pass()
777 * {(n+1)th transanction} in do_one_pass()
787 * and (n+1)th interrupted interrupted in do_one_pass()
795 ((struct commit_header *)bh->b_data)->h_commit_sec); in do_one_pass()
807 err = -EFSBADCRC; in do_one_pass()
815 jbd2_debug(1, "JBD2: Invalid checksum ignored in transaction %u, likely stale data\n", in do_one_pass()
828 (struct commit_header *)bh->b_data; in do_one_pass()
830 be32_to_cpu(cbh->h_chksum[0]); in do_one_pass()
832 if (info->end_transaction) { in do_one_pass()
833 journal->j_failed_commit = in do_one_pass()
834 info->end_transaction; in do_one_pass()
840 cbh->h_chksum_type == in do_one_pass()
842 cbh->h_chksum_size == in do_one_pass()
844 (cbh->h_chksum_type == 0 && in do_one_pass()
845 cbh->h_chksum_size == 0 && in do_one_pass()
853 if (jbd2_commit_block_csum_verify(journal, bh->b_data)) in do_one_pass()
857 bh->b_data)) { in do_one_pass()
866 info->end_transaction = next_commit_ID; in do_one_pass()
867 info->head_block = head_block; in do_one_pass()
870 journal->j_failed_commit = next_commit_ID; in do_one_pass()
882 * If we aren't in the SCAN or REVOKE pass, then we can in do_one_pass()
885 if (pass != PASS_REVOKE && pass != PASS_SCAN) in do_one_pass()
892 if (pass == PASS_SCAN && in do_one_pass()
894 bh->b_data)) { in do_one_pass()
895 jbd2_debug(1, "JBD2: invalid revoke block found in %lu\n", in do_one_pass()
900 err = scan_revoke_records(journal, pass, bh, in do_one_pass()
922 if (pass == PASS_SCAN) { in do_one_pass()
923 if (!info->end_transaction) in do_one_pass()
924 info->end_transaction = next_commit_ID; in do_one_pass()
925 if (!info->head_block) in do_one_pass()
926 info->head_block = head_block; in do_one_pass()
930 if (info->end_transaction != next_commit_ID) { in do_one_pass()
931 printk(KERN_ERR "JBD2: recovery pass %d ended at " in do_one_pass()
933 pass, next_commit_ID, info->end_transaction); in do_one_pass()
935 success = -EIO; in do_one_pass()
939 if (jbd2_has_feature_fast_commit(journal) && pass != PASS_REVOKE) { in do_one_pass()
940 err = fc_do_one_pass(journal, info, pass); in do_one_pass()
954 static int scan_revoke_records(journal_t *journal, enum passtype pass, in scan_revoke_records() argument
964 header = (jbd2_journal_revoke_header_t *) bh->b_data; in scan_revoke_records()
966 rcount = be32_to_cpu(header->r_count); in scan_revoke_records()
970 if (rcount > journal->j_blocksize - csum_size) in scan_revoke_records()
971 return -EINVAL; in scan_revoke_records()
977 if (pass == PASS_SCAN) { in scan_revoke_records()
978 info->nr_revokes += (max - offset) / record_len; in scan_revoke_records()
987 blocknr = be32_to_cpu(* ((__be32 *) (bh->b_data+offset))); in scan_revoke_records()
989 blocknr = be64_to_cpu(* ((__be64 *) (bh->b_data+offset))); in scan_revoke_records()