]> git.hungrycats.org Git - linux/commitdiff
Revert "btrfs: remove extent_map::bdev"
authorJosef Bacik <josef@toxicpanda.com>
Mon, 18 Nov 2019 15:28:24 +0000 (07:28 -0800)
committerJosef Bacik <josef@toxicpanda.com>
Mon, 18 Nov 2019 15:28:24 +0000 (07:28 -0800)
This reverts commit 1b58ca8cc85f1aabb1b7d723d32d861771a3a414.

fs/btrfs/disk-io.c
fs/btrfs/extent_io.c
fs/btrfs/extent_map.c
fs/btrfs/extent_map.h
fs/btrfs/file-item.c
fs/btrfs/file.c
fs/btrfs/inode.c
fs/btrfs/relocation.c

index e0edfdc9c82bea289b88d320e98147b7a88ef4bf..8783d86f487dbd95512ba752902059f209ecb273 100644 (file)
@@ -205,6 +205,7 @@ struct extent_map *btree_get_extent(struct btrfs_inode *inode,
                struct page *page, size_t pg_offset, u64 start, u64 len,
                int create)
 {
+       struct btrfs_fs_info *fs_info = inode->root->fs_info;
        struct extent_map_tree *em_tree = &inode->extent_tree;
        struct extent_map *em;
        int ret;
@@ -212,6 +213,7 @@ struct extent_map *btree_get_extent(struct btrfs_inode *inode,
        read_lock(&em_tree->lock);
        em = lookup_extent_mapping(em_tree, start, len);
        if (em) {
+               em->bdev = fs_info->fs_devices->latest_bdev;
                read_unlock(&em_tree->lock);
                goto out;
        }
@@ -226,6 +228,7 @@ struct extent_map *btree_get_extent(struct btrfs_inode *inode,
        em->len = (u64)-1;
        em->block_len = (u64)-1;
        em->block_start = 0;
+       em->bdev = fs_info->fs_devices->latest_bdev;
 
        write_lock(&em_tree->lock);
        ret = add_extent_mapping(em_tree, em, 0);
index f2a1283e42416f94c2fb364e2d0dc4bca0cc0f26..c6e28d5ed0fcc81a9d57f8bf53ee1bae1eb7ba3b 100644 (file)
@@ -3150,6 +3150,7 @@ static int __do_readpage(struct extent_io_tree *tree,
                        offset = em->block_start + extent_offset;
                        disk_io_size = iosize;
                }
+               bdev = em->bdev;
                block_start = em->block_start;
                if (test_bit(EXTENT_FLAG_PREALLOC, &em->flags))
                        block_start = EXTENT_MAP_HOLE;
@@ -3486,6 +3487,7 @@ static noinline_for_stack int __extent_writepage_io(struct inode *inode,
                iosize = min(em_end - cur, end - cur + 1);
                iosize = ALIGN(iosize, blocksize);
                offset = em->block_start + extent_offset;
+               bdev = em->bdev;
                block_start = em->block_start;
                compressed = test_bit(EXTENT_FLAG_COMPRESSED, &em->flags);
                free_extent_map(em);
index 6f417ff68980f68f26eb89b6689a732d15a5b2bf..9f99dccbc3ca9c4b31edca71050f28f1dda67720 100644 (file)
@@ -218,6 +218,9 @@ static int mergable_maps(struct extent_map *prev, struct extent_map *next)
                ASSERT(test_bit(EXTENT_FLAG_FS_MAPPING, &prev->flags) &&
                       test_bit(EXTENT_FLAG_FS_MAPPING, &next->flags));
 
+       if (prev->bdev || next->bdev)
+               ASSERT(prev->bdev == next->bdev);
+
        if (extent_map_end(prev) == next->start &&
            prev->flags == next->flags &&
            prev->map_lookup == next->map_lookup &&
index 8e217337dff9011b0d820943463acb044358dc91..3eb9c596b44597666a8cf691e24e542cc48e06b7 100644 (file)
@@ -42,8 +42,15 @@ struct extent_map {
        u64 block_len;
        u64 generation;
        unsigned long flags;
-       /* Used for chunk mappings, flag EXTENT_FLAG_FS_MAPPING must be set */
-       struct map_lookup *map_lookup;
+       struct {
+               struct block_device *bdev;
+
+               /*
+                * used for chunk mappings
+                * flags & EXTENT_FLAG_FS_MAPPING must be set
+                */
+               struct map_lookup *map_lookup;
+       };
        refcount_t refs;
        unsigned int compress_type;
        struct list_head list;
index 3270a40b0777bf3c0e68b917f25155ac09d1eb8f..1a599f50837b75c90cc05204ccfb154897c33acc 100644 (file)
@@ -945,6 +945,7 @@ void btrfs_extent_item_to_extent_map(struct btrfs_inode *inode,
        u8 type = btrfs_file_extent_type(leaf, fi);
        int compress_type = btrfs_file_extent_compression(leaf, fi);
 
+       em->bdev = fs_info->fs_devices->latest_bdev;
        btrfs_item_key_to_cpu(leaf, &key, slot);
        extent_start = key.offset;
 
index 0cb43b6827897b6569a6d9f7c1d555bf8afa0347..32e620981485700853404e3e896cbc25efafa204 100644 (file)
@@ -667,6 +667,7 @@ void btrfs_drop_extent_cache(struct btrfs_inode *inode, u64 start, u64 end,
                        }
 
                        split->generation = gen;
+                       split->bdev = em->bdev;
                        split->flags = flags;
                        split->compress_type = em->compress_type;
                        replace_extent_mapping(em_tree, em, split, modified);
@@ -679,6 +680,7 @@ void btrfs_drop_extent_cache(struct btrfs_inode *inode, u64 start, u64 end,
 
                        split->start = start + len;
                        split->len = em->start + em->len - (start + len);
+                       split->bdev = em->bdev;
                        split->flags = flags;
                        split->compress_type = em->compress_type;
                        split->generation = gen;
@@ -2358,6 +2360,7 @@ out:
                hole_em->block_start = EXTENT_MAP_HOLE;
                hole_em->block_len = 0;
                hole_em->orig_block_len = 0;
+               hole_em->bdev = fs_info->fs_devices->latest_bdev;
                hole_em->compress_type = BTRFS_COMPRESS_NONE;
                hole_em->generation = trans->transid;
 
index 56032c518b267a5b3ce3875b0e4081e1bcbd761c..b13c212b1bed95dcdb187e212de6fadf8e133275 100644 (file)
@@ -5189,6 +5189,7 @@ int btrfs_cont_expand(struct inode *inode, loff_t oldsize, loff_t size)
                        hole_em->block_len = 0;
                        hole_em->orig_block_len = 0;
                        hole_em->ram_bytes = hole_size;
+                       hole_em->bdev = fs_info->fs_devices->latest_bdev;
                        hole_em->compress_type = BTRFS_COMPRESS_NONE;
                        hole_em->generation = fs_info->generation;
 
@@ -6966,6 +6967,8 @@ struct extent_map *btrfs_get_extent(struct btrfs_inode *inode,
 
        read_lock(&em_tree->lock);
        em = lookup_extent_mapping(em_tree, start, len);
+       if (em)
+               em->bdev = fs_info->fs_devices->latest_bdev;
        read_unlock(&em_tree->lock);
 
        if (em) {
@@ -6981,6 +6984,7 @@ struct extent_map *btrfs_get_extent(struct btrfs_inode *inode,
                err = -ENOMEM;
                goto out;
        }
+       em->bdev = fs_info->fs_devices->latest_bdev;
        em->start = EXTENT_MAP_HOLE;
        em->orig_start = EXTENT_MAP_HOLE;
        em->len = (u64)-1;
@@ -7239,6 +7243,7 @@ struct extent_map *btrfs_get_extent_fiemap(struct btrfs_inode *inode,
                        err = -ENOMEM;
                        goto out;
                }
+               em->bdev = NULL;
 
                ASSERT(hole_em);
                /*
@@ -7598,6 +7603,7 @@ static struct extent_map *create_io_em(struct inode *inode, u64 start, u64 len,
 {
        struct extent_map_tree *em_tree;
        struct extent_map *em;
+       struct btrfs_root *root = BTRFS_I(inode)->root;
        int ret;
 
        ASSERT(type == BTRFS_ORDERED_PREALLOC ||
@@ -7615,6 +7621,7 @@ static struct extent_map *create_io_em(struct inode *inode, u64 start, u64 len,
        em->len = len;
        em->block_len = block_len;
        em->block_start = block_start;
+       em->bdev = root->fs_info->fs_devices->latest_bdev;
        em->orig_block_len = orig_block_len;
        em->ram_bytes = ram_bytes;
        em->generation = -1;
@@ -10477,6 +10484,7 @@ static int __btrfs_prealloc_file_range(struct inode *inode, int mode,
                em->block_len = ins.offset;
                em->orig_block_len = ins.offset;
                em->ram_bytes = ins.offset;
+               em->bdev = fs_info->fs_devices->latest_bdev;
                set_bit(EXTENT_FLAG_PREALLOC, &em->flags);
                em->generation = trans->transid;
 
index 9e03da45a5c4d3082903b7de5bd589468f8f8769..a857fc8271d270ec190981c0db74e6e87a3ea573 100644 (file)
@@ -3194,6 +3194,7 @@ static noinline_for_stack
 int setup_extent_mapping(struct inode *inode, u64 start, u64 end,
                         u64 block_start)
 {
+       struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
        struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree;
        struct extent_map *em;
        int ret = 0;
@@ -3206,6 +3207,7 @@ int setup_extent_mapping(struct inode *inode, u64 start, u64 end,
        em->len = end + 1 - start;
        em->block_len = em->len;
        em->block_start = block_start;
+       em->bdev = fs_info->fs_devices->latest_bdev;
        set_bit(EXTENT_FLAG_PINNED, &em->flags);
 
        lock_extent(&BTRFS_I(inode)->io_tree, start, end);