OSDN Git Service

btrfs: remove buffer_heads form super block mirror integrity checking
authorJohannes Thumshirn <johannes.thumshirn@wdc.com>
Thu, 13 Feb 2020 15:24:36 +0000 (00:24 +0900)
committerDavid Sterba <dsterba@suse.com>
Mon, 23 Mar 2020 16:01:40 +0000 (17:01 +0100)
The integrity checking code for the super block mirrors is the last
remaining user of buffer_heads, change it to using plain bios as well.

Reviewed-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: Nikolay Borisov <nborisov@suse.com>
Signed-off-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/check-integrity.c

index 4f6db2f..32e11a2 100644 (file)
@@ -77,7 +77,6 @@
 
 #include <linux/sched.h>
 #include <linux/slab.h>
-#include <linux/buffer_head.h>
 #include <linux/mutex.h>
 #include <linux/genhd.h>
 #include <linux/blkdev.h>
@@ -762,29 +761,31 @@ static int btrfsic_process_superblock_dev_mirror(
        struct btrfs_fs_info *fs_info = state->fs_info;
        struct btrfs_super_block *super_tmp;
        u64 dev_bytenr;
-       struct buffer_head *bh;
        struct btrfsic_block *superblock_tmp;
        int pass;
        struct block_device *const superblock_bdev = device->bdev;
+       struct page *page;
+       struct address_space *mapping = superblock_bdev->bd_inode->i_mapping;
+       int ret = 0;
 
        /* super block bytenr is always the unmapped device bytenr */
        dev_bytenr = btrfs_sb_offset(superblock_mirror_num);
        if (dev_bytenr + BTRFS_SUPER_INFO_SIZE > device->commit_total_bytes)
                return -1;
-       bh = __bread(superblock_bdev, dev_bytenr / BTRFS_BDEV_BLOCKSIZE,
-                    BTRFS_SUPER_INFO_SIZE);
-       if (NULL == bh)
+
+       page = read_cache_page_gfp(mapping, dev_bytenr >> PAGE_SHIFT, GFP_NOFS);
+       if (IS_ERR(page))
                return -1;
-       super_tmp = (struct btrfs_super_block *)
-           (bh->b_data + (dev_bytenr & (BTRFS_BDEV_BLOCKSIZE - 1)));
+
+       super_tmp = page_address(page);
 
        if (btrfs_super_bytenr(super_tmp) != dev_bytenr ||
            btrfs_super_magic(super_tmp) != BTRFS_MAGIC ||
            memcmp(device->uuid, super_tmp->dev_item.uuid, BTRFS_UUID_SIZE) ||
            btrfs_super_nodesize(super_tmp) != state->metablock_size ||
            btrfs_super_sectorsize(super_tmp) != state->datablock_size) {
-               brelse(bh);
-               return 0;
+               ret = 0;
+               goto out;
        }
 
        superblock_tmp =
@@ -795,8 +796,8 @@ static int btrfsic_process_superblock_dev_mirror(
                superblock_tmp = btrfsic_block_alloc();
                if (NULL == superblock_tmp) {
                        pr_info("btrfsic: error, kmalloc failed!\n");
-                       brelse(bh);
-                       return -1;
+                       ret = -1;
+                       goto out;
                }
                /* for superblock, only the dev_bytenr makes sense */
                superblock_tmp->dev_bytenr = dev_bytenr;
@@ -880,8 +881,8 @@ static int btrfsic_process_superblock_dev_mirror(
                                              mirror_num)) {
                                pr_info("btrfsic: btrfsic_map_block(bytenr @%llu, mirror %d) failed!\n",
                                       next_bytenr, mirror_num);
-                               brelse(bh);
-                               return -1;
+                               ret = -1;
+                               goto out;
                        }
 
                        next_block = btrfsic_block_lookup_or_add(
@@ -890,8 +891,8 @@ static int btrfsic_process_superblock_dev_mirror(
                                        mirror_num, NULL);
                        if (NULL == next_block) {
                                btrfsic_release_block_ctx(&tmp_next_block_ctx);
-                               brelse(bh);
-                               return -1;
+                               ret = -1;
+                               goto out;
                        }
 
                        next_block->disk_key = tmp_disk_key;
@@ -902,16 +903,17 @@ static int btrfsic_process_superblock_dev_mirror(
                                        BTRFSIC_GENERATION_UNKNOWN);
                        btrfsic_release_block_ctx(&tmp_next_block_ctx);
                        if (NULL == l) {
-                               brelse(bh);
-                               return -1;
+                               ret = -1;
+                               goto out;
                        }
                }
        }
        if (state->print_mask & BTRFSIC_PRINT_MASK_INITIAL_ALL_TREES)
                btrfsic_dump_tree_sub(state, superblock_tmp, 0);
 
-       brelse(bh);
-       return 0;
+out:
+       put_page(page);
+       return ret;
 }
 
 static struct btrfsic_stack_frame *btrfsic_stack_frame_alloc(void)