^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright (C) STRATO AG 2011. All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * This module can be used to catch cases when the btrfs kernel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * code executes write requests to the disk that bring the file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * system in an inconsistent state. In such a state, a power-loss
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * or kernel panic event would cause that the data on disk is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * lost or at least damaged.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) * Code is added that examines all block write requests during
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) * runtime (including writes of the super block). Three rules
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) * are verified and an error is printed on violation of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) * rules:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) * 1. It is not allowed to write a disk block which is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) * currently referenced by the super block (either directly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) * or indirectly).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) * 2. When a super block is written, it is verified that all
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) * referenced (directly or indirectly) blocks fulfill the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) * following requirements:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) * 2a. All referenced blocks have either been present when
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) * the file system was mounted, (i.e., they have been
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) * referenced by the super block) or they have been
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) * written since then and the write completion callback
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) * was called and no write error was indicated and a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) * FLUSH request to the device where these blocks are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) * located was received and completed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) * 2b. All referenced blocks need to have a generation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) * number which is equal to the parent's number.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) * One issue that was found using this module was that the log
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) * tree on disk became temporarily corrupted because disk blocks
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) * that had been in use for the log tree had been freed and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) * reused too early, while being referenced by the written super
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) * block.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) * The search term in the kernel log that can be used to filter
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) * on the existence of detected integrity issues is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) * "btrfs: attempt".
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) * The integrity check is enabled via mount options. These
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) * mount options are only supported if the integrity check
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) * tool is compiled by defining BTRFS_FS_CHECK_INTEGRITY.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) * Example #1, apply integrity checks to all metadata:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) * mount /dev/sdb1 /mnt -o check_int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) * Example #2, apply integrity checks to all metadata and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) * to data extents:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) * mount /dev/sdb1 /mnt -o check_int_data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) * Example #3, apply integrity checks to all metadata and dump
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) * the tree that the super block references to kernel messages
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) * each time after a super block was written:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) * mount /dev/sdb1 /mnt -o check_int,check_int_print_mask=263
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) * If the integrity check tool is included and activated in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) * the mount options, plenty of kernel memory is used, and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) * plenty of additional CPU cycles are spent. Enabling this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) * functionality is not intended for normal use. In most
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) * cases, unless you are a btrfs developer who needs to verify
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) * the integrity of (super)-block write requests, do not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) * enable the config option BTRFS_FS_CHECK_INTEGRITY to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) * include and compile the integrity check tool.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) * Expect millions of lines of information in the kernel log with an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) * enabled check_int_print_mask. Therefore set LOG_BUF_SHIFT in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) * kernel config to at least 26 (which is 64MB). Usually the value is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) * limited to 21 (which is 2MB) in init/Kconfig. The file needs to be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) * changed like this before LOG_BUF_SHIFT can be set to a high value:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) * config LOG_BUF_SHIFT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) * int "Kernel log buffer size (16 => 64KB, 17 => 128KB)"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) * range 12 30
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) #include <linux/sched.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) #include <linux/mutex.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) #include <linux/genhd.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) #include <linux/blkdev.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) #include <linux/mm.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) #include <linux/string.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) #include <crypto/hash.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) #include "ctree.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) #include "disk-io.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) #include "transaction.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) #include "extent_io.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) #include "volumes.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) #include "print-tree.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) #include "locking.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) #include "check-integrity.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) #include "rcu-string.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) #include "compression.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) #define BTRFSIC_BLOCK_HASHTABLE_SIZE 0x10000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) #define BTRFSIC_BLOCK_LINK_HASHTABLE_SIZE 0x10000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) #define BTRFSIC_DEV2STATE_HASHTABLE_SIZE 0x100
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) #define BTRFSIC_BLOCK_MAGIC_NUMBER 0x14491051
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) #define BTRFSIC_BLOCK_LINK_MAGIC_NUMBER 0x11070807
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) #define BTRFSIC_DEV2STATE_MAGIC_NUMBER 0x20111530
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) #define BTRFSIC_BLOCK_STACK_FRAME_MAGIC_NUMBER 20111300
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) #define BTRFSIC_TREE_DUMP_MAX_INDENT_LEVEL (200 - 6) /* in characters,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) * excluding " [...]" */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) #define BTRFSIC_GENERATION_UNKNOWN ((u64)-1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) * The definition of the bitmask fields for the print_mask.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) * They are specified with the mount option check_integrity_print_mask.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) #define BTRFSIC_PRINT_MASK_SUPERBLOCK_WRITE 0x00000001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) #define BTRFSIC_PRINT_MASK_ROOT_CHUNK_LOG_TREE_LOCATION 0x00000002
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) #define BTRFSIC_PRINT_MASK_TREE_AFTER_SB_WRITE 0x00000004
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) #define BTRFSIC_PRINT_MASK_TREE_BEFORE_SB_WRITE 0x00000008
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) #define BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH 0x00000010
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) #define BTRFSIC_PRINT_MASK_END_IO_BIO_BH 0x00000020
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) #define BTRFSIC_PRINT_MASK_VERBOSE 0x00000040
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) #define BTRFSIC_PRINT_MASK_VERY_VERBOSE 0x00000080
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) #define BTRFSIC_PRINT_MASK_INITIAL_TREE 0x00000100
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) #define BTRFSIC_PRINT_MASK_INITIAL_ALL_TREES 0x00000200
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) #define BTRFSIC_PRINT_MASK_INITIAL_DATABASE 0x00000400
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) #define BTRFSIC_PRINT_MASK_NUM_COPIES 0x00000800
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) #define BTRFSIC_PRINT_MASK_TREE_WITH_ALL_MIRRORS 0x00001000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) #define BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH_VERBOSE 0x00002000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) struct btrfsic_dev_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) struct btrfsic_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) struct btrfsic_block {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) u32 magic_num; /* only used for debug purposes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) unsigned int is_metadata:1; /* if it is meta-data, not data-data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) unsigned int is_superblock:1; /* if it is one of the superblocks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) unsigned int is_iodone:1; /* if is done by lower subsystem */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) unsigned int iodone_w_error:1; /* error was indicated to endio */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) unsigned int never_written:1; /* block was added because it was
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) * referenced, not because it was
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) * written */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) unsigned int mirror_num; /* large enough to hold
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) * BTRFS_SUPER_MIRROR_MAX */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) struct btrfsic_dev_state *dev_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) u64 dev_bytenr; /* key, physical byte num on disk */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) u64 logical_bytenr; /* logical byte num on disk */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) u64 generation;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) struct btrfs_disk_key disk_key; /* extra info to print in case of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) * issues, will not always be correct */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) struct list_head collision_resolving_node; /* list node */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) struct list_head all_blocks_node; /* list node */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) /* the following two lists contain block_link items */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) struct list_head ref_to_list; /* list */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) struct list_head ref_from_list; /* list */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) struct btrfsic_block *next_in_same_bio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) void *orig_bio_private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) bio_end_io_t *orig_bio_end_io;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) int submit_bio_bh_rw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) u64 flush_gen; /* only valid if !never_written */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) * Elements of this type are allocated dynamically and required because
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) * each block object can refer to and can be ref from multiple blocks.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) * The key to lookup them in the hashtable is the dev_bytenr of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) * the block ref to plus the one from the block referred from.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) * The fact that they are searchable via a hashtable and that a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) * ref_cnt is maintained is not required for the btrfs integrity
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) * check algorithm itself, it is only used to make the output more
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) * beautiful in case that an error is detected (an error is defined
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) * as a write operation to a block while that block is still referenced).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) struct btrfsic_block_link {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) u32 magic_num; /* only used for debug purposes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) u32 ref_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) struct list_head node_ref_to; /* list node */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) struct list_head node_ref_from; /* list node */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) struct list_head collision_resolving_node; /* list node */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) struct btrfsic_block *block_ref_to;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) struct btrfsic_block *block_ref_from;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) u64 parent_generation;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) struct btrfsic_dev_state {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) u32 magic_num; /* only used for debug purposes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) struct block_device *bdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) struct btrfsic_state *state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) struct list_head collision_resolving_node; /* list node */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) struct btrfsic_block dummy_block_for_bio_bh_flush;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) u64 last_flush_gen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) char name[BDEVNAME_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) struct btrfsic_block_hashtable {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) struct list_head table[BTRFSIC_BLOCK_HASHTABLE_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) struct btrfsic_block_link_hashtable {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) struct list_head table[BTRFSIC_BLOCK_LINK_HASHTABLE_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) struct btrfsic_dev_state_hashtable {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) struct list_head table[BTRFSIC_DEV2STATE_HASHTABLE_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) struct btrfsic_block_data_ctx {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) u64 start; /* virtual bytenr */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) u64 dev_bytenr; /* physical bytenr on device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) u32 len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) struct btrfsic_dev_state *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) char **datav;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) struct page **pagev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) void *mem_to_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) /* This structure is used to implement recursion without occupying
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) * any stack space, refer to btrfsic_process_metablock() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) struct btrfsic_stack_frame {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) u32 magic;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) u32 nr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) int error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) int limit_nesting;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) int num_copies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) int mirror_num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) struct btrfsic_block *block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) struct btrfsic_block_data_ctx *block_ctx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) struct btrfsic_block *next_block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) struct btrfsic_block_data_ctx next_block_ctx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) struct btrfs_header *hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) struct btrfsic_stack_frame *prev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) /* Some state per mounted filesystem */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) struct btrfsic_state {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) u32 print_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) int include_extent_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) int csum_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) struct list_head all_blocks_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) struct btrfsic_block_hashtable block_hashtable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) struct btrfsic_block_link_hashtable block_link_hashtable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) struct btrfs_fs_info *fs_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) u64 max_superblock_generation;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) struct btrfsic_block *latest_superblock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) u32 metablock_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) u32 datablock_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) static void btrfsic_block_init(struct btrfsic_block *b);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) static struct btrfsic_block *btrfsic_block_alloc(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) static void btrfsic_block_free(struct btrfsic_block *b);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) static void btrfsic_block_link_init(struct btrfsic_block_link *n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) static struct btrfsic_block_link *btrfsic_block_link_alloc(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) static void btrfsic_block_link_free(struct btrfsic_block_link *n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) static void btrfsic_dev_state_init(struct btrfsic_dev_state *ds);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) static struct btrfsic_dev_state *btrfsic_dev_state_alloc(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) static void btrfsic_dev_state_free(struct btrfsic_dev_state *ds);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) static void btrfsic_block_hashtable_init(struct btrfsic_block_hashtable *h);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) static void btrfsic_block_hashtable_add(struct btrfsic_block *b,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) struct btrfsic_block_hashtable *h);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) static void btrfsic_block_hashtable_remove(struct btrfsic_block *b);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) static struct btrfsic_block *btrfsic_block_hashtable_lookup(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) struct block_device *bdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) u64 dev_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) struct btrfsic_block_hashtable *h);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) static void btrfsic_block_link_hashtable_init(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) struct btrfsic_block_link_hashtable *h);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) static void btrfsic_block_link_hashtable_add(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) struct btrfsic_block_link *l,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) struct btrfsic_block_link_hashtable *h);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) static void btrfsic_block_link_hashtable_remove(struct btrfsic_block_link *l);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) static struct btrfsic_block_link *btrfsic_block_link_hashtable_lookup(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) struct block_device *bdev_ref_to,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) u64 dev_bytenr_ref_to,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) struct block_device *bdev_ref_from,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) u64 dev_bytenr_ref_from,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) struct btrfsic_block_link_hashtable *h);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) static void btrfsic_dev_state_hashtable_init(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) struct btrfsic_dev_state_hashtable *h);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) static void btrfsic_dev_state_hashtable_add(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) struct btrfsic_dev_state *ds,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) struct btrfsic_dev_state_hashtable *h);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) static void btrfsic_dev_state_hashtable_remove(struct btrfsic_dev_state *ds);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) static struct btrfsic_dev_state *btrfsic_dev_state_hashtable_lookup(dev_t dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) struct btrfsic_dev_state_hashtable *h);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) static struct btrfsic_stack_frame *btrfsic_stack_frame_alloc(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) static void btrfsic_stack_frame_free(struct btrfsic_stack_frame *sf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) static int btrfsic_process_superblock(struct btrfsic_state *state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) struct btrfs_fs_devices *fs_devices);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) static int btrfsic_process_metablock(struct btrfsic_state *state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) struct btrfsic_block *block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) struct btrfsic_block_data_ctx *block_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) int limit_nesting, int force_iodone_flag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) static void btrfsic_read_from_block_data(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) struct btrfsic_block_data_ctx *block_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) void *dst, u32 offset, size_t len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) static int btrfsic_create_link_to_next_block(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) struct btrfsic_state *state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) struct btrfsic_block *block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) struct btrfsic_block_data_ctx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) *block_ctx, u64 next_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) int limit_nesting,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) struct btrfsic_block_data_ctx *next_block_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) struct btrfsic_block **next_blockp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) int force_iodone_flag,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) int *num_copiesp, int *mirror_nump,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) struct btrfs_disk_key *disk_key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) u64 parent_generation);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) static int btrfsic_handle_extent_data(struct btrfsic_state *state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) struct btrfsic_block *block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) struct btrfsic_block_data_ctx *block_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) u32 item_offset, int force_iodone_flag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) static int btrfsic_map_block(struct btrfsic_state *state, u64 bytenr, u32 len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) struct btrfsic_block_data_ctx *block_ctx_out,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) int mirror_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) static void btrfsic_release_block_ctx(struct btrfsic_block_data_ctx *block_ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) static int btrfsic_read_block(struct btrfsic_state *state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) struct btrfsic_block_data_ctx *block_ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) static void btrfsic_dump_database(struct btrfsic_state *state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) static int btrfsic_test_for_metadata(struct btrfsic_state *state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) char **datav, unsigned int num_pages);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) static void btrfsic_process_written_block(struct btrfsic_dev_state *dev_state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) u64 dev_bytenr, char **mapped_datav,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) unsigned int num_pages,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) struct bio *bio, int *bio_is_patched,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) int submit_bio_bh_rw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) static int btrfsic_process_written_superblock(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) struct btrfsic_state *state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) struct btrfsic_block *const block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) struct btrfs_super_block *const super_hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) static void btrfsic_bio_end_io(struct bio *bp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) static int btrfsic_is_block_ref_by_superblock(const struct btrfsic_state *state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) const struct btrfsic_block *block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) int recursion_level);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) static int btrfsic_check_all_ref_blocks(struct btrfsic_state *state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) struct btrfsic_block *const block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) int recursion_level);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) static void btrfsic_print_add_link(const struct btrfsic_state *state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) const struct btrfsic_block_link *l);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) static void btrfsic_print_rem_link(const struct btrfsic_state *state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) const struct btrfsic_block_link *l);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) static char btrfsic_get_block_type(const struct btrfsic_state *state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) const struct btrfsic_block *block);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) static void btrfsic_dump_tree(const struct btrfsic_state *state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) static void btrfsic_dump_tree_sub(const struct btrfsic_state *state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) const struct btrfsic_block *block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) int indent_level);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) static struct btrfsic_block_link *btrfsic_block_link_lookup_or_add(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) struct btrfsic_state *state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) struct btrfsic_block_data_ctx *next_block_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) struct btrfsic_block *next_block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) struct btrfsic_block *from_block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) u64 parent_generation);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) static struct btrfsic_block *btrfsic_block_lookup_or_add(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) struct btrfsic_state *state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) struct btrfsic_block_data_ctx *block_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) const char *additional_string,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) int is_metadata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) int is_iodone,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) int never_written,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) int mirror_num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) int *was_created);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) static int btrfsic_process_superblock_dev_mirror(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) struct btrfsic_state *state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) struct btrfsic_dev_state *dev_state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) struct btrfs_device *device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) int superblock_mirror_num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) struct btrfsic_dev_state **selected_dev_state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) struct btrfs_super_block *selected_super);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) static struct btrfsic_dev_state *btrfsic_dev_state_lookup(dev_t dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) static void btrfsic_cmp_log_and_dev_bytenr(struct btrfsic_state *state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) u64 bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) struct btrfsic_dev_state *dev_state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) u64 dev_bytenr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) static struct mutex btrfsic_mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) static int btrfsic_is_initialized;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) static struct btrfsic_dev_state_hashtable btrfsic_dev_state_hashtable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) static void btrfsic_block_init(struct btrfsic_block *b)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) b->magic_num = BTRFSIC_BLOCK_MAGIC_NUMBER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) b->dev_state = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) b->dev_bytenr = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) b->logical_bytenr = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) b->generation = BTRFSIC_GENERATION_UNKNOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) b->disk_key.objectid = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) b->disk_key.type = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) b->disk_key.offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) b->is_metadata = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) b->is_superblock = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) b->is_iodone = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) b->iodone_w_error = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) b->never_written = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) b->mirror_num = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) b->next_in_same_bio = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) b->orig_bio_private = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) b->orig_bio_end_io = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) INIT_LIST_HEAD(&b->collision_resolving_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) INIT_LIST_HEAD(&b->all_blocks_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) INIT_LIST_HEAD(&b->ref_to_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) INIT_LIST_HEAD(&b->ref_from_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) b->submit_bio_bh_rw = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) b->flush_gen = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) static struct btrfsic_block *btrfsic_block_alloc(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) struct btrfsic_block *b;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) b = kzalloc(sizeof(*b), GFP_NOFS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) if (NULL != b)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) btrfsic_block_init(b);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) return b;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) static void btrfsic_block_free(struct btrfsic_block *b)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) BUG_ON(!(NULL == b || BTRFSIC_BLOCK_MAGIC_NUMBER == b->magic_num));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) kfree(b);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) static void btrfsic_block_link_init(struct btrfsic_block_link *l)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) l->magic_num = BTRFSIC_BLOCK_LINK_MAGIC_NUMBER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) l->ref_cnt = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) INIT_LIST_HEAD(&l->node_ref_to);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) INIT_LIST_HEAD(&l->node_ref_from);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) INIT_LIST_HEAD(&l->collision_resolving_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) l->block_ref_to = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) l->block_ref_from = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) static struct btrfsic_block_link *btrfsic_block_link_alloc(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) struct btrfsic_block_link *l;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) l = kzalloc(sizeof(*l), GFP_NOFS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) if (NULL != l)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) btrfsic_block_link_init(l);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) return l;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) static void btrfsic_block_link_free(struct btrfsic_block_link *l)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) BUG_ON(!(NULL == l || BTRFSIC_BLOCK_LINK_MAGIC_NUMBER == l->magic_num));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) kfree(l);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) static void btrfsic_dev_state_init(struct btrfsic_dev_state *ds)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) ds->magic_num = BTRFSIC_DEV2STATE_MAGIC_NUMBER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) ds->bdev = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) ds->state = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) ds->name[0] = '\0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) INIT_LIST_HEAD(&ds->collision_resolving_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) ds->last_flush_gen = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) btrfsic_block_init(&ds->dummy_block_for_bio_bh_flush);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) ds->dummy_block_for_bio_bh_flush.is_iodone = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) ds->dummy_block_for_bio_bh_flush.dev_state = ds;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) static struct btrfsic_dev_state *btrfsic_dev_state_alloc(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) struct btrfsic_dev_state *ds;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) ds = kzalloc(sizeof(*ds), GFP_NOFS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) if (NULL != ds)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) btrfsic_dev_state_init(ds);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) return ds;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) static void btrfsic_dev_state_free(struct btrfsic_dev_state *ds)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) BUG_ON(!(NULL == ds ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) BTRFSIC_DEV2STATE_MAGIC_NUMBER == ds->magic_num));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) kfree(ds);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) static void btrfsic_block_hashtable_init(struct btrfsic_block_hashtable *h)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) for (i = 0; i < BTRFSIC_BLOCK_HASHTABLE_SIZE; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) INIT_LIST_HEAD(h->table + i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) static void btrfsic_block_hashtable_add(struct btrfsic_block *b,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) struct btrfsic_block_hashtable *h)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) const unsigned int hashval =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) (((unsigned int)(b->dev_bytenr >> 16)) ^
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) ((unsigned int)((uintptr_t)b->dev_state->bdev))) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) (BTRFSIC_BLOCK_HASHTABLE_SIZE - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) list_add(&b->collision_resolving_node, h->table + hashval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) static void btrfsic_block_hashtable_remove(struct btrfsic_block *b)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) list_del(&b->collision_resolving_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) static struct btrfsic_block *btrfsic_block_hashtable_lookup(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) struct block_device *bdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) u64 dev_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) struct btrfsic_block_hashtable *h)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) const unsigned int hashval =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) (((unsigned int)(dev_bytenr >> 16)) ^
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) ((unsigned int)((uintptr_t)bdev))) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) (BTRFSIC_BLOCK_HASHTABLE_SIZE - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) struct btrfsic_block *b;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) list_for_each_entry(b, h->table + hashval, collision_resolving_node) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) if (b->dev_state->bdev == bdev && b->dev_bytenr == dev_bytenr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) return b;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) static void btrfsic_block_link_hashtable_init(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) struct btrfsic_block_link_hashtable *h)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) for (i = 0; i < BTRFSIC_BLOCK_LINK_HASHTABLE_SIZE; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) INIT_LIST_HEAD(h->table + i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) static void btrfsic_block_link_hashtable_add(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) struct btrfsic_block_link *l,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) struct btrfsic_block_link_hashtable *h)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) const unsigned int hashval =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) (((unsigned int)(l->block_ref_to->dev_bytenr >> 16)) ^
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) ((unsigned int)(l->block_ref_from->dev_bytenr >> 16)) ^
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) ((unsigned int)((uintptr_t)l->block_ref_to->dev_state->bdev)) ^
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) ((unsigned int)((uintptr_t)l->block_ref_from->dev_state->bdev)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) & (BTRFSIC_BLOCK_LINK_HASHTABLE_SIZE - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) BUG_ON(NULL == l->block_ref_to);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) BUG_ON(NULL == l->block_ref_from);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) list_add(&l->collision_resolving_node, h->table + hashval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) static void btrfsic_block_link_hashtable_remove(struct btrfsic_block_link *l)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) list_del(&l->collision_resolving_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) static struct btrfsic_block_link *btrfsic_block_link_hashtable_lookup(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) struct block_device *bdev_ref_to,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) u64 dev_bytenr_ref_to,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) struct block_device *bdev_ref_from,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) u64 dev_bytenr_ref_from,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) struct btrfsic_block_link_hashtable *h)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) const unsigned int hashval =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) (((unsigned int)(dev_bytenr_ref_to >> 16)) ^
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) ((unsigned int)(dev_bytenr_ref_from >> 16)) ^
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) ((unsigned int)((uintptr_t)bdev_ref_to)) ^
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) ((unsigned int)((uintptr_t)bdev_ref_from))) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) (BTRFSIC_BLOCK_LINK_HASHTABLE_SIZE - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) struct btrfsic_block_link *l;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) list_for_each_entry(l, h->table + hashval, collision_resolving_node) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) BUG_ON(NULL == l->block_ref_to);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) BUG_ON(NULL == l->block_ref_from);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) if (l->block_ref_to->dev_state->bdev == bdev_ref_to &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) l->block_ref_to->dev_bytenr == dev_bytenr_ref_to &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) l->block_ref_from->dev_state->bdev == bdev_ref_from &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) l->block_ref_from->dev_bytenr == dev_bytenr_ref_from)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) return l;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) static void btrfsic_dev_state_hashtable_init(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) struct btrfsic_dev_state_hashtable *h)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) for (i = 0; i < BTRFSIC_DEV2STATE_HASHTABLE_SIZE; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) INIT_LIST_HEAD(h->table + i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) static void btrfsic_dev_state_hashtable_add(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) struct btrfsic_dev_state *ds,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) struct btrfsic_dev_state_hashtable *h)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) const unsigned int hashval =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) (((unsigned int)((uintptr_t)ds->bdev->bd_dev)) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) (BTRFSIC_DEV2STATE_HASHTABLE_SIZE - 1));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) list_add(&ds->collision_resolving_node, h->table + hashval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) static void btrfsic_dev_state_hashtable_remove(struct btrfsic_dev_state *ds)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) list_del(&ds->collision_resolving_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) static struct btrfsic_dev_state *btrfsic_dev_state_hashtable_lookup(dev_t dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) struct btrfsic_dev_state_hashtable *h)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) const unsigned int hashval =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) dev & (BTRFSIC_DEV2STATE_HASHTABLE_SIZE - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) struct btrfsic_dev_state *ds;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) list_for_each_entry(ds, h->table + hashval, collision_resolving_node) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) if (ds->bdev->bd_dev == dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) return ds;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) static int btrfsic_process_superblock(struct btrfsic_state *state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) struct btrfs_fs_devices *fs_devices)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) struct btrfs_super_block *selected_super;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) struct list_head *dev_head = &fs_devices->devices;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) struct btrfs_device *device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) struct btrfsic_dev_state *selected_dev_state = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) int pass;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) selected_super = kzalloc(sizeof(*selected_super), GFP_NOFS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) if (!selected_super)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) list_for_each_entry(device, dev_head, dev_list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) struct btrfsic_dev_state *dev_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) if (!device->bdev || !device->name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) dev_state = btrfsic_dev_state_lookup(device->bdev->bd_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) BUG_ON(NULL == dev_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) for (i = 0; i < BTRFS_SUPER_MIRROR_MAX; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) ret = btrfsic_process_superblock_dev_mirror(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) state, dev_state, device, i,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) &selected_dev_state, selected_super);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) if (0 != ret && 0 == i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) kfree(selected_super);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) if (NULL == state->latest_superblock) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) pr_info("btrfsic: no superblock found!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) kfree(selected_super);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) state->csum_size = btrfs_super_csum_size(selected_super);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) for (pass = 0; pass < 3; pass++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) int num_copies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) int mirror_num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) u64 next_bytenr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) switch (pass) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) next_bytenr = btrfs_super_root(selected_super);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) if (state->print_mask &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) BTRFSIC_PRINT_MASK_ROOT_CHUNK_LOG_TREE_LOCATION)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) pr_info("root@%llu\n", next_bytenr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) next_bytenr = btrfs_super_chunk_root(selected_super);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) if (state->print_mask &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) BTRFSIC_PRINT_MASK_ROOT_CHUNK_LOG_TREE_LOCATION)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) pr_info("chunk@%llu\n", next_bytenr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) next_bytenr = btrfs_super_log_root(selected_super);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) if (0 == next_bytenr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) if (state->print_mask &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) BTRFSIC_PRINT_MASK_ROOT_CHUNK_LOG_TREE_LOCATION)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) pr_info("log@%llu\n", next_bytenr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) num_copies = btrfs_num_copies(state->fs_info, next_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) state->metablock_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) if (state->print_mask & BTRFSIC_PRINT_MASK_NUM_COPIES)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) pr_info("num_copies(log_bytenr=%llu) = %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) next_bytenr, num_copies);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) for (mirror_num = 1; mirror_num <= num_copies; mirror_num++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) struct btrfsic_block *next_block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) struct btrfsic_block_data_ctx tmp_next_block_ctx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) struct btrfsic_block_link *l;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) ret = btrfsic_map_block(state, next_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) state->metablock_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) &tmp_next_block_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) mirror_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) pr_info("btrfsic: btrfsic_map_block(root @%llu, mirror %d) failed!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) next_bytenr, mirror_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) kfree(selected_super);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) next_block = btrfsic_block_hashtable_lookup(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) tmp_next_block_ctx.dev->bdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) tmp_next_block_ctx.dev_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) &state->block_hashtable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) BUG_ON(NULL == next_block);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) l = btrfsic_block_link_hashtable_lookup(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) tmp_next_block_ctx.dev->bdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) tmp_next_block_ctx.dev_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) state->latest_superblock->dev_state->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) bdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) state->latest_superblock->dev_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) &state->block_link_hashtable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) BUG_ON(NULL == l);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) ret = btrfsic_read_block(state, &tmp_next_block_ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) if (ret < (int)PAGE_SIZE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) pr_info("btrfsic: read @logical %llu failed!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) tmp_next_block_ctx.start);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) btrfsic_release_block_ctx(&tmp_next_block_ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) kfree(selected_super);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) ret = btrfsic_process_metablock(state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) next_block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) &tmp_next_block_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) BTRFS_MAX_LEVEL + 3, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) btrfsic_release_block_ctx(&tmp_next_block_ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) kfree(selected_super);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) static int btrfsic_process_superblock_dev_mirror(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) struct btrfsic_state *state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) struct btrfsic_dev_state *dev_state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) struct btrfs_device *device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) int superblock_mirror_num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) struct btrfsic_dev_state **selected_dev_state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) struct btrfs_super_block *selected_super)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) struct btrfs_fs_info *fs_info = state->fs_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) struct btrfs_super_block *super_tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) u64 dev_bytenr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) struct btrfsic_block *superblock_tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) int pass;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) struct block_device *const superblock_bdev = device->bdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) struct page *page;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) struct address_space *mapping = superblock_bdev->bd_inode->i_mapping;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) /* super block bytenr is always the unmapped device bytenr */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) dev_bytenr = btrfs_sb_offset(superblock_mirror_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) if (dev_bytenr + BTRFS_SUPER_INFO_SIZE > device->commit_total_bytes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) page = read_cache_page_gfp(mapping, dev_bytenr >> PAGE_SHIFT, GFP_NOFS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) if (IS_ERR(page))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) super_tmp = page_address(page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) if (btrfs_super_bytenr(super_tmp) != dev_bytenr ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) btrfs_super_magic(super_tmp) != BTRFS_MAGIC ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) memcmp(device->uuid, super_tmp->dev_item.uuid, BTRFS_UUID_SIZE) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) btrfs_super_nodesize(super_tmp) != state->metablock_size ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) btrfs_super_sectorsize(super_tmp) != state->datablock_size) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) superblock_tmp =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) btrfsic_block_hashtable_lookup(superblock_bdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) dev_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) &state->block_hashtable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) if (NULL == superblock_tmp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) superblock_tmp = btrfsic_block_alloc();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) if (NULL == superblock_tmp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) ret = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) /* for superblock, only the dev_bytenr makes sense */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) superblock_tmp->dev_bytenr = dev_bytenr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) superblock_tmp->dev_state = dev_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) superblock_tmp->logical_bytenr = dev_bytenr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) superblock_tmp->generation = btrfs_super_generation(super_tmp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) superblock_tmp->is_metadata = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) superblock_tmp->is_superblock = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) superblock_tmp->is_iodone = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) superblock_tmp->never_written = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) superblock_tmp->mirror_num = 1 + superblock_mirror_num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) if (state->print_mask & BTRFSIC_PRINT_MASK_SUPERBLOCK_WRITE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) btrfs_info_in_rcu(fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) "new initial S-block (bdev %p, %s) @%llu (%s/%llu/%d)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) superblock_bdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) rcu_str_deref(device->name), dev_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) dev_state->name, dev_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) superblock_mirror_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) list_add(&superblock_tmp->all_blocks_node,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) &state->all_blocks_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) btrfsic_block_hashtable_add(superblock_tmp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) &state->block_hashtable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) /* select the one with the highest generation field */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) if (btrfs_super_generation(super_tmp) >
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) state->max_superblock_generation ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) 0 == state->max_superblock_generation) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) memcpy(selected_super, super_tmp, sizeof(*selected_super));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) *selected_dev_state = dev_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) state->max_superblock_generation =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) btrfs_super_generation(super_tmp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) state->latest_superblock = superblock_tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) for (pass = 0; pass < 3; pass++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) u64 next_bytenr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) int num_copies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) int mirror_num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) const char *additional_string = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) struct btrfs_disk_key tmp_disk_key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) tmp_disk_key.type = BTRFS_ROOT_ITEM_KEY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) tmp_disk_key.offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) switch (pass) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) btrfs_set_disk_key_objectid(&tmp_disk_key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) BTRFS_ROOT_TREE_OBJECTID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) additional_string = "initial root ";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) next_bytenr = btrfs_super_root(super_tmp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) btrfs_set_disk_key_objectid(&tmp_disk_key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) BTRFS_CHUNK_TREE_OBJECTID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) additional_string = "initial chunk ";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) next_bytenr = btrfs_super_chunk_root(super_tmp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) btrfs_set_disk_key_objectid(&tmp_disk_key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) BTRFS_TREE_LOG_OBJECTID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) additional_string = "initial log ";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) next_bytenr = btrfs_super_log_root(super_tmp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) if (0 == next_bytenr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) num_copies = btrfs_num_copies(fs_info, next_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) state->metablock_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) if (state->print_mask & BTRFSIC_PRINT_MASK_NUM_COPIES)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) pr_info("num_copies(log_bytenr=%llu) = %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) next_bytenr, num_copies);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) for (mirror_num = 1; mirror_num <= num_copies; mirror_num++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) struct btrfsic_block *next_block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) struct btrfsic_block_data_ctx tmp_next_block_ctx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) struct btrfsic_block_link *l;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) if (btrfsic_map_block(state, next_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) state->metablock_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) &tmp_next_block_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) mirror_num)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) pr_info("btrfsic: btrfsic_map_block(bytenr @%llu, mirror %d) failed!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) next_bytenr, mirror_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) ret = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) next_block = btrfsic_block_lookup_or_add(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) state, &tmp_next_block_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) additional_string, 1, 1, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) mirror_num, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) if (NULL == next_block) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) btrfsic_release_block_ctx(&tmp_next_block_ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) ret = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) next_block->disk_key = tmp_disk_key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) next_block->generation = BTRFSIC_GENERATION_UNKNOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) l = btrfsic_block_link_lookup_or_add(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) state, &tmp_next_block_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) next_block, superblock_tmp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) BTRFSIC_GENERATION_UNKNOWN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) btrfsic_release_block_ctx(&tmp_next_block_ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) if (NULL == l) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) ret = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) if (state->print_mask & BTRFSIC_PRINT_MASK_INITIAL_ALL_TREES)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) btrfsic_dump_tree_sub(state, superblock_tmp, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) put_page(page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) static struct btrfsic_stack_frame *btrfsic_stack_frame_alloc(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) struct btrfsic_stack_frame *sf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) sf = kzalloc(sizeof(*sf), GFP_NOFS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) if (sf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) sf->magic = BTRFSIC_BLOCK_STACK_FRAME_MAGIC_NUMBER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) return sf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) static void btrfsic_stack_frame_free(struct btrfsic_stack_frame *sf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) BUG_ON(!(NULL == sf ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) BTRFSIC_BLOCK_STACK_FRAME_MAGIC_NUMBER == sf->magic));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) kfree(sf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) static noinline_for_stack int btrfsic_process_metablock(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) struct btrfsic_state *state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) struct btrfsic_block *const first_block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) struct btrfsic_block_data_ctx *const first_block_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) int first_limit_nesting, int force_iodone_flag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) struct btrfsic_stack_frame initial_stack_frame = { 0 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) struct btrfsic_stack_frame *sf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) struct btrfsic_stack_frame *next_stack;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) struct btrfs_header *const first_hdr =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) (struct btrfs_header *)first_block_ctx->datav[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) BUG_ON(!first_hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) sf = &initial_stack_frame;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) sf->error = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) sf->i = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) sf->limit_nesting = first_limit_nesting;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) sf->block = first_block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) sf->block_ctx = first_block_ctx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) sf->next_block = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) sf->hdr = first_hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) sf->prev = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) continue_with_new_stack_frame:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) sf->block->generation = le64_to_cpu(sf->hdr->generation);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) if (0 == sf->hdr->level) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) struct btrfs_leaf *const leafhdr =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) (struct btrfs_leaf *)sf->hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) if (-1 == sf->i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) sf->nr = btrfs_stack_header_nritems(&leafhdr->header);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) if (state->print_mask & BTRFSIC_PRINT_MASK_VERBOSE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) pr_info("leaf %llu items %d generation %llu owner %llu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) sf->block_ctx->start, sf->nr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) btrfs_stack_header_generation(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) &leafhdr->header),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) btrfs_stack_header_owner(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) &leafhdr->header));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) continue_with_current_leaf_stack_frame:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) if (0 == sf->num_copies || sf->mirror_num > sf->num_copies) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) sf->i++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) sf->num_copies = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) if (sf->i < sf->nr) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) struct btrfs_item disk_item;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) u32 disk_item_offset =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) (uintptr_t)(leafhdr->items + sf->i) -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) (uintptr_t)leafhdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) struct btrfs_disk_key *disk_key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) u8 type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) u32 item_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) u32 item_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) if (disk_item_offset + sizeof(struct btrfs_item) >
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) sf->block_ctx->len) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) leaf_item_out_of_bounce_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) pr_info("btrfsic: leaf item out of bounce at logical %llu, dev %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) sf->block_ctx->start,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) sf->block_ctx->dev->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) goto one_stack_frame_backwards;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) btrfsic_read_from_block_data(sf->block_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) &disk_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) disk_item_offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) sizeof(struct btrfs_item));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) item_offset = btrfs_stack_item_offset(&disk_item);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) item_size = btrfs_stack_item_size(&disk_item);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) disk_key = &disk_item.key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) type = btrfs_disk_key_type(disk_key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) if (BTRFS_ROOT_ITEM_KEY == type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) struct btrfs_root_item root_item;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) u32 root_item_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) u64 next_bytenr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) root_item_offset = item_offset +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) offsetof(struct btrfs_leaf, items);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) if (root_item_offset + item_size >
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) sf->block_ctx->len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) goto leaf_item_out_of_bounce_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) btrfsic_read_from_block_data(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) sf->block_ctx, &root_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) root_item_offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) item_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) next_bytenr = btrfs_root_bytenr(&root_item);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) sf->error =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) btrfsic_create_link_to_next_block(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) sf->block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) sf->block_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) next_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) sf->limit_nesting,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) &sf->next_block_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) &sf->next_block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) force_iodone_flag,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) &sf->num_copies,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) &sf->mirror_num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) disk_key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) btrfs_root_generation(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) &root_item));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) if (sf->error)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) goto one_stack_frame_backwards;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) if (NULL != sf->next_block) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) struct btrfs_header *const next_hdr =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) (struct btrfs_header *)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) sf->next_block_ctx.datav[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) next_stack =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) btrfsic_stack_frame_alloc();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) if (NULL == next_stack) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) sf->error = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) btrfsic_release_block_ctx(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) &sf->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) next_block_ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) goto one_stack_frame_backwards;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) next_stack->i = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) next_stack->block = sf->next_block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) next_stack->block_ctx =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) &sf->next_block_ctx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) next_stack->next_block = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) next_stack->hdr = next_hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) next_stack->limit_nesting =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) sf->limit_nesting - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) next_stack->prev = sf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) sf = next_stack;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) goto continue_with_new_stack_frame;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) } else if (BTRFS_EXTENT_DATA_KEY == type &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) state->include_extent_data) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) sf->error = btrfsic_handle_extent_data(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) sf->block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) sf->block_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) item_offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) force_iodone_flag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) if (sf->error)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) goto one_stack_frame_backwards;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) goto continue_with_current_leaf_stack_frame;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) struct btrfs_node *const nodehdr = (struct btrfs_node *)sf->hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) if (-1 == sf->i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) sf->nr = btrfs_stack_header_nritems(&nodehdr->header);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) if (state->print_mask & BTRFSIC_PRINT_MASK_VERBOSE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) pr_info("node %llu level %d items %d generation %llu owner %llu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) sf->block_ctx->start,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) nodehdr->header.level, sf->nr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) btrfs_stack_header_generation(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) &nodehdr->header),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) btrfs_stack_header_owner(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) &nodehdr->header));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) continue_with_current_node_stack_frame:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) if (0 == sf->num_copies || sf->mirror_num > sf->num_copies) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) sf->i++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) sf->num_copies = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) if (sf->i < sf->nr) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) struct btrfs_key_ptr key_ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) u32 key_ptr_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) u64 next_bytenr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) key_ptr_offset = (uintptr_t)(nodehdr->ptrs + sf->i) -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) (uintptr_t)nodehdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) if (key_ptr_offset + sizeof(struct btrfs_key_ptr) >
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) sf->block_ctx->len) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) pr_info("btrfsic: node item out of bounce at logical %llu, dev %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) sf->block_ctx->start,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) sf->block_ctx->dev->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) goto one_stack_frame_backwards;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) btrfsic_read_from_block_data(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) sf->block_ctx, &key_ptr, key_ptr_offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) sizeof(struct btrfs_key_ptr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) next_bytenr = btrfs_stack_key_blockptr(&key_ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) sf->error = btrfsic_create_link_to_next_block(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) sf->block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) sf->block_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) next_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) sf->limit_nesting,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) &sf->next_block_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) &sf->next_block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) force_iodone_flag,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) &sf->num_copies,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) &sf->mirror_num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) &key_ptr.key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) btrfs_stack_key_generation(&key_ptr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) if (sf->error)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) goto one_stack_frame_backwards;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) if (NULL != sf->next_block) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) struct btrfs_header *const next_hdr =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) (struct btrfs_header *)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) sf->next_block_ctx.datav[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) next_stack = btrfsic_stack_frame_alloc();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) if (NULL == next_stack) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) sf->error = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) goto one_stack_frame_backwards;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) next_stack->i = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) next_stack->block = sf->next_block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) next_stack->block_ctx = &sf->next_block_ctx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) next_stack->next_block = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) next_stack->hdr = next_hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) next_stack->limit_nesting =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) sf->limit_nesting - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) next_stack->prev = sf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) sf = next_stack;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) goto continue_with_new_stack_frame;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) goto continue_with_current_node_stack_frame;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) one_stack_frame_backwards:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) if (NULL != sf->prev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) struct btrfsic_stack_frame *const prev = sf->prev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) /* the one for the initial block is freed in the caller */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) btrfsic_release_block_ctx(sf->block_ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) if (sf->error) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) prev->error = sf->error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) btrfsic_stack_frame_free(sf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) sf = prev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) goto one_stack_frame_backwards;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) btrfsic_stack_frame_free(sf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) sf = prev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) goto continue_with_new_stack_frame;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) BUG_ON(&initial_stack_frame != sf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) return sf->error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) static void btrfsic_read_from_block_data(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) struct btrfsic_block_data_ctx *block_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) void *dstv, u32 offset, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) size_t cur;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) size_t pgoff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) char *kaddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) char *dst = (char *)dstv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) size_t start_offset = offset_in_page(block_ctx->start);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) unsigned long i = (start_offset + offset) >> PAGE_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) WARN_ON(offset + len > block_ctx->len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) pgoff = offset_in_page(start_offset + offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) while (len > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) cur = min(len, ((size_t)PAGE_SIZE - pgoff));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) BUG_ON(i >= DIV_ROUND_UP(block_ctx->len, PAGE_SIZE));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) kaddr = block_ctx->datav[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) memcpy(dst, kaddr + pgoff, cur);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) dst += cur;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) len -= cur;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) pgoff = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) i++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) static int btrfsic_create_link_to_next_block(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) struct btrfsic_state *state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) struct btrfsic_block *block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) struct btrfsic_block_data_ctx *block_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) u64 next_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) int limit_nesting,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) struct btrfsic_block_data_ctx *next_block_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) struct btrfsic_block **next_blockp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) int force_iodone_flag,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) int *num_copiesp, int *mirror_nump,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) struct btrfs_disk_key *disk_key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) u64 parent_generation)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) struct btrfs_fs_info *fs_info = state->fs_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) struct btrfsic_block *next_block = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) struct btrfsic_block_link *l;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) int did_alloc_block_link;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) int block_was_created;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) *next_blockp = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) if (0 == *num_copiesp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) *num_copiesp = btrfs_num_copies(fs_info, next_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) state->metablock_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) if (state->print_mask & BTRFSIC_PRINT_MASK_NUM_COPIES)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) pr_info("num_copies(log_bytenr=%llu) = %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) next_bytenr, *num_copiesp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) *mirror_nump = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) if (*mirror_nump > *num_copiesp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) if (state->print_mask & BTRFSIC_PRINT_MASK_VERBOSE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) pr_info("btrfsic_create_link_to_next_block(mirror_num=%d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) *mirror_nump);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) ret = btrfsic_map_block(state, next_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) state->metablock_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) next_block_ctx, *mirror_nump);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) pr_info("btrfsic: btrfsic_map_block(@%llu, mirror=%d) failed!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) next_bytenr, *mirror_nump);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) btrfsic_release_block_ctx(next_block_ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) *next_blockp = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) next_block = btrfsic_block_lookup_or_add(state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) next_block_ctx, "referenced ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) 1, force_iodone_flag,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) !force_iodone_flag,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) *mirror_nump,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) &block_was_created);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) if (NULL == next_block) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) btrfsic_release_block_ctx(next_block_ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) *next_blockp = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) if (block_was_created) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) l = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) next_block->generation = BTRFSIC_GENERATION_UNKNOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) if (state->print_mask & BTRFSIC_PRINT_MASK_VERBOSE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) if (next_block->logical_bytenr != next_bytenr &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) !(!next_block->is_metadata &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) 0 == next_block->logical_bytenr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) pr_info("Referenced block @%llu (%s/%llu/%d) found in hash table, %c, bytenr mismatch (!= stored %llu).\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) next_bytenr, next_block_ctx->dev->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) next_block_ctx->dev_bytenr, *mirror_nump,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) btrfsic_get_block_type(state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) next_block),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) next_block->logical_bytenr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) pr_info("Referenced block @%llu (%s/%llu/%d) found in hash table, %c.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) next_bytenr, next_block_ctx->dev->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) next_block_ctx->dev_bytenr, *mirror_nump,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) btrfsic_get_block_type(state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) next_block));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) next_block->logical_bytenr = next_bytenr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) next_block->mirror_num = *mirror_nump;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) l = btrfsic_block_link_hashtable_lookup(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) next_block_ctx->dev->bdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) next_block_ctx->dev_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) block_ctx->dev->bdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) block_ctx->dev_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) &state->block_link_hashtable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) next_block->disk_key = *disk_key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) if (NULL == l) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) l = btrfsic_block_link_alloc();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) if (NULL == l) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) btrfsic_release_block_ctx(next_block_ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) *next_blockp = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) did_alloc_block_link = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) l->block_ref_to = next_block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) l->block_ref_from = block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) l->ref_cnt = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) l->parent_generation = parent_generation;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) if (state->print_mask & BTRFSIC_PRINT_MASK_VERBOSE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) btrfsic_print_add_link(state, l);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) list_add(&l->node_ref_to, &block->ref_to_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) list_add(&l->node_ref_from, &next_block->ref_from_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) btrfsic_block_link_hashtable_add(l,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) &state->block_link_hashtable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) did_alloc_block_link = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) if (0 == limit_nesting) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) l->ref_cnt++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) l->parent_generation = parent_generation;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) if (state->print_mask & BTRFSIC_PRINT_MASK_VERBOSE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) btrfsic_print_add_link(state, l);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) if (limit_nesting > 0 && did_alloc_block_link) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) ret = btrfsic_read_block(state, next_block_ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) if (ret < (int)next_block_ctx->len) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) pr_info("btrfsic: read block @logical %llu failed!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) next_bytenr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) btrfsic_release_block_ctx(next_block_ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) *next_blockp = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) *next_blockp = next_block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) *next_blockp = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) (*mirror_nump)++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) static int btrfsic_handle_extent_data(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) struct btrfsic_state *state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) struct btrfsic_block *block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) struct btrfsic_block_data_ctx *block_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) u32 item_offset, int force_iodone_flag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) struct btrfs_fs_info *fs_info = state->fs_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) struct btrfs_file_extent_item file_extent_item;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) u64 file_extent_item_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) u64 next_bytenr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) u64 num_bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) u64 generation;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) struct btrfsic_block_link *l;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) file_extent_item_offset = offsetof(struct btrfs_leaf, items) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) item_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) if (file_extent_item_offset +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) offsetof(struct btrfs_file_extent_item, disk_num_bytes) >
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) block_ctx->len) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) pr_info("btrfsic: file item out of bounce at logical %llu, dev %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) block_ctx->start, block_ctx->dev->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) btrfsic_read_from_block_data(block_ctx, &file_extent_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) file_extent_item_offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) offsetof(struct btrfs_file_extent_item, disk_num_bytes));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) if (BTRFS_FILE_EXTENT_REG != file_extent_item.type ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) btrfs_stack_file_extent_disk_bytenr(&file_extent_item) == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) if (state->print_mask & BTRFSIC_PRINT_MASK_VERY_VERBOSE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) pr_info("extent_data: type %u, disk_bytenr = %llu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) file_extent_item.type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) btrfs_stack_file_extent_disk_bytenr(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) &file_extent_item));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) if (file_extent_item_offset + sizeof(struct btrfs_file_extent_item) >
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) block_ctx->len) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) pr_info("btrfsic: file item out of bounce at logical %llu, dev %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) block_ctx->start, block_ctx->dev->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) btrfsic_read_from_block_data(block_ctx, &file_extent_item,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) file_extent_item_offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) sizeof(struct btrfs_file_extent_item));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) next_bytenr = btrfs_stack_file_extent_disk_bytenr(&file_extent_item);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) if (btrfs_stack_file_extent_compression(&file_extent_item) ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) BTRFS_COMPRESS_NONE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) next_bytenr += btrfs_stack_file_extent_offset(&file_extent_item);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) num_bytes = btrfs_stack_file_extent_num_bytes(&file_extent_item);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) num_bytes = btrfs_stack_file_extent_disk_num_bytes(&file_extent_item);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) generation = btrfs_stack_file_extent_generation(&file_extent_item);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) if (state->print_mask & BTRFSIC_PRINT_MASK_VERY_VERBOSE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) pr_info("extent_data: type %u, disk_bytenr = %llu, offset = %llu, num_bytes = %llu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) file_extent_item.type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) btrfs_stack_file_extent_disk_bytenr(&file_extent_item),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) btrfs_stack_file_extent_offset(&file_extent_item),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) num_bytes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) while (num_bytes > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) u32 chunk_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) int num_copies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) int mirror_num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) if (num_bytes > state->datablock_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) chunk_len = state->datablock_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) chunk_len = num_bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) num_copies = btrfs_num_copies(fs_info, next_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) state->datablock_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) if (state->print_mask & BTRFSIC_PRINT_MASK_NUM_COPIES)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) pr_info("num_copies(log_bytenr=%llu) = %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) next_bytenr, num_copies);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) for (mirror_num = 1; mirror_num <= num_copies; mirror_num++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) struct btrfsic_block_data_ctx next_block_ctx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) struct btrfsic_block *next_block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) int block_was_created;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) if (state->print_mask & BTRFSIC_PRINT_MASK_VERBOSE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) pr_info("btrfsic_handle_extent_data(mirror_num=%d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) mirror_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) if (state->print_mask & BTRFSIC_PRINT_MASK_VERY_VERBOSE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) pr_info("\tdisk_bytenr = %llu, num_bytes %u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) next_bytenr, chunk_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) ret = btrfsic_map_block(state, next_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) chunk_len, &next_block_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) mirror_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) pr_info("btrfsic: btrfsic_map_block(@%llu, mirror=%d) failed!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) next_bytenr, mirror_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) next_block = btrfsic_block_lookup_or_add(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) &next_block_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) "referenced ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) force_iodone_flag,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) !force_iodone_flag,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) mirror_num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) &block_was_created);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) if (NULL == next_block) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) btrfsic_release_block_ctx(&next_block_ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) if (!block_was_created) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) if ((state->print_mask &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) BTRFSIC_PRINT_MASK_VERBOSE) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) next_block->logical_bytenr != next_bytenr &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) !(!next_block->is_metadata &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) 0 == next_block->logical_bytenr)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) pr_info("Referenced block @%llu (%s/%llu/%d) found in hash table, D, bytenr mismatch (!= stored %llu).\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) next_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) next_block_ctx.dev->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) next_block_ctx.dev_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) mirror_num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) next_block->logical_bytenr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) next_block->logical_bytenr = next_bytenr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) next_block->mirror_num = mirror_num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) l = btrfsic_block_link_lookup_or_add(state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) &next_block_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) next_block, block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) generation);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) btrfsic_release_block_ctx(&next_block_ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) if (NULL == l)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) next_bytenr += chunk_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) num_bytes -= chunk_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) static int btrfsic_map_block(struct btrfsic_state *state, u64 bytenr, u32 len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) struct btrfsic_block_data_ctx *block_ctx_out,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) int mirror_num)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) struct btrfs_fs_info *fs_info = state->fs_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) u64 length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) struct btrfs_bio *multi = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) struct btrfs_device *device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) length = len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) ret = btrfs_map_block(fs_info, BTRFS_MAP_READ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) bytenr, &length, &multi, mirror_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) block_ctx_out->start = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) block_ctx_out->dev_bytenr = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) block_ctx_out->len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) block_ctx_out->dev = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) block_ctx_out->datav = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) block_ctx_out->pagev = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) block_ctx_out->mem_to_free = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) device = multi->stripes[0].dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) if (test_bit(BTRFS_DEV_STATE_MISSING, &device->dev_state) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) !device->bdev || !device->name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) block_ctx_out->dev = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) block_ctx_out->dev = btrfsic_dev_state_lookup(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) device->bdev->bd_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) block_ctx_out->dev_bytenr = multi->stripes[0].physical;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) block_ctx_out->start = bytenr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) block_ctx_out->len = len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) block_ctx_out->datav = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) block_ctx_out->pagev = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) block_ctx_out->mem_to_free = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) kfree(multi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) if (NULL == block_ctx_out->dev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) ret = -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) pr_info("btrfsic: error, cannot lookup dev (#1)!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) static void btrfsic_release_block_ctx(struct btrfsic_block_data_ctx *block_ctx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) if (block_ctx->mem_to_free) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) unsigned int num_pages;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) BUG_ON(!block_ctx->datav);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) BUG_ON(!block_ctx->pagev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) num_pages = (block_ctx->len + (u64)PAGE_SIZE - 1) >>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) PAGE_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) while (num_pages > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) num_pages--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) if (block_ctx->datav[num_pages]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) kunmap(block_ctx->pagev[num_pages]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) block_ctx->datav[num_pages] = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) if (block_ctx->pagev[num_pages]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) __free_page(block_ctx->pagev[num_pages]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) block_ctx->pagev[num_pages] = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) kfree(block_ctx->mem_to_free);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) block_ctx->mem_to_free = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) block_ctx->pagev = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) block_ctx->datav = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) static int btrfsic_read_block(struct btrfsic_state *state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) struct btrfsic_block_data_ctx *block_ctx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) unsigned int num_pages;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) size_t size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) u64 dev_bytenr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) BUG_ON(block_ctx->datav);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) BUG_ON(block_ctx->pagev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) BUG_ON(block_ctx->mem_to_free);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) if (!PAGE_ALIGNED(block_ctx->dev_bytenr)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) pr_info("btrfsic: read_block() with unaligned bytenr %llu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) block_ctx->dev_bytenr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) num_pages = (block_ctx->len + (u64)PAGE_SIZE - 1) >>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) PAGE_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) size = sizeof(*block_ctx->datav) + sizeof(*block_ctx->pagev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) block_ctx->mem_to_free = kcalloc(num_pages, size, GFP_NOFS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) if (!block_ctx->mem_to_free)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) block_ctx->datav = block_ctx->mem_to_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) block_ctx->pagev = (struct page **)(block_ctx->datav + num_pages);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) for (i = 0; i < num_pages; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) block_ctx->pagev[i] = alloc_page(GFP_NOFS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) if (!block_ctx->pagev[i])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) dev_bytenr = block_ctx->dev_bytenr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) for (i = 0; i < num_pages;) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) struct bio *bio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) unsigned int j;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) bio = btrfs_io_bio_alloc(num_pages - i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) bio_set_dev(bio, block_ctx->dev->bdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) bio->bi_iter.bi_sector = dev_bytenr >> 9;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) bio->bi_opf = REQ_OP_READ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) for (j = i; j < num_pages; j++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) ret = bio_add_page(bio, block_ctx->pagev[j],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) PAGE_SIZE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) if (PAGE_SIZE != ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) if (j == i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) pr_info("btrfsic: error, failed to add a single page!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) if (submit_bio_wait(bio)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) pr_info("btrfsic: read error at logical %llu dev %s!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) block_ctx->start, block_ctx->dev->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) bio_put(bio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) bio_put(bio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) dev_bytenr += (j - i) * PAGE_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) i = j;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) for (i = 0; i < num_pages; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) block_ctx->datav[i] = kmap(block_ctx->pagev[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) return block_ctx->len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) static void btrfsic_dump_database(struct btrfsic_state *state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) const struct btrfsic_block *b_all;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) BUG_ON(NULL == state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) pr_info("all_blocks_list:\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) list_for_each_entry(b_all, &state->all_blocks_list, all_blocks_node) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) const struct btrfsic_block_link *l;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) pr_info("%c-block @%llu (%s/%llu/%d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) btrfsic_get_block_type(state, b_all),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) b_all->logical_bytenr, b_all->dev_state->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) b_all->dev_bytenr, b_all->mirror_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) list_for_each_entry(l, &b_all->ref_to_list, node_ref_to) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) pr_info(" %c @%llu (%s/%llu/%d) refers %u* to %c @%llu (%s/%llu/%d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) btrfsic_get_block_type(state, b_all),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) b_all->logical_bytenr, b_all->dev_state->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) b_all->dev_bytenr, b_all->mirror_num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) l->ref_cnt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) btrfsic_get_block_type(state, l->block_ref_to),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) l->block_ref_to->logical_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) l->block_ref_to->dev_state->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) l->block_ref_to->dev_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) l->block_ref_to->mirror_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) list_for_each_entry(l, &b_all->ref_from_list, node_ref_from) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) pr_info(" %c @%llu (%s/%llu/%d) is ref %u* from %c @%llu (%s/%llu/%d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) btrfsic_get_block_type(state, b_all),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) b_all->logical_bytenr, b_all->dev_state->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) b_all->dev_bytenr, b_all->mirror_num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) l->ref_cnt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) btrfsic_get_block_type(state, l->block_ref_from),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) l->block_ref_from->logical_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684) l->block_ref_from->dev_state->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) l->block_ref_from->dev_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) l->block_ref_from->mirror_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) pr_info("\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) * Test whether the disk block contains a tree block (leaf or node)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) * (note that this test fails for the super block)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) static noinline_for_stack int btrfsic_test_for_metadata(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) struct btrfsic_state *state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) char **datav, unsigned int num_pages)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) struct btrfs_fs_info *fs_info = state->fs_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) SHASH_DESC_ON_STACK(shash, fs_info->csum_shash);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) struct btrfs_header *h;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) u8 csum[BTRFS_CSUM_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) if (num_pages * PAGE_SIZE < state->metablock_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) return 1; /* not metadata */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709) num_pages = state->metablock_size >> PAGE_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) h = (struct btrfs_header *)datav[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) if (memcmp(h->fsid, fs_info->fs_devices->fsid, BTRFS_FSID_SIZE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) shash->tfm = fs_info->csum_shash;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) crypto_shash_init(shash);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) for (i = 0; i < num_pages; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) u8 *data = i ? datav[i] : (datav[i] + BTRFS_CSUM_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) size_t sublen = i ? PAGE_SIZE :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) (PAGE_SIZE - BTRFS_CSUM_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723) crypto_shash_update(shash, data, sublen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725) crypto_shash_final(shash, csum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) if (memcmp(csum, h->csum, state->csum_size))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729) return 0; /* is metadata */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732) static void btrfsic_process_written_block(struct btrfsic_dev_state *dev_state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) u64 dev_bytenr, char **mapped_datav,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) unsigned int num_pages,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735) struct bio *bio, int *bio_is_patched,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) int submit_bio_bh_rw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738) int is_metadata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739) struct btrfsic_block *block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) struct btrfsic_block_data_ctx block_ctx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742) struct btrfsic_state *state = dev_state->state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743) struct block_device *bdev = dev_state->bdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) unsigned int processed_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) if (NULL != bio_is_patched)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) *bio_is_patched = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749) again:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) if (num_pages == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753) processed_len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) is_metadata = (0 == btrfsic_test_for_metadata(state, mapped_datav,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755) num_pages));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757) block = btrfsic_block_hashtable_lookup(bdev, dev_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758) &state->block_hashtable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759) if (NULL != block) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760) u64 bytenr = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) struct btrfsic_block_link *l, *tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763) if (block->is_superblock) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764) bytenr = btrfs_super_bytenr((struct btrfs_super_block *)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765) mapped_datav[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) if (num_pages * PAGE_SIZE <
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) BTRFS_SUPER_INFO_SIZE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) pr_info("btrfsic: cannot work with too short bios!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771) is_metadata = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772) BUG_ON(!PAGE_ALIGNED(BTRFS_SUPER_INFO_SIZE));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) processed_len = BTRFS_SUPER_INFO_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) if (state->print_mask &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775) BTRFSIC_PRINT_MASK_TREE_BEFORE_SB_WRITE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776) pr_info("[before new superblock is written]:\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777) btrfsic_dump_tree_sub(state, block, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780) if (is_metadata) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781) if (!block->is_superblock) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782) if (num_pages * PAGE_SIZE <
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783) state->metablock_size) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784) pr_info("btrfsic: cannot work with too short bios!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787) processed_len = state->metablock_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788) bytenr = btrfs_stack_header_bytenr(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789) (struct btrfs_header *)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790) mapped_datav[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791) btrfsic_cmp_log_and_dev_bytenr(state, bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792) dev_state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793) dev_bytenr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795) if (state->print_mask & BTRFSIC_PRINT_MASK_VERBOSE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796) if (block->logical_bytenr != bytenr &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797) !(!block->is_metadata &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798) block->logical_bytenr == 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799) pr_info("Written block @%llu (%s/%llu/%d) found in hash table, %c, bytenr mismatch (!= stored %llu).\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800) bytenr, dev_state->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801) dev_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802) block->mirror_num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803) btrfsic_get_block_type(state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804) block),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805) block->logical_bytenr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807) pr_info("Written block @%llu (%s/%llu/%d) found in hash table, %c.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808) bytenr, dev_state->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809) dev_bytenr, block->mirror_num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810) btrfsic_get_block_type(state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811) block));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813) block->logical_bytenr = bytenr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815) if (num_pages * PAGE_SIZE <
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816) state->datablock_size) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817) pr_info("btrfsic: cannot work with too short bios!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820) processed_len = state->datablock_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821) bytenr = block->logical_bytenr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822) if (state->print_mask & BTRFSIC_PRINT_MASK_VERBOSE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823) pr_info("Written block @%llu (%s/%llu/%d) found in hash table, %c.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824) bytenr, dev_state->name, dev_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825) block->mirror_num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826) btrfsic_get_block_type(state, block));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829) if (state->print_mask & BTRFSIC_PRINT_MASK_VERBOSE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830) pr_info("ref_to_list: %cE, ref_from_list: %cE\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831) list_empty(&block->ref_to_list) ? ' ' : '!',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832) list_empty(&block->ref_from_list) ? ' ' : '!');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833) if (btrfsic_is_block_ref_by_superblock(state, block, 0)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834) pr_info("btrfs: attempt to overwrite %c-block @%llu (%s/%llu/%d), old(gen=%llu, objectid=%llu, type=%d, offset=%llu), new(gen=%llu), which is referenced by most recent superblock (superblockgen=%llu)!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835) btrfsic_get_block_type(state, block), bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836) dev_state->name, dev_bytenr, block->mirror_num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837) block->generation,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838) btrfs_disk_key_objectid(&block->disk_key),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839) block->disk_key.type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840) btrfs_disk_key_offset(&block->disk_key),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841) btrfs_stack_header_generation(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842) (struct btrfs_header *) mapped_datav[0]),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843) state->max_superblock_generation);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844) btrfsic_dump_tree(state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847) if (!block->is_iodone && !block->never_written) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848) pr_info("btrfs: attempt to overwrite %c-block @%llu (%s/%llu/%d), oldgen=%llu, newgen=%llu, which is not yet iodone!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849) btrfsic_get_block_type(state, block), bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850) dev_state->name, dev_bytenr, block->mirror_num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851) block->generation,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852) btrfs_stack_header_generation(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853) (struct btrfs_header *)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854) mapped_datav[0]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1855) /* it would not be safe to go on */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856) btrfsic_dump_tree(state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857) goto continue_loop;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1861) * Clear all references of this block. Do not free
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1862) * the block itself even if is not referenced anymore
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1863) * because it still carries valuable information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1864) * like whether it was ever written and IO completed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1865) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1866) list_for_each_entry_safe(l, tmp, &block->ref_to_list,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1867) node_ref_to) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1868) if (state->print_mask & BTRFSIC_PRINT_MASK_VERBOSE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1869) btrfsic_print_rem_link(state, l);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1870) l->ref_cnt--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1871) if (0 == l->ref_cnt) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1872) list_del(&l->node_ref_to);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1873) list_del(&l->node_ref_from);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1874) btrfsic_block_link_hashtable_remove(l);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1875) btrfsic_block_link_free(l);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1876) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1877) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1878)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1879) block_ctx.dev = dev_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1880) block_ctx.dev_bytenr = dev_bytenr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1881) block_ctx.start = bytenr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1882) block_ctx.len = processed_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1883) block_ctx.pagev = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1884) block_ctx.mem_to_free = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1885) block_ctx.datav = mapped_datav;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1886)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1887) if (is_metadata || state->include_extent_data) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1888) block->never_written = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1889) block->iodone_w_error = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1890) if (NULL != bio) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1891) block->is_iodone = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1892) BUG_ON(NULL == bio_is_patched);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1893) if (!*bio_is_patched) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1894) block->orig_bio_private =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1895) bio->bi_private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1896) block->orig_bio_end_io =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1897) bio->bi_end_io;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1898) block->next_in_same_bio = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1899) bio->bi_private = block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1900) bio->bi_end_io = btrfsic_bio_end_io;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1901) *bio_is_patched = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1902) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1903) struct btrfsic_block *chained_block =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1904) (struct btrfsic_block *)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1905) bio->bi_private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1906)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1907) BUG_ON(NULL == chained_block);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1908) block->orig_bio_private =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1909) chained_block->orig_bio_private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1910) block->orig_bio_end_io =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1911) chained_block->orig_bio_end_io;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1912) block->next_in_same_bio = chained_block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1913) bio->bi_private = block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1914) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1915) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1916) block->is_iodone = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1917) block->orig_bio_private = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1918) block->orig_bio_end_io = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1919) block->next_in_same_bio = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1920) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1921) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1922)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1923) block->flush_gen = dev_state->last_flush_gen + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1924) block->submit_bio_bh_rw = submit_bio_bh_rw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1925) if (is_metadata) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1926) block->logical_bytenr = bytenr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1927) block->is_metadata = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1928) if (block->is_superblock) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1929) BUG_ON(PAGE_SIZE !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1930) BTRFS_SUPER_INFO_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1931) ret = btrfsic_process_written_superblock(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1932) state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1933) block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1934) (struct btrfs_super_block *)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1935) mapped_datav[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1936) if (state->print_mask &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1937) BTRFSIC_PRINT_MASK_TREE_AFTER_SB_WRITE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1938) pr_info("[after new superblock is written]:\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1939) btrfsic_dump_tree_sub(state, block, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1940) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1941) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1942) block->mirror_num = 0; /* unknown */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1943) ret = btrfsic_process_metablock(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1944) state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1945) block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1946) &block_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1947) 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1948) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1949) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1950) pr_info("btrfsic: btrfsic_process_metablock(root @%llu) failed!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1951) dev_bytenr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1952) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1953) block->is_metadata = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1954) block->mirror_num = 0; /* unknown */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1955) block->generation = BTRFSIC_GENERATION_UNKNOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1956) if (!state->include_extent_data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1957) && list_empty(&block->ref_from_list)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1958) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1959) * disk block is overwritten with extent
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1960) * data (not meta data) and we are configured
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1961) * to not include extent data: take the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1962) * chance and free the block's memory
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1963) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1964) btrfsic_block_hashtable_remove(block);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1965) list_del(&block->all_blocks_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1966) btrfsic_block_free(block);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1967) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1968) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1969) btrfsic_release_block_ctx(&block_ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1970) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1971) /* block has not been found in hash table */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1972) u64 bytenr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1973)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1974) if (!is_metadata) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1975) processed_len = state->datablock_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1976) if (state->print_mask & BTRFSIC_PRINT_MASK_VERBOSE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1977) pr_info("Written block (%s/%llu/?) !found in hash table, D.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1978) dev_state->name, dev_bytenr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1979) if (!state->include_extent_data) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1980) /* ignore that written D block */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1981) goto continue_loop;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1982) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1983)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1984) /* this is getting ugly for the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1985) * include_extent_data case... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1986) bytenr = 0; /* unknown */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1987) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1988) processed_len = state->metablock_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1989) bytenr = btrfs_stack_header_bytenr(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1990) (struct btrfs_header *)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1991) mapped_datav[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1992) btrfsic_cmp_log_and_dev_bytenr(state, bytenr, dev_state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1993) dev_bytenr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1994) if (state->print_mask & BTRFSIC_PRINT_MASK_VERBOSE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1995) pr_info("Written block @%llu (%s/%llu/?) !found in hash table, M.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1996) bytenr, dev_state->name, dev_bytenr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1997) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1998)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1999) block_ctx.dev = dev_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2000) block_ctx.dev_bytenr = dev_bytenr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2001) block_ctx.start = bytenr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2002) block_ctx.len = processed_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2003) block_ctx.pagev = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2004) block_ctx.mem_to_free = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2005) block_ctx.datav = mapped_datav;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2006)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2007) block = btrfsic_block_alloc();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2008) if (NULL == block) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2009) btrfsic_release_block_ctx(&block_ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2010) goto continue_loop;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2011) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2012) block->dev_state = dev_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2013) block->dev_bytenr = dev_bytenr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2014) block->logical_bytenr = bytenr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2015) block->is_metadata = is_metadata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2016) block->never_written = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2017) block->iodone_w_error = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2018) block->mirror_num = 0; /* unknown */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2019) block->flush_gen = dev_state->last_flush_gen + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2020) block->submit_bio_bh_rw = submit_bio_bh_rw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2021) if (NULL != bio) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2022) block->is_iodone = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2023) BUG_ON(NULL == bio_is_patched);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2024) if (!*bio_is_patched) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2025) block->orig_bio_private = bio->bi_private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2026) block->orig_bio_end_io = bio->bi_end_io;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2027) block->next_in_same_bio = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2028) bio->bi_private = block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2029) bio->bi_end_io = btrfsic_bio_end_io;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2030) *bio_is_patched = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2031) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2032) struct btrfsic_block *chained_block =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2033) (struct btrfsic_block *)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2034) bio->bi_private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2035)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2036) BUG_ON(NULL == chained_block);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2037) block->orig_bio_private =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2038) chained_block->orig_bio_private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2039) block->orig_bio_end_io =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2040) chained_block->orig_bio_end_io;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2041) block->next_in_same_bio = chained_block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2042) bio->bi_private = block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2043) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2044) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2045) block->is_iodone = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2046) block->orig_bio_private = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2047) block->orig_bio_end_io = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2048) block->next_in_same_bio = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2049) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2050) if (state->print_mask & BTRFSIC_PRINT_MASK_VERBOSE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2051) pr_info("New written %c-block @%llu (%s/%llu/%d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2052) is_metadata ? 'M' : 'D',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2053) block->logical_bytenr, block->dev_state->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2054) block->dev_bytenr, block->mirror_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2055) list_add(&block->all_blocks_node, &state->all_blocks_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2056) btrfsic_block_hashtable_add(block, &state->block_hashtable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2057)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2058) if (is_metadata) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2059) ret = btrfsic_process_metablock(state, block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2060) &block_ctx, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2061) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2062) pr_info("btrfsic: process_metablock(root @%llu) failed!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2063) dev_bytenr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2064) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2065) btrfsic_release_block_ctx(&block_ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2066) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2067)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2068) continue_loop:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2069) BUG_ON(!processed_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2070) dev_bytenr += processed_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2071) mapped_datav += processed_len >> PAGE_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2072) num_pages -= processed_len >> PAGE_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2073) goto again;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2074) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2075)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2076) static void btrfsic_bio_end_io(struct bio *bp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2077) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2078) struct btrfsic_block *block = (struct btrfsic_block *)bp->bi_private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2079) int iodone_w_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2080)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2081) /* mutex is not held! This is not save if IO is not yet completed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2082) * on umount */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2083) iodone_w_error = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2084) if (bp->bi_status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2085) iodone_w_error = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2086)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2087) BUG_ON(NULL == block);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2088) bp->bi_private = block->orig_bio_private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2089) bp->bi_end_io = block->orig_bio_end_io;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2090)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2091) do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2092) struct btrfsic_block *next_block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2093) struct btrfsic_dev_state *const dev_state = block->dev_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2094)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2095) if ((dev_state->state->print_mask &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2096) BTRFSIC_PRINT_MASK_END_IO_BIO_BH))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2097) pr_info("bio_end_io(err=%d) for %c @%llu (%s/%llu/%d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2098) bp->bi_status,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2099) btrfsic_get_block_type(dev_state->state, block),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2100) block->logical_bytenr, dev_state->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2101) block->dev_bytenr, block->mirror_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2102) next_block = block->next_in_same_bio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2103) block->iodone_w_error = iodone_w_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2104) if (block->submit_bio_bh_rw & REQ_PREFLUSH) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2105) dev_state->last_flush_gen++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2106) if ((dev_state->state->print_mask &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2107) BTRFSIC_PRINT_MASK_END_IO_BIO_BH))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2108) pr_info("bio_end_io() new %s flush_gen=%llu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2109) dev_state->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2110) dev_state->last_flush_gen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2111) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2112) if (block->submit_bio_bh_rw & REQ_FUA)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2113) block->flush_gen = 0; /* FUA completed means block is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2114) * on disk */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2115) block->is_iodone = 1; /* for FLUSH, this releases the block */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2116) block = next_block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2117) } while (NULL != block);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2119) bp->bi_end_io(bp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2120) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2122) static int btrfsic_process_written_superblock(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2123) struct btrfsic_state *state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2124) struct btrfsic_block *const superblock,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2125) struct btrfs_super_block *const super_hdr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2126) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2127) struct btrfs_fs_info *fs_info = state->fs_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2128) int pass;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2130) superblock->generation = btrfs_super_generation(super_hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2131) if (!(superblock->generation > state->max_superblock_generation ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2132) 0 == state->max_superblock_generation)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2133) if (state->print_mask & BTRFSIC_PRINT_MASK_SUPERBLOCK_WRITE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2134) pr_info("btrfsic: superblock @%llu (%s/%llu/%d) with old gen %llu <= %llu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2135) superblock->logical_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2136) superblock->dev_state->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2137) superblock->dev_bytenr, superblock->mirror_num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2138) btrfs_super_generation(super_hdr),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2139) state->max_superblock_generation);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2140) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2141) if (state->print_mask & BTRFSIC_PRINT_MASK_SUPERBLOCK_WRITE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2142) pr_info("btrfsic: got new superblock @%llu (%s/%llu/%d) with new gen %llu > %llu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2143) superblock->logical_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2144) superblock->dev_state->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2145) superblock->dev_bytenr, superblock->mirror_num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2146) btrfs_super_generation(super_hdr),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2147) state->max_superblock_generation);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2148)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2149) state->max_superblock_generation =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2150) btrfs_super_generation(super_hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2151) state->latest_superblock = superblock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2152) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2154) for (pass = 0; pass < 3; pass++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2155) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2156) u64 next_bytenr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2157) struct btrfsic_block *next_block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2158) struct btrfsic_block_data_ctx tmp_next_block_ctx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2159) struct btrfsic_block_link *l;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2160) int num_copies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2161) int mirror_num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2162) const char *additional_string = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2163) struct btrfs_disk_key tmp_disk_key = {0};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2165) btrfs_set_disk_key_objectid(&tmp_disk_key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2166) BTRFS_ROOT_ITEM_KEY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2167) btrfs_set_disk_key_objectid(&tmp_disk_key, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2169) switch (pass) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2170) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2171) btrfs_set_disk_key_objectid(&tmp_disk_key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2172) BTRFS_ROOT_TREE_OBJECTID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2173) additional_string = "root ";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2174) next_bytenr = btrfs_super_root(super_hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2175) if (state->print_mask &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2176) BTRFSIC_PRINT_MASK_ROOT_CHUNK_LOG_TREE_LOCATION)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2177) pr_info("root@%llu\n", next_bytenr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2178) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2179) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2180) btrfs_set_disk_key_objectid(&tmp_disk_key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2181) BTRFS_CHUNK_TREE_OBJECTID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2182) additional_string = "chunk ";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2183) next_bytenr = btrfs_super_chunk_root(super_hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2184) if (state->print_mask &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2185) BTRFSIC_PRINT_MASK_ROOT_CHUNK_LOG_TREE_LOCATION)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2186) pr_info("chunk@%llu\n", next_bytenr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2187) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2188) case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2189) btrfs_set_disk_key_objectid(&tmp_disk_key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2190) BTRFS_TREE_LOG_OBJECTID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2191) additional_string = "log ";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2192) next_bytenr = btrfs_super_log_root(super_hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2193) if (0 == next_bytenr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2194) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2195) if (state->print_mask &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2196) BTRFSIC_PRINT_MASK_ROOT_CHUNK_LOG_TREE_LOCATION)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2197) pr_info("log@%llu\n", next_bytenr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2198) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2199) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2201) num_copies = btrfs_num_copies(fs_info, next_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2202) BTRFS_SUPER_INFO_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2203) if (state->print_mask & BTRFSIC_PRINT_MASK_NUM_COPIES)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2204) pr_info("num_copies(log_bytenr=%llu) = %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2205) next_bytenr, num_copies);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2206) for (mirror_num = 1; mirror_num <= num_copies; mirror_num++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2207) int was_created;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2208)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2209) if (state->print_mask & BTRFSIC_PRINT_MASK_VERBOSE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2210) pr_info("btrfsic_process_written_superblock(mirror_num=%d)\n", mirror_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2211) ret = btrfsic_map_block(state, next_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2212) BTRFS_SUPER_INFO_SIZE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2213) &tmp_next_block_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2214) mirror_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2215) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2216) pr_info("btrfsic: btrfsic_map_block(@%llu, mirror=%d) failed!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2217) next_bytenr, mirror_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2218) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2219) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2220)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2221) next_block = btrfsic_block_lookup_or_add(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2222) state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2223) &tmp_next_block_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2224) additional_string,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2225) 1, 0, 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2226) mirror_num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2227) &was_created);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2228) if (NULL == next_block) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2229) btrfsic_release_block_ctx(&tmp_next_block_ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2230) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2231) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2232)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2233) next_block->disk_key = tmp_disk_key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2234) if (was_created)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2235) next_block->generation =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2236) BTRFSIC_GENERATION_UNKNOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2237) l = btrfsic_block_link_lookup_or_add(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2238) state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2239) &tmp_next_block_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2240) next_block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2241) superblock,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2242) BTRFSIC_GENERATION_UNKNOWN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2243) btrfsic_release_block_ctx(&tmp_next_block_ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2244) if (NULL == l)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2245) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2246) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2247) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2248)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2249) if (WARN_ON(-1 == btrfsic_check_all_ref_blocks(state, superblock, 0)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2250) btrfsic_dump_tree(state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2252) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2253) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2254)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2255) static int btrfsic_check_all_ref_blocks(struct btrfsic_state *state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2256) struct btrfsic_block *const block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2257) int recursion_level)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2258) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2259) const struct btrfsic_block_link *l;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2260) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2261)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2262) if (recursion_level >= 3 + BTRFS_MAX_LEVEL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2263) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2264) * Note that this situation can happen and does not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2265) * indicate an error in regular cases. It happens
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2266) * when disk blocks are freed and later reused.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2267) * The check-integrity module is not aware of any
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2268) * block free operations, it just recognizes block
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2269) * write operations. Therefore it keeps the linkage
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2270) * information for a block until a block is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2271) * rewritten. This can temporarily cause incorrect
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2272) * and even circular linkage information. This
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2273) * causes no harm unless such blocks are referenced
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2274) * by the most recent super block.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2275) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2276) if (state->print_mask & BTRFSIC_PRINT_MASK_VERBOSE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2277) pr_info("btrfsic: abort cyclic linkage (case 1).\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2278)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2279) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2280) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2281)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2282) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2283) * This algorithm is recursive because the amount of used stack
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2284) * space is very small and the max recursion depth is limited.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2285) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2286) list_for_each_entry(l, &block->ref_to_list, node_ref_to) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2287) if (state->print_mask & BTRFSIC_PRINT_MASK_VERBOSE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2288) pr_info("rl=%d, %c @%llu (%s/%llu/%d) %u* refers to %c @%llu (%s/%llu/%d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2289) recursion_level,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2290) btrfsic_get_block_type(state, block),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2291) block->logical_bytenr, block->dev_state->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2292) block->dev_bytenr, block->mirror_num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2293) l->ref_cnt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2294) btrfsic_get_block_type(state, l->block_ref_to),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2295) l->block_ref_to->logical_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2296) l->block_ref_to->dev_state->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2297) l->block_ref_to->dev_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2298) l->block_ref_to->mirror_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2299) if (l->block_ref_to->never_written) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2300) pr_info("btrfs: attempt to write superblock which references block %c @%llu (%s/%llu/%d) which is never written!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2301) btrfsic_get_block_type(state, l->block_ref_to),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2302) l->block_ref_to->logical_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2303) l->block_ref_to->dev_state->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2304) l->block_ref_to->dev_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2305) l->block_ref_to->mirror_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2306) ret = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2307) } else if (!l->block_ref_to->is_iodone) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2308) pr_info("btrfs: attempt to write superblock which references block %c @%llu (%s/%llu/%d) which is not yet iodone!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2309) btrfsic_get_block_type(state, l->block_ref_to),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2310) l->block_ref_to->logical_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2311) l->block_ref_to->dev_state->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2312) l->block_ref_to->dev_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2313) l->block_ref_to->mirror_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2314) ret = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2315) } else if (l->block_ref_to->iodone_w_error) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2316) pr_info("btrfs: attempt to write superblock which references block %c @%llu (%s/%llu/%d) which has write error!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2317) btrfsic_get_block_type(state, l->block_ref_to),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2318) l->block_ref_to->logical_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2319) l->block_ref_to->dev_state->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2320) l->block_ref_to->dev_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2321) l->block_ref_to->mirror_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2322) ret = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2323) } else if (l->parent_generation !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2324) l->block_ref_to->generation &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2325) BTRFSIC_GENERATION_UNKNOWN !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2326) l->parent_generation &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2327) BTRFSIC_GENERATION_UNKNOWN !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2328) l->block_ref_to->generation) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2329) pr_info("btrfs: attempt to write superblock which references block %c @%llu (%s/%llu/%d) with generation %llu != parent generation %llu!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2330) btrfsic_get_block_type(state, l->block_ref_to),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2331) l->block_ref_to->logical_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2332) l->block_ref_to->dev_state->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2333) l->block_ref_to->dev_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2334) l->block_ref_to->mirror_num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2335) l->block_ref_to->generation,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2336) l->parent_generation);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2337) ret = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2338) } else if (l->block_ref_to->flush_gen >
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2339) l->block_ref_to->dev_state->last_flush_gen) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2340) pr_info("btrfs: attempt to write superblock which references block %c @%llu (%s/%llu/%d) which is not flushed out of disk's write cache (block flush_gen=%llu, dev->flush_gen=%llu)!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2341) btrfsic_get_block_type(state, l->block_ref_to),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2342) l->block_ref_to->logical_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2343) l->block_ref_to->dev_state->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2344) l->block_ref_to->dev_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2345) l->block_ref_to->mirror_num, block->flush_gen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2346) l->block_ref_to->dev_state->last_flush_gen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2347) ret = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2348) } else if (-1 == btrfsic_check_all_ref_blocks(state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2349) l->block_ref_to,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2350) recursion_level +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2351) 1)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2352) ret = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2353) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2354) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2355)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2356) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2357) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2358)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2359) static int btrfsic_is_block_ref_by_superblock(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2360) const struct btrfsic_state *state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2361) const struct btrfsic_block *block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2362) int recursion_level)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2363) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2364) const struct btrfsic_block_link *l;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2365)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2366) if (recursion_level >= 3 + BTRFS_MAX_LEVEL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2367) /* refer to comment at "abort cyclic linkage (case 1)" */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2368) if (state->print_mask & BTRFSIC_PRINT_MASK_VERBOSE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2369) pr_info("btrfsic: abort cyclic linkage (case 2).\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2370)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2371) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2372) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2373)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2374) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2375) * This algorithm is recursive because the amount of used stack space
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2376) * is very small and the max recursion depth is limited.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2377) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2378) list_for_each_entry(l, &block->ref_from_list, node_ref_from) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2379) if (state->print_mask & BTRFSIC_PRINT_MASK_VERBOSE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2380) pr_info("rl=%d, %c @%llu (%s/%llu/%d) is ref %u* from %c @%llu (%s/%llu/%d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2381) recursion_level,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2382) btrfsic_get_block_type(state, block),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2383) block->logical_bytenr, block->dev_state->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2384) block->dev_bytenr, block->mirror_num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2385) l->ref_cnt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2386) btrfsic_get_block_type(state, l->block_ref_from),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2387) l->block_ref_from->logical_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2388) l->block_ref_from->dev_state->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2389) l->block_ref_from->dev_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2390) l->block_ref_from->mirror_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2391) if (l->block_ref_from->is_superblock &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2392) state->latest_superblock->dev_bytenr ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2393) l->block_ref_from->dev_bytenr &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2394) state->latest_superblock->dev_state->bdev ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2395) l->block_ref_from->dev_state->bdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2396) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2397) else if (btrfsic_is_block_ref_by_superblock(state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2398) l->block_ref_from,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2399) recursion_level +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2400) 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2401) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2402) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2403)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2404) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2405) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2406)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2407) static void btrfsic_print_add_link(const struct btrfsic_state *state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2408) const struct btrfsic_block_link *l)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2409) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2410) pr_info("Add %u* link from %c @%llu (%s/%llu/%d) to %c @%llu (%s/%llu/%d).\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2411) l->ref_cnt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2412) btrfsic_get_block_type(state, l->block_ref_from),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2413) l->block_ref_from->logical_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2414) l->block_ref_from->dev_state->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2415) l->block_ref_from->dev_bytenr, l->block_ref_from->mirror_num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2416) btrfsic_get_block_type(state, l->block_ref_to),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2417) l->block_ref_to->logical_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2418) l->block_ref_to->dev_state->name, l->block_ref_to->dev_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2419) l->block_ref_to->mirror_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2420) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2421)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2422) static void btrfsic_print_rem_link(const struct btrfsic_state *state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2423) const struct btrfsic_block_link *l)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2424) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2425) pr_info("Rem %u* link from %c @%llu (%s/%llu/%d) to %c @%llu (%s/%llu/%d).\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2426) l->ref_cnt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2427) btrfsic_get_block_type(state, l->block_ref_from),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2428) l->block_ref_from->logical_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2429) l->block_ref_from->dev_state->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2430) l->block_ref_from->dev_bytenr, l->block_ref_from->mirror_num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2431) btrfsic_get_block_type(state, l->block_ref_to),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2432) l->block_ref_to->logical_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2433) l->block_ref_to->dev_state->name, l->block_ref_to->dev_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2434) l->block_ref_to->mirror_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2435) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2436)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2437) static char btrfsic_get_block_type(const struct btrfsic_state *state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2438) const struct btrfsic_block *block)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2439) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2440) if (block->is_superblock &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2441) state->latest_superblock->dev_bytenr == block->dev_bytenr &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2442) state->latest_superblock->dev_state->bdev == block->dev_state->bdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2443) return 'S';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2444) else if (block->is_superblock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2445) return 's';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2446) else if (block->is_metadata)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2447) return 'M';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2448) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2449) return 'D';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2450) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2451)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2452) static void btrfsic_dump_tree(const struct btrfsic_state *state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2453) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2454) btrfsic_dump_tree_sub(state, state->latest_superblock, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2455) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2456)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2457) static void btrfsic_dump_tree_sub(const struct btrfsic_state *state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2458) const struct btrfsic_block *block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2459) int indent_level)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2460) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2461) const struct btrfsic_block_link *l;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2462) int indent_add;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2463) static char buf[80];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2464) int cursor_position;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2465)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2466) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2467) * Should better fill an on-stack buffer with a complete line and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2468) * dump it at once when it is time to print a newline character.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2469) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2470)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2471) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2472) * This algorithm is recursive because the amount of used stack space
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2473) * is very small and the max recursion depth is limited.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2474) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2475) indent_add = sprintf(buf, "%c-%llu(%s/%llu/%u)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2476) btrfsic_get_block_type(state, block),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2477) block->logical_bytenr, block->dev_state->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2478) block->dev_bytenr, block->mirror_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2479) if (indent_level + indent_add > BTRFSIC_TREE_DUMP_MAX_INDENT_LEVEL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2480) printk("[...]\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2481) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2482) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2483) printk(buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2484) indent_level += indent_add;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2485) if (list_empty(&block->ref_to_list)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2486) printk("\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2487) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2488) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2489) if (block->mirror_num > 1 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2490) !(state->print_mask & BTRFSIC_PRINT_MASK_TREE_WITH_ALL_MIRRORS)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2491) printk(" [...]\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2492) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2493) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2494)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2495) cursor_position = indent_level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2496) list_for_each_entry(l, &block->ref_to_list, node_ref_to) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2497) while (cursor_position < indent_level) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2498) printk(" ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2499) cursor_position++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2500) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2501) if (l->ref_cnt > 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2502) indent_add = sprintf(buf, " %d*--> ", l->ref_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2503) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2504) indent_add = sprintf(buf, " --> ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2505) if (indent_level + indent_add >
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2506) BTRFSIC_TREE_DUMP_MAX_INDENT_LEVEL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2507) printk("[...]\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2508) cursor_position = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2509) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2510) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2511)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2512) printk(buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2513)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2514) btrfsic_dump_tree_sub(state, l->block_ref_to,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2515) indent_level + indent_add);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2516) cursor_position = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2517) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2518) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2519)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2520) static struct btrfsic_block_link *btrfsic_block_link_lookup_or_add(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2521) struct btrfsic_state *state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2522) struct btrfsic_block_data_ctx *next_block_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2523) struct btrfsic_block *next_block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2524) struct btrfsic_block *from_block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2525) u64 parent_generation)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2526) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2527) struct btrfsic_block_link *l;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2528)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2529) l = btrfsic_block_link_hashtable_lookup(next_block_ctx->dev->bdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2530) next_block_ctx->dev_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2531) from_block->dev_state->bdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2532) from_block->dev_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2533) &state->block_link_hashtable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2534) if (NULL == l) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2535) l = btrfsic_block_link_alloc();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2536) if (!l)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2537) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2538)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2539) l->block_ref_to = next_block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2540) l->block_ref_from = from_block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2541) l->ref_cnt = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2542) l->parent_generation = parent_generation;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2543)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2544) if (state->print_mask & BTRFSIC_PRINT_MASK_VERBOSE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2545) btrfsic_print_add_link(state, l);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2546)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2547) list_add(&l->node_ref_to, &from_block->ref_to_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2548) list_add(&l->node_ref_from, &next_block->ref_from_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2549)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2550) btrfsic_block_link_hashtable_add(l,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2551) &state->block_link_hashtable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2552) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2553) l->ref_cnt++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2554) l->parent_generation = parent_generation;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2555) if (state->print_mask & BTRFSIC_PRINT_MASK_VERBOSE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2556) btrfsic_print_add_link(state, l);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2557) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2558)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2559) return l;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2560) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2561)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2562) static struct btrfsic_block *btrfsic_block_lookup_or_add(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2563) struct btrfsic_state *state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2564) struct btrfsic_block_data_ctx *block_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2565) const char *additional_string,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2566) int is_metadata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2567) int is_iodone,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2568) int never_written,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2569) int mirror_num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2570) int *was_created)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2571) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2572) struct btrfsic_block *block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2573)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2574) block = btrfsic_block_hashtable_lookup(block_ctx->dev->bdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2575) block_ctx->dev_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2576) &state->block_hashtable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2577) if (NULL == block) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2578) struct btrfsic_dev_state *dev_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2579)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2580) block = btrfsic_block_alloc();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2581) if (!block)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2582) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2583)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2584) dev_state = btrfsic_dev_state_lookup(block_ctx->dev->bdev->bd_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2585) if (NULL == dev_state) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2586) pr_info("btrfsic: error, lookup dev_state failed!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2587) btrfsic_block_free(block);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2588) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2589) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2590) block->dev_state = dev_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2591) block->dev_bytenr = block_ctx->dev_bytenr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2592) block->logical_bytenr = block_ctx->start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2593) block->is_metadata = is_metadata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2594) block->is_iodone = is_iodone;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2595) block->never_written = never_written;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2596) block->mirror_num = mirror_num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2597) if (state->print_mask & BTRFSIC_PRINT_MASK_VERBOSE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2598) pr_info("New %s%c-block @%llu (%s/%llu/%d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2599) additional_string,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2600) btrfsic_get_block_type(state, block),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2601) block->logical_bytenr, dev_state->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2602) block->dev_bytenr, mirror_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2603) list_add(&block->all_blocks_node, &state->all_blocks_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2604) btrfsic_block_hashtable_add(block, &state->block_hashtable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2605) if (NULL != was_created)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2606) *was_created = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2607) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2608) if (NULL != was_created)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2609) *was_created = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2610) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2611)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2612) return block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2613) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2614)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2615) static void btrfsic_cmp_log_and_dev_bytenr(struct btrfsic_state *state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2616) u64 bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2617) struct btrfsic_dev_state *dev_state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2618) u64 dev_bytenr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2619) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2620) struct btrfs_fs_info *fs_info = state->fs_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2621) struct btrfsic_block_data_ctx block_ctx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2622) int num_copies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2623) int mirror_num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2624) int match = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2625) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2626)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2627) num_copies = btrfs_num_copies(fs_info, bytenr, state->metablock_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2628)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2629) for (mirror_num = 1; mirror_num <= num_copies; mirror_num++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2630) ret = btrfsic_map_block(state, bytenr, state->metablock_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2631) &block_ctx, mirror_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2632) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2633) pr_info("btrfsic: btrfsic_map_block(logical @%llu, mirror %d) failed!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2634) bytenr, mirror_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2635) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2636) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2637)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2638) if (dev_state->bdev == block_ctx.dev->bdev &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2639) dev_bytenr == block_ctx.dev_bytenr) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2640) match++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2641) btrfsic_release_block_ctx(&block_ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2642) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2643) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2644) btrfsic_release_block_ctx(&block_ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2645) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2646)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2647) if (WARN_ON(!match)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2648) pr_info("btrfs: attempt to write M-block which contains logical bytenr that doesn't map to dev+physical bytenr of submit_bio, buffer->log_bytenr=%llu, submit_bio(bdev=%s, phys_bytenr=%llu)!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2649) bytenr, dev_state->name, dev_bytenr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2650) for (mirror_num = 1; mirror_num <= num_copies; mirror_num++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2651) ret = btrfsic_map_block(state, bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2652) state->metablock_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2653) &block_ctx, mirror_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2654) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2655) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2656)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2657) pr_info("Read logical bytenr @%llu maps to (%s/%llu/%d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2658) bytenr, block_ctx.dev->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2659) block_ctx.dev_bytenr, mirror_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2660) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2661) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2662) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2663)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2664) static struct btrfsic_dev_state *btrfsic_dev_state_lookup(dev_t dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2665) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2666) return btrfsic_dev_state_hashtable_lookup(dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2667) &btrfsic_dev_state_hashtable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2668) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2669)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2670) static void __btrfsic_submit_bio(struct bio *bio)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2671) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2672) struct btrfsic_dev_state *dev_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2673)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2674) if (!btrfsic_is_initialized)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2675) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2676)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2677) mutex_lock(&btrfsic_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2678) /* since btrfsic_submit_bio() is also called before
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2679) * btrfsic_mount(), this might return NULL */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2680) dev_state = btrfsic_dev_state_lookup(bio_dev(bio) + bio->bi_partno);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2681) if (NULL != dev_state &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2682) (bio_op(bio) == REQ_OP_WRITE) && bio_has_data(bio)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2683) unsigned int i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2684) u64 dev_bytenr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2685) u64 cur_bytenr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2686) struct bio_vec bvec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2687) struct bvec_iter iter;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2688) int bio_is_patched;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2689) char **mapped_datav;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2690) unsigned int segs = bio_segments(bio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2691)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2692) dev_bytenr = 512 * bio->bi_iter.bi_sector;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2693) bio_is_patched = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2694) if (dev_state->state->print_mask &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2695) BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2696) pr_info("submit_bio(rw=%d,0x%x, bi_vcnt=%u, bi_sector=%llu (bytenr %llu), bi_disk=%p)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2697) bio_op(bio), bio->bi_opf, segs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2698) (unsigned long long)bio->bi_iter.bi_sector,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2699) dev_bytenr, bio->bi_disk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2700)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2701) mapped_datav = kmalloc_array(segs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2702) sizeof(*mapped_datav), GFP_NOFS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2703) if (!mapped_datav)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2704) goto leave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2705) cur_bytenr = dev_bytenr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2706)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2707) bio_for_each_segment(bvec, bio, iter) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2708) BUG_ON(bvec.bv_len != PAGE_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2709) mapped_datav[i] = kmap(bvec.bv_page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2710) i++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2711)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2712) if (dev_state->state->print_mask &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2713) BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH_VERBOSE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2714) pr_info("#%u: bytenr=%llu, len=%u, offset=%u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2715) i, cur_bytenr, bvec.bv_len, bvec.bv_offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2716) cur_bytenr += bvec.bv_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2717) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2718) btrfsic_process_written_block(dev_state, dev_bytenr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2719) mapped_datav, segs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2720) bio, &bio_is_patched,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2721) bio->bi_opf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2722) bio_for_each_segment(bvec, bio, iter)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2723) kunmap(bvec.bv_page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2724) kfree(mapped_datav);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2725) } else if (NULL != dev_state && (bio->bi_opf & REQ_PREFLUSH)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2726) if (dev_state->state->print_mask &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2727) BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2728) pr_info("submit_bio(rw=%d,0x%x FLUSH, disk=%p)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2729) bio_op(bio), bio->bi_opf, bio->bi_disk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2730) if (!dev_state->dummy_block_for_bio_bh_flush.is_iodone) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2731) if ((dev_state->state->print_mask &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2732) (BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2733) BTRFSIC_PRINT_MASK_VERBOSE)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2734) pr_info("btrfsic_submit_bio(%s) with FLUSH but dummy block already in use (ignored)!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2735) dev_state->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2736) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2737) struct btrfsic_block *const block =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2738) &dev_state->dummy_block_for_bio_bh_flush;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2739)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2740) block->is_iodone = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2741) block->never_written = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2742) block->iodone_w_error = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2743) block->flush_gen = dev_state->last_flush_gen + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2744) block->submit_bio_bh_rw = bio->bi_opf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2745) block->orig_bio_private = bio->bi_private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2746) block->orig_bio_end_io = bio->bi_end_io;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2747) block->next_in_same_bio = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2748) bio->bi_private = block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2749) bio->bi_end_io = btrfsic_bio_end_io;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2750) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2751) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2752) leave:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2753) mutex_unlock(&btrfsic_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2754) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2755)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2756) void btrfsic_submit_bio(struct bio *bio)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2757) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2758) __btrfsic_submit_bio(bio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2759) submit_bio(bio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2760) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2761)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2762) int btrfsic_submit_bio_wait(struct bio *bio)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2763) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2764) __btrfsic_submit_bio(bio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2765) return submit_bio_wait(bio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2766) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2767)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2768) int btrfsic_mount(struct btrfs_fs_info *fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2769) struct btrfs_fs_devices *fs_devices,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2770) int including_extent_data, u32 print_mask)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2771) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2772) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2773) struct btrfsic_state *state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2774) struct list_head *dev_head = &fs_devices->devices;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2775) struct btrfs_device *device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2776)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2777) if (!PAGE_ALIGNED(fs_info->nodesize)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2778) pr_info("btrfsic: cannot handle nodesize %d not being a multiple of PAGE_SIZE %ld!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2779) fs_info->nodesize, PAGE_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2780) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2781) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2782) if (!PAGE_ALIGNED(fs_info->sectorsize)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2783) pr_info("btrfsic: cannot handle sectorsize %d not being a multiple of PAGE_SIZE %ld!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2784) fs_info->sectorsize, PAGE_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2785) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2786) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2787) state = kvzalloc(sizeof(*state), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2788) if (!state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2789) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2790)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2791) if (!btrfsic_is_initialized) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2792) mutex_init(&btrfsic_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2793) btrfsic_dev_state_hashtable_init(&btrfsic_dev_state_hashtable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2794) btrfsic_is_initialized = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2795) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2796) mutex_lock(&btrfsic_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2797) state->fs_info = fs_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2798) state->print_mask = print_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2799) state->include_extent_data = including_extent_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2800) state->csum_size = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2801) state->metablock_size = fs_info->nodesize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2802) state->datablock_size = fs_info->sectorsize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2803) INIT_LIST_HEAD(&state->all_blocks_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2804) btrfsic_block_hashtable_init(&state->block_hashtable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2805) btrfsic_block_link_hashtable_init(&state->block_link_hashtable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2806) state->max_superblock_generation = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2807) state->latest_superblock = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2808)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2809) list_for_each_entry(device, dev_head, dev_list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2810) struct btrfsic_dev_state *ds;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2811) const char *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2812)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2813) if (!device->bdev || !device->name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2814) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2815)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2816) ds = btrfsic_dev_state_alloc();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2817) if (NULL == ds) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2818) mutex_unlock(&btrfsic_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2819) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2820) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2821) ds->bdev = device->bdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2822) ds->state = state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2823) bdevname(ds->bdev, ds->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2824) ds->name[BDEVNAME_SIZE - 1] = '\0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2825) p = kbasename(ds->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2826) strlcpy(ds->name, p, sizeof(ds->name));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2827) btrfsic_dev_state_hashtable_add(ds,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2828) &btrfsic_dev_state_hashtable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2829) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2830)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2831) ret = btrfsic_process_superblock(state, fs_devices);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2832) if (0 != ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2833) mutex_unlock(&btrfsic_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2834) btrfsic_unmount(fs_devices);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2835) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2836) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2837)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2838) if (state->print_mask & BTRFSIC_PRINT_MASK_INITIAL_DATABASE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2839) btrfsic_dump_database(state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2840) if (state->print_mask & BTRFSIC_PRINT_MASK_INITIAL_TREE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2841) btrfsic_dump_tree(state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2842)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2843) mutex_unlock(&btrfsic_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2844) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2845) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2846)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2847) void btrfsic_unmount(struct btrfs_fs_devices *fs_devices)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2848) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2849) struct btrfsic_block *b_all, *tmp_all;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2850) struct btrfsic_state *state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2851) struct list_head *dev_head = &fs_devices->devices;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2852) struct btrfs_device *device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2853)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2854) if (!btrfsic_is_initialized)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2855) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2856)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2857) mutex_lock(&btrfsic_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2858)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2859) state = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2860) list_for_each_entry(device, dev_head, dev_list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2861) struct btrfsic_dev_state *ds;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2862)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2863) if (!device->bdev || !device->name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2864) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2865)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2866) ds = btrfsic_dev_state_hashtable_lookup(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2867) device->bdev->bd_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2868) &btrfsic_dev_state_hashtable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2869) if (NULL != ds) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2870) state = ds->state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2871) btrfsic_dev_state_hashtable_remove(ds);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2872) btrfsic_dev_state_free(ds);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2873) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2874) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2875)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2876) if (NULL == state) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2877) pr_info("btrfsic: error, cannot find state information on umount!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2878) mutex_unlock(&btrfsic_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2879) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2880) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2881)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2882) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2883) * Don't care about keeping the lists' state up to date,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2884) * just free all memory that was allocated dynamically.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2885) * Free the blocks and the block_links.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2886) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2887) list_for_each_entry_safe(b_all, tmp_all, &state->all_blocks_list,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2888) all_blocks_node) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2889) struct btrfsic_block_link *l, *tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2890)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2891) list_for_each_entry_safe(l, tmp, &b_all->ref_to_list,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2892) node_ref_to) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2893) if (state->print_mask & BTRFSIC_PRINT_MASK_VERBOSE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2894) btrfsic_print_rem_link(state, l);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2895)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2896) l->ref_cnt--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2897) if (0 == l->ref_cnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2898) btrfsic_block_link_free(l);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2899) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2900)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2901) if (b_all->is_iodone || b_all->never_written)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2902) btrfsic_block_free(b_all);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2903) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2904) pr_info("btrfs: attempt to free %c-block @%llu (%s/%llu/%d) on umount which is not yet iodone!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2905) btrfsic_get_block_type(state, b_all),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2906) b_all->logical_bytenr, b_all->dev_state->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2907) b_all->dev_bytenr, b_all->mirror_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2908) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2909)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2910) mutex_unlock(&btrfsic_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2911)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2912) kvfree(state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2913) }