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
78 max = start + (128 * 1024 / journal->j_blocksize); in do_readahead()
79 if (max > journal->j_total_len) in do_readahead()
80 max = journal->j_total_len; in do_readahead()
96 bh = __getblk(journal->j_dev, blocknr, journal->j_blocksize); in do_readahead()
98 err = -ENOMEM; in do_readahead()
139 if (offset >= journal->j_total_len) { in jread()
141 return -EFSCORRUPTED; in jread()
152 bh = __getblk(journal->j_dev, blocknr, journal->j_blocksize); in jread()
154 return -ENOMEM; in jread()
173 return -EIO; in jread()
187 return 1; in jbd2_descriptor_block_csum_verify()
190 j->j_blocksize - sizeof(struct jbd2_journal_block_tail)); in jbd2_descriptor_block_csum_verify()
191 provided = tail->t_checksum; in jbd2_descriptor_block_csum_verify()
192 tail->t_checksum = 0; in jbd2_descriptor_block_csum_verify()
193 calculated = jbd2_chksum(j, j->j_csum_seed, buf, j->j_blocksize); in jbd2_descriptor_block_csum_verify()
194 tail->t_checksum = provided; in jbd2_descriptor_block_csum_verify()
200 * Count the number of in-use tags in a journal descriptor block.
207 int nr = 0, size = journal->j_blocksize; in count_tags()
211 size -= sizeof(struct jbd2_journal_block_tail); in count_tags()
213 tagp = &bh->b_data[sizeof(journal_header_t)]; in count_tags()
215 while ((tagp - bh->b_data + tag_bytes) <= size) { in count_tags()
234 if (var >= (journal)->j_last) \
235 var -= ((journal)->j_last - (journal)->j_first); \
239 struct recovery_info *info, enum passtype pass) in fc_do_one_pass() argument
241 unsigned int expected_commit_id = info->end_transaction; in fc_do_one_pass()
246 next_fc_block = journal->j_fc_first; in fc_do_one_pass()
247 if (!journal->j_fc_replay_callback) in fc_do_one_pass()
250 while (next_fc_block <= journal->j_fc_last) { in fc_do_one_pass()
259 err = journal->j_fc_replay_callback(journal, bh, pass, in fc_do_one_pass()
260 next_fc_block - journal->j_fc_first, in fc_do_one_pass()
276 * jbd2_journal_recover - recovers a on-disk journal
282 * Recovery is done in three passes. In the first pass, we look for the
284 * blocks. In the third and final pass, we replay any un-revoked blocks
295 sb = journal->j_superblock; in jbd2_journal_recover()
302 if (!sb->s_start) { in jbd2_journal_recover()
303 jbd2_debug(1, "No recovery required, last transaction %d, head block %u\n", in jbd2_journal_recover()
304 be32_to_cpu(sb->s_sequence), be32_to_cpu(sb->s_head)); in jbd2_journal_recover()
305 journal->j_transaction_sequence = be32_to_cpu(sb->s_sequence) + 1; in jbd2_journal_recover()
306 journal->j_head = be32_to_cpu(sb->s_head); in jbd2_journal_recover()
316 jbd2_debug(1, "JBD2: recovery, exit status %d, " in jbd2_journal_recover()
319 jbd2_debug(1, "JBD2: Replayed %d and revoked %d/%d blocks\n", in jbd2_journal_recover()
324 journal->j_transaction_sequence = ++info.end_transaction; in jbd2_journal_recover()
325 journal->j_head = info.head_block; in jbd2_journal_recover()
326 jbd2_debug(1, "JBD2: last transaction %d, head block %lu\n", in jbd2_journal_recover()
327 journal->j_transaction_sequence, journal->j_head); in jbd2_journal_recover()
330 err2 = sync_blockdev(journal->j_fs_dev); in jbd2_journal_recover()
337 if (journal->j_flags & JBD2_BARRIER) { in jbd2_journal_recover()
338 err2 = blkdev_issue_flush(journal->j_fs_dev); in jbd2_journal_recover()
346 * jbd2_journal_skip_recovery - Start journal and wipe exiting records
354 * We perform one pass over the journal to allow us to tell the user how
370 ++journal->j_transaction_sequence; in jbd2_journal_skip_recovery()
371 journal->j_head = journal->j_first; in jbd2_journal_skip_recovery()
374 int dropped = info.end_transaction - in jbd2_journal_skip_recovery()
375 be32_to_cpu(journal->j_superblock->s_sequence); in jbd2_journal_skip_recovery()
376 jbd2_debug(1, in jbd2_journal_skip_recovery()
380 journal->j_transaction_sequence = ++info.end_transaction; in jbd2_journal_skip_recovery()
381 journal->j_head = info.head_block; in jbd2_journal_skip_recovery()
384 journal->j_tail = 0; in jbd2_journal_skip_recovery()
391 unsigned long long block = be32_to_cpu(tag->t_blocknr); in read_tag_block()
393 block |= (u64)be32_to_cpu(tag->t_blocknr_high) << 32; in read_tag_block()
410 *crc32_sum = crc32_be(*crc32_sum, (void *)bh->b_data, bh->b_size); in calc_chksums()
419 return 1; in calc_chksums()
421 *crc32_sum = crc32_be(*crc32_sum, (void *)obh->b_data, in calc_chksums()
422 obh->b_size); in calc_chksums()
436 return 1; in jbd2_commit_block_csum_verify()
439 provided = h->h_chksum[0]; in jbd2_commit_block_csum_verify()
440 h->h_chksum[0] = 0; in jbd2_commit_block_csum_verify()
441 calculated = jbd2_chksum(j, j->j_csum_seed, buf, j->j_blocksize); in jbd2_commit_block_csum_verify()
442 h->h_chksum[0] = provided; in jbd2_commit_block_csum_verify()
454 tmpbuf = kzalloc(j->j_blocksize, GFP_KERNEL); in jbd2_commit_block_csum_verify_partial()
460 provided = h->h_chksum[0]; in jbd2_commit_block_csum_verify_partial()
461 h->h_chksum[0] = 0; in jbd2_commit_block_csum_verify_partial()
462 calculated = jbd2_chksum(j, j->j_csum_seed, tmpbuf, j->j_blocksize); in jbd2_commit_block_csum_verify_partial()
476 return 1; in jbd2_block_tag_csum_verify()
479 csum32 = jbd2_chksum(j, j->j_csum_seed, (__u8 *)&seq, sizeof(seq)); in jbd2_block_tag_csum_verify()
480 csum32 = jbd2_chksum(j, csum32, buf, j->j_blocksize); in jbd2_block_tag_csum_verify()
483 return tag3->t_checksum == cpu_to_be32(csum32); in jbd2_block_tag_csum_verify()
485 return tag->t_checksum == cpu_to_be16(csum32); in jbd2_block_tag_csum_verify()
489 struct recovery_info *info, enum passtype pass) in do_one_pass() argument
512 sb = journal->j_superblock; in do_one_pass()
513 next_commit_ID = be32_to_cpu(sb->s_sequence); in do_one_pass()
514 next_log_block = be32_to_cpu(sb->s_start); in do_one_pass()
518 if (pass == PASS_SCAN) in do_one_pass()
519 info->start_transaction = first_commit_ID; in do_one_pass()
521 jbd2_debug(1, "Starting recovery pass %d\n", pass); in do_one_pass()
530 while (1) { in do_one_pass()
543 if (pass != PASS_SCAN) in do_one_pass()
544 if (tid_geq(next_commit_ID, info->end_transaction)) in do_one_pass()
548 next_commit_ID, next_log_block, journal->j_last); in do_one_pass()
568 tmp = (journal_header_t *)bh->b_data; in do_one_pass()
570 if (tmp->h_magic != cpu_to_be32(JBD2_MAGIC_NUMBER)) { in do_one_pass()
575 blocktype = be32_to_cpu(tmp->h_blocktype); in do_one_pass()
576 sequence = be32_to_cpu(tmp->h_sequence); in do_one_pass()
587 * to do with it? That depends on the pass... */ in do_one_pass()
597 bh->b_data)) { in do_one_pass()
602 if (pass != PASS_SCAN) { in do_one_pass()
605 err = -EFSBADCRC; in do_one_pass()
610 jbd2_debug(1, in do_one_pass()
616 * in pass REPLAY; if journal_checksums enabled, then in do_one_pass()
619 if (pass != PASS_REPLAY) { in do_one_pass()
620 if (pass == PASS_SCAN && in do_one_pass()
623 !info->end_transaction) { in do_one_pass()
643 tagp = &bh->b_data[sizeof(journal_header_t)]; in do_one_pass()
644 while ((tagp - bh->b_data + tag_bytes) in do_one_pass()
645 <= journal->j_blocksize - descr_csum_size) { in do_one_pass()
676 ++info->nr_revoke_hits; in do_one_pass()
683 obh->b_data, be32_to_cpu(tmp->h_sequence))) { in do_one_pass()
685 success = -EFSBADCRC; in do_one_pass()
691 block_error = 1; in do_one_pass()
697 nbh = __getblk(journal->j_fs_dev, in do_one_pass()
699 journal->j_blocksize); in do_one_pass()
704 err = -ENOMEM; in do_one_pass()
711 memcpy(nbh->b_data, obh->b_data, in do_one_pass()
712 journal->j_blocksize); in do_one_pass()
714 *((__be32 *)nbh->b_data) = in do_one_pass()
722 ++info->nr_replays; in do_one_pass()
754 * {(n+1)th transanction} in do_one_pass()
764 * and (n+1)th interrupted interrupted in do_one_pass()
772 ((struct commit_header *)bh->b_data)->h_commit_sec); in do_one_pass()
784 err = -EFSBADCRC; in do_one_pass()
793 jbd2_debug(1, "JBD2: Invalid checksum ignored in transaction %u, likely stale data\n", in do_one_pass()
805 if (pass == PASS_SCAN && in do_one_pass()
808 (struct commit_header *)bh->b_data; in do_one_pass()
810 be32_to_cpu(cbh->h_chksum[0]); in do_one_pass()
812 if (info->end_transaction) { in do_one_pass()
813 journal->j_failed_commit = in do_one_pass()
814 info->end_transaction; in do_one_pass()
821 cbh->h_chksum_type == in do_one_pass()
823 cbh->h_chksum_size == in do_one_pass()
825 (cbh->h_chksum_type == 0 && in do_one_pass()
826 cbh->h_chksum_size == 0 && in do_one_pass()
832 if (pass == PASS_SCAN && in do_one_pass()
834 bh->b_data)) { in do_one_pass()
837 bh->b_data)) { in do_one_pass()
845 info->end_transaction = next_commit_ID; in do_one_pass()
846 info->head_block = head_block; in do_one_pass()
849 journal->j_failed_commit = in do_one_pass()
855 if (pass == PASS_SCAN) { in do_one_pass()
869 if (pass == PASS_SCAN && in do_one_pass()
871 bh->b_data)) { in do_one_pass()
872 jbd2_debug(1, "JBD2: invalid revoke block found in %lu\n", in do_one_pass()
877 /* If we aren't in the REVOKE pass, then we can in do_one_pass()
879 if (pass != PASS_REVOKE) { in do_one_pass()
907 if (pass == PASS_SCAN) { in do_one_pass()
908 if (!info->end_transaction) in do_one_pass()
909 info->end_transaction = next_commit_ID; in do_one_pass()
910 if (!info->head_block) in do_one_pass()
911 info->head_block = head_block; in do_one_pass()
915 if (info->end_transaction != next_commit_ID) { in do_one_pass()
916 printk(KERN_ERR "JBD2: recovery pass %d ended at " in do_one_pass()
918 pass, next_commit_ID, info->end_transaction); in do_one_pass()
920 success = -EIO; in do_one_pass()
924 if (jbd2_has_feature_fast_commit(journal) && pass != PASS_REVOKE) { in do_one_pass()
925 err = fc_do_one_pass(journal, info, pass); in do_one_pass()
931 success = -EIO; in do_one_pass()
949 header = (jbd2_journal_revoke_header_t *) bh->b_data; in scan_revoke_records()
951 rcount = be32_to_cpu(header->r_count); in scan_revoke_records()
955 if (rcount > journal->j_blocksize - csum_size) in scan_revoke_records()
956 return -EINVAL; in scan_revoke_records()
967 blocknr = be32_to_cpu(* ((__be32 *) (bh->b_data+offset))); in scan_revoke_records()
969 blocknr = be64_to_cpu(* ((__be64 *) (bh->b_data+offset))); in scan_revoke_records()
974 ++info->nr_revokes; in scan_revoke_records()