Lines Matching full:block

26  * Code is added that examines all block write requests during
27 * runtime (including writes of the super block). Three rules
30 * 1. It is not allowed to write a disk block which is
31 * currently referenced by the super block (either directly
33 * 2. When a super block is written, it is verified that all
38 * referenced by the super block) or they have been
49 * block.
67 * the tree that the super block references to kernel messages
68 * each time after a super block was written:
76 * the integrity of (super)-block write requests, do not
138 unsigned int never_written:1; /* block was added because it was
167 * each block object can refer to and can be ref from multiple blocks.
169 * the block ref to plus the one from the block refered from.
174 * as a write operation to a block while that block is still referenced).
228 struct btrfsic_block *block; member
292 struct btrfsic_block *block,
298 struct btrfsic_block *block,
309 struct btrfsic_block *block,
332 struct btrfsic_block *const block,
337 const struct btrfsic_block *block,
340 struct btrfsic_block *const block,
347 const struct btrfsic_block *block);
350 const struct btrfsic_block *block,
801 /* super block bytenr is always the unmapped device bytenr */ in btrfsic_process_superblock_dev_mirror()
839 printk(KERN_INFO "New initial S-block (bdev %p, %s)" in btrfsic_process_superblock_dev_mirror()
981 sf->block = first_block; in btrfsic_process_metablock()
988 sf->block->generation = le64_to_cpu(sf->hdr->generation); in btrfsic_process_metablock()
1035 sf->block, in btrfsic_process_metablock()
1065 next_stack->block = sf->next_block; in btrfsic_process_metablock()
1080 sf->block, in btrfsic_process_metablock()
1122 sf->block, in btrfsic_process_metablock()
1146 next_stack->block = sf->next_block; in btrfsic_process_metablock()
1165 /* the one for the initial block is freed in the caller */ in btrfsic_process_metablock()
1187 struct btrfsic_block *block, in btrfsic_create_link_to_next_block() argument
1253 "Referenced block @%llu (%s/%llu/%d)" in btrfsic_create_link_to_next_block()
1264 "Referenced block @%llu (%s/%llu/%d)" in btrfsic_create_link_to_next_block()
1294 l->block_ref_from = block; in btrfsic_create_link_to_next_block()
1301 list_add(&l->node_ref_to, &block->ref_to_list); in btrfsic_create_link_to_next_block()
1320 "btrfsic: read block @logical %llu failed!\n", in btrfsic_create_link_to_next_block()
1338 struct btrfsic_block *block, in btrfsic_handle_extent_data() argument
1428 "Referenced block" in btrfsic_handle_extent_data()
1447 next_block, block, in btrfsic_handle_extent_data()
1558 printk(KERN_INFO "%c-block @%llu (%s/%llu/%d)\n", in btrfsic_dump_database()
1617 * Test whether the disk block contains a tree block (leaf or node)
1618 * (note that this test fails for the super block)
1651 struct btrfsic_block *block; in btrfsic_process_written_block() local
1662 block = btrfsic_block_hashtable_lookup(bdev, dev_bytenr, in btrfsic_process_written_block()
1664 if (NULL != block) { in btrfsic_process_written_block()
1669 if (block->is_superblock) { in btrfsic_process_written_block()
1677 btrfsic_dump_tree_sub(state, block, 0); in btrfsic_process_written_block()
1681 if (!block->is_superblock) { in btrfsic_process_written_block()
1689 if (block->logical_bytenr != bytenr) { in btrfsic_process_written_block()
1691 "Written block @%llu (%s/%llu/%d)" in btrfsic_process_written_block()
1698 block->mirror_num, in btrfsic_process_written_block()
1699 btrfsic_get_block_type(state, block), in btrfsic_process_written_block()
1701 block->logical_bytenr); in btrfsic_process_written_block()
1702 block->logical_bytenr = bytenr; in btrfsic_process_written_block()
1706 "Written block @%llu (%s/%llu/%d)" in btrfsic_process_written_block()
1711 block->mirror_num, in btrfsic_process_written_block()
1712 btrfsic_get_block_type(state, block)); in btrfsic_process_written_block()
1714 bytenr = block->logical_bytenr; in btrfsic_process_written_block()
1717 "Written block @%llu (%s/%llu/%d)" in btrfsic_process_written_block()
1722 block->mirror_num, in btrfsic_process_written_block()
1723 btrfsic_get_block_type(state, block)); in btrfsic_process_written_block()
1729 list_empty(&block->ref_to_list) ? ' ' : '!', in btrfsic_process_written_block()
1730 list_empty(&block->ref_from_list) ? ' ' : '!'); in btrfsic_process_written_block()
1731 if (btrfsic_is_block_ref_by_superblock(state, block, 0)) { in btrfsic_process_written_block()
1732 printk(KERN_INFO "btrfs: attempt to overwrite %c-block" in btrfsic_process_written_block()
1738 btrfsic_get_block_type(state, block), in btrfsic_process_written_block()
1742 block->mirror_num, in btrfsic_process_written_block()
1743 (unsigned long long)block->generation, in btrfsic_process_written_block()
1745 le64_to_cpu(block->disk_key.objectid), in btrfsic_process_written_block()
1746 block->disk_key.type, in btrfsic_process_written_block()
1748 le64_to_cpu(block->disk_key.offset), in btrfsic_process_written_block()
1757 if (!block->is_iodone && !block->never_written) { in btrfsic_process_written_block()
1758 printk(KERN_INFO "btrfs: attempt to overwrite %c-block" in btrfsic_process_written_block()
1761 btrfsic_get_block_type(state, block), in btrfsic_process_written_block()
1765 block->mirror_num, in btrfsic_process_written_block()
1766 (unsigned long long)block->generation, in btrfsic_process_written_block()
1776 * Clear all references of this block. Do not free in btrfsic_process_written_block()
1777 * the block itself even if is not referenced anymore in btrfsic_process_written_block()
1782 &block->ref_to_list) { in btrfsic_process_written_block()
1799 if (block->is_superblock) in btrfsic_process_written_block()
1818 block->never_written = 0; in btrfsic_process_written_block()
1819 block->iodone_w_error = 0; in btrfsic_process_written_block()
1821 block->is_iodone = 0; in btrfsic_process_written_block()
1824 block->orig_bio_bh_private = in btrfsic_process_written_block()
1826 block->orig_bio_bh_end_io.bio = in btrfsic_process_written_block()
1828 block->next_in_same_bio = NULL; in btrfsic_process_written_block()
1829 bio->bi_private = block; in btrfsic_process_written_block()
1838 block->orig_bio_bh_private = in btrfsic_process_written_block()
1840 block->orig_bio_bh_end_io.bio = in btrfsic_process_written_block()
1843 block->next_in_same_bio = chained_block; in btrfsic_process_written_block()
1844 bio->bi_private = block; in btrfsic_process_written_block()
1847 block->is_iodone = 0; in btrfsic_process_written_block()
1848 block->orig_bio_bh_private = bh->b_private; in btrfsic_process_written_block()
1849 block->orig_bio_bh_end_io.bh = bh->b_end_io; in btrfsic_process_written_block()
1850 block->next_in_same_bio = NULL; in btrfsic_process_written_block()
1851 bh->b_private = block; in btrfsic_process_written_block()
1854 block->is_iodone = 1; in btrfsic_process_written_block()
1855 block->orig_bio_bh_private = NULL; in btrfsic_process_written_block()
1856 block->orig_bio_bh_end_io.bio = NULL; in btrfsic_process_written_block()
1857 block->next_in_same_bio = NULL; in btrfsic_process_written_block()
1861 block->flush_gen = dev_state->last_flush_gen + 1; in btrfsic_process_written_block()
1862 block->submit_bio_bh_rw = submit_bio_bh_rw; in btrfsic_process_written_block()
1864 block->logical_bytenr = bytenr; in btrfsic_process_written_block()
1865 block->is_metadata = 1; in btrfsic_process_written_block()
1866 if (block->is_superblock) { in btrfsic_process_written_block()
1869 block, in btrfsic_process_written_block()
1876 btrfsic_dump_tree_sub(state, block, 0); in btrfsic_process_written_block()
1879 block->mirror_num = 0; /* unknown */ in btrfsic_process_written_block()
1882 block, in btrfsic_process_written_block()
1894 block->is_metadata = 0; in btrfsic_process_written_block()
1895 block->mirror_num = 0; /* unknown */ in btrfsic_process_written_block()
1896 block->generation = BTRFSIC_GENERATION_UNKNOWN; in btrfsic_process_written_block()
1898 && list_empty(&block->ref_from_list)) { in btrfsic_process_written_block()
1900 * disk block is overwritten with extent in btrfsic_process_written_block()
1903 * chance and free the block's memory in btrfsic_process_written_block()
1905 btrfsic_block_hashtable_remove(block); in btrfsic_process_written_block()
1906 list_del(&block->all_blocks_node); in btrfsic_process_written_block()
1907 btrfsic_block_free(block); in btrfsic_process_written_block()
1912 /* block has not been found in hash table */ in btrfsic_process_written_block()
1917 printk(KERN_INFO "Written block (%s/%llu/?)" in btrfsic_process_written_block()
1922 return; /* ignore that written D block */ in btrfsic_process_written_block()
1938 "Written block @%llu (%s/%llu/?)" in btrfsic_process_written_block()
1960 block = btrfsic_block_alloc(); in btrfsic_process_written_block()
1961 if (NULL == block) { in btrfsic_process_written_block()
1966 block->dev_state = dev_state; in btrfsic_process_written_block()
1967 block->dev_bytenr = dev_bytenr; in btrfsic_process_written_block()
1968 block->logical_bytenr = bytenr; in btrfsic_process_written_block()
1969 block->is_metadata = is_metadata; in btrfsic_process_written_block()
1970 block->never_written = 0; in btrfsic_process_written_block()
1971 block->iodone_w_error = 0; in btrfsic_process_written_block()
1972 block->mirror_num = 0; /* unknown */ in btrfsic_process_written_block()
1973 block->flush_gen = dev_state->last_flush_gen + 1; in btrfsic_process_written_block()
1974 block->submit_bio_bh_rw = submit_bio_bh_rw; in btrfsic_process_written_block()
1976 block->is_iodone = 0; in btrfsic_process_written_block()
1979 block->orig_bio_bh_private = bio->bi_private; in btrfsic_process_written_block()
1980 block->orig_bio_bh_end_io.bio = bio->bi_end_io; in btrfsic_process_written_block()
1981 block->next_in_same_bio = NULL; in btrfsic_process_written_block()
1982 bio->bi_private = block; in btrfsic_process_written_block()
1991 block->orig_bio_bh_private = in btrfsic_process_written_block()
1993 block->orig_bio_bh_end_io.bio = in btrfsic_process_written_block()
1995 block->next_in_same_bio = chained_block; in btrfsic_process_written_block()
1996 bio->bi_private = block; in btrfsic_process_written_block()
1999 block->is_iodone = 0; in btrfsic_process_written_block()
2000 block->orig_bio_bh_private = bh->b_private; in btrfsic_process_written_block()
2001 block->orig_bio_bh_end_io.bh = bh->b_end_io; in btrfsic_process_written_block()
2002 block->next_in_same_bio = NULL; in btrfsic_process_written_block()
2003 bh->b_private = block; in btrfsic_process_written_block()
2006 block->is_iodone = 1; in btrfsic_process_written_block()
2007 block->orig_bio_bh_private = NULL; in btrfsic_process_written_block()
2008 block->orig_bio_bh_end_io.bio = NULL; in btrfsic_process_written_block()
2009 block->next_in_same_bio = NULL; in btrfsic_process_written_block()
2013 "New written %c-block @%llu (%s/%llu/%d)\n", in btrfsic_process_written_block()
2015 (unsigned long long)block->logical_bytenr, in btrfsic_process_written_block()
2016 block->dev_state->name, in btrfsic_process_written_block()
2017 (unsigned long long)block->dev_bytenr, in btrfsic_process_written_block()
2018 block->mirror_num); in btrfsic_process_written_block()
2019 list_add(&block->all_blocks_node, &state->all_blocks_list); in btrfsic_process_written_block()
2020 btrfsic_block_hashtable_add(block, &state->block_hashtable); in btrfsic_process_written_block()
2023 ret = btrfsic_process_metablock(state, block, in btrfsic_process_written_block()
2039 struct btrfsic_block *block = (struct btrfsic_block *)bp->bi_private; in btrfsic_bio_end_io() local
2048 BUG_ON(NULL == block); in btrfsic_bio_end_io()
2049 bp->bi_private = block->orig_bio_bh_private; in btrfsic_bio_end_io()
2050 bp->bi_end_io = block->orig_bio_bh_end_io.bio; in btrfsic_bio_end_io()
2054 struct btrfsic_dev_state *const dev_state = block->dev_state; in btrfsic_bio_end_io()
2061 btrfsic_get_block_type(dev_state->state, block), in btrfsic_bio_end_io()
2062 (unsigned long long)block->logical_bytenr, in btrfsic_bio_end_io()
2064 (unsigned long long)block->dev_bytenr, in btrfsic_bio_end_io()
2065 block->mirror_num); in btrfsic_bio_end_io()
2066 next_block = block->next_in_same_bio; in btrfsic_bio_end_io()
2067 block->iodone_w_error = iodone_w_error; in btrfsic_bio_end_io()
2068 if (block->submit_bio_bh_rw & REQ_FLUSH) { in btrfsic_bio_end_io()
2078 if (block->submit_bio_bh_rw & REQ_FUA) in btrfsic_bio_end_io()
2079 block->flush_gen = 0; /* FUA completed means block is in btrfsic_bio_end_io()
2081 block->is_iodone = 1; /* for FLUSH, this releases the block */ in btrfsic_bio_end_io()
2082 block = next_block; in btrfsic_bio_end_io()
2083 } while (NULL != block); in btrfsic_bio_end_io()
2090 struct btrfsic_block *block = (struct btrfsic_block *)bh->b_private; in btrfsic_bh_end_io() local
2094 BUG_ON(NULL == block); in btrfsic_bh_end_io()
2095 dev_state = block->dev_state; in btrfsic_bh_end_io()
2100 btrfsic_get_block_type(dev_state->state, block), in btrfsic_bh_end_io()
2101 (unsigned long long)block->logical_bytenr, in btrfsic_bh_end_io()
2102 block->dev_state->name, in btrfsic_bh_end_io()
2103 (unsigned long long)block->dev_bytenr, in btrfsic_bh_end_io()
2104 block->mirror_num); in btrfsic_bh_end_io()
2106 block->iodone_w_error = iodone_w_error; in btrfsic_bh_end_io()
2107 if (block->submit_bio_bh_rw & REQ_FLUSH) { in btrfsic_bh_end_io()
2116 if (block->submit_bio_bh_rw & REQ_FUA) in btrfsic_bh_end_io()
2117 block->flush_gen = 0; /* FUA completed means block is on disk */ in btrfsic_bh_end_io()
2119 bh->b_private = block->orig_bio_bh_private; in btrfsic_bh_end_io()
2120 bh->b_end_io = block->orig_bio_bh_end_io.bh; in btrfsic_bh_end_io()
2121 block->is_iodone = 1; /* for FLUSH, this releases the block */ in btrfsic_bh_end_io()
2279 struct btrfsic_block *const block, in btrfsic_check_all_ref_blocks() argument
2291 * block free operations, it just recognizes block in btrfsic_check_all_ref_blocks()
2293 * information for a block until a block is in btrfsic_check_all_ref_blocks()
2297 * by the most recent super block. in btrfsic_check_all_ref_blocks()
2310 list_for_each(elem_ref_to, &block->ref_to_list) { in btrfsic_check_all_ref_blocks()
2320 btrfsic_get_block_type(state, block), in btrfsic_check_all_ref_blocks()
2321 (unsigned long long)block->logical_bytenr, in btrfsic_check_all_ref_blocks()
2322 block->dev_state->name, in btrfsic_check_all_ref_blocks()
2323 (unsigned long long)block->dev_bytenr, in btrfsic_check_all_ref_blocks()
2324 block->mirror_num, in btrfsic_check_all_ref_blocks()
2334 " which references block %c @%llu (%s/%llu/%d)" in btrfsic_check_all_ref_blocks()
2345 " which references block %c @%llu (%s/%llu/%d)" in btrfsic_check_all_ref_blocks()
2361 " which references block %c @%llu (%s/%llu/%d)" in btrfsic_check_all_ref_blocks()
2376 " which references block %c @%llu (%s/%llu/%d)" in btrfsic_check_all_ref_blocks()
2378 " (block flush_gen=%llu," in btrfsic_check_all_ref_blocks()
2386 (unsigned long long)block->flush_gen, in btrfsic_check_all_ref_blocks()
2403 const struct btrfsic_block *block, in btrfsic_is_block_ref_by_superblock() argument
2421 list_for_each(elem_ref_from, &block->ref_from_list) { in btrfsic_is_block_ref_by_superblock()
2431 btrfsic_get_block_type(state, block), in btrfsic_is_block_ref_by_superblock()
2432 (unsigned long long)block->logical_bytenr, in btrfsic_is_block_ref_by_superblock()
2433 block->dev_state->name, in btrfsic_is_block_ref_by_superblock()
2434 (unsigned long long)block->dev_bytenr, in btrfsic_is_block_ref_by_superblock()
2435 block->mirror_num, in btrfsic_is_block_ref_by_superblock()
2499 const struct btrfsic_block *block) in btrfsic_get_block_type() argument
2501 if (block->is_superblock && in btrfsic_get_block_type()
2502 state->latest_superblock->dev_bytenr == block->dev_bytenr && in btrfsic_get_block_type()
2503 state->latest_superblock->dev_state->bdev == block->dev_state->bdev) in btrfsic_get_block_type()
2505 else if (block->is_superblock) in btrfsic_get_block_type()
2507 else if (block->is_metadata) in btrfsic_get_block_type()
2519 const struct btrfsic_block *block, in btrfsic_dump_tree_sub() argument
2537 btrfsic_get_block_type(state, block), in btrfsic_dump_tree_sub()
2538 (unsigned long long)block->logical_bytenr, in btrfsic_dump_tree_sub()
2539 block->dev_state->name, in btrfsic_dump_tree_sub()
2540 (unsigned long long)block->dev_bytenr, in btrfsic_dump_tree_sub()
2541 block->mirror_num); in btrfsic_dump_tree_sub()
2548 if (list_empty(&block->ref_to_list)) { in btrfsic_dump_tree_sub()
2552 if (block->mirror_num > 1 && in btrfsic_dump_tree_sub()
2559 list_for_each(elem_ref_to, &block->ref_to_list) { in btrfsic_dump_tree_sub()
2642 struct btrfsic_block *block; in btrfsic_block_lookup_or_add() local
2644 block = btrfsic_block_hashtable_lookup(block_ctx->dev->bdev, in btrfsic_block_lookup_or_add()
2647 if (NULL == block) { in btrfsic_block_lookup_or_add()
2650 block = btrfsic_block_alloc(); in btrfsic_block_lookup_or_add()
2651 if (NULL == block) { in btrfsic_block_lookup_or_add()
2659 btrfsic_block_free(block); in btrfsic_block_lookup_or_add()
2662 block->dev_state = dev_state; in btrfsic_block_lookup_or_add()
2663 block->dev_bytenr = block_ctx->dev_bytenr; in btrfsic_block_lookup_or_add()
2664 block->logical_bytenr = block_ctx->start; in btrfsic_block_lookup_or_add()
2665 block->is_metadata = is_metadata; in btrfsic_block_lookup_or_add()
2666 block->is_iodone = is_iodone; in btrfsic_block_lookup_or_add()
2667 block->never_written = never_written; in btrfsic_block_lookup_or_add()
2668 block->mirror_num = mirror_num; in btrfsic_block_lookup_or_add()
2671 "New %s%c-block @%llu (%s/%llu/%d)\n", in btrfsic_block_lookup_or_add()
2673 btrfsic_get_block_type(state, block), in btrfsic_block_lookup_or_add()
2674 (unsigned long long)block->logical_bytenr, in btrfsic_block_lookup_or_add()
2676 (unsigned long long)block->dev_bytenr, in btrfsic_block_lookup_or_add()
2678 list_add(&block->all_blocks_node, &state->all_blocks_list); in btrfsic_block_lookup_or_add()
2679 btrfsic_block_hashtable_add(block, &state->block_hashtable); in btrfsic_block_lookup_or_add()
2687 return block; in btrfsic_block_lookup_or_add()
2725 …printk(KERN_INFO "btrfs: attempt to write M-block which contains logical bytenr that doesn't map t… in btrfsic_cmp_log_and_dev_bytenr()
2799 " but dummy block already in use" in btrfsic_submit_bh()
2803 struct btrfsic_block *const block = in btrfsic_submit_bh() local
2806 block->is_iodone = 0; in btrfsic_submit_bh()
2807 block->never_written = 0; in btrfsic_submit_bh()
2808 block->iodone_w_error = 0; in btrfsic_submit_bh()
2809 block->flush_gen = dev_state->last_flush_gen + 1; in btrfsic_submit_bh()
2810 block->submit_bio_bh_rw = rw; in btrfsic_submit_bh()
2811 block->orig_bio_bh_private = bh->b_private; in btrfsic_submit_bh()
2812 block->orig_bio_bh_end_io.bh = bh->b_end_io; in btrfsic_submit_bh()
2813 block->next_in_same_bio = NULL; in btrfsic_submit_bh()
2814 bh->b_private = block; in btrfsic_submit_bh()
2888 " but dummy block already in use" in btrfsic_submit_bio()
2892 struct btrfsic_block *const block = in btrfsic_submit_bio() local
2895 block->is_iodone = 0; in btrfsic_submit_bio()
2896 block->never_written = 0; in btrfsic_submit_bio()
2897 block->iodone_w_error = 0; in btrfsic_submit_bio()
2898 block->flush_gen = dev_state->last_flush_gen + 1; in btrfsic_submit_bio()
2899 block->submit_bio_bh_rw = rw; in btrfsic_submit_bio()
2900 block->orig_bio_bh_private = bio->bi_private; in btrfsic_submit_bio()
2901 block->orig_bio_bh_end_io.bio = bio->bi_end_io; in btrfsic_submit_bio()
2902 block->next_in_same_bio = NULL; in btrfsic_submit_bio()
2903 bio->bi_private = block; in btrfsic_submit_bio()
3056 printk(KERN_INFO "btrfs: attempt to free %c-block" in btrfsic_unmount()