On Tue, Jan 31, 2017 at 07:50:22AM -0800, Liu Bo wrote:
> We have similar codes to create and insert extent mapping around IO path,
> this merges them into a single helper.
Looks good, comments below.
> +static struct extent_map *create_io_em(struct inode *inode, u64 start, u64
> len,
> + u64 orig_start, u64 block_start,
> + u64 block_len, u64 orig_block_len,
> + u64 ram_bytes, int compress_type,
> + int type);
>
> static int btrfs_dirty_inode(struct inode *inode);
>
> @@ -690,7 +690,6 @@ static noinline void submit_compressed_extents(struct
> inode *inode,
> struct btrfs_key ins;
> struct extent_map *em;
> struct btrfs_root *root = BTRFS_I(inode)->root;
> - struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree;
> struct extent_io_tree *io_tree;
> int ret = 0;
>
> @@ -778,46 +777,19 @@ static noinline void submit_compressed_extents(struct
> inode *inode,
> * here we're doing allocation and writeback of the
> * compressed pages
> */
> - btrfs_drop_extent_cache(inode, async_extent->start,
> - async_extent->start +
> - async_extent->ram_size - 1, 0);
> -
> - em = alloc_extent_map();
> - if (!em) {
> - ret = -ENOMEM;
> - goto out_free_reserve;
> - }
> - em->start = async_extent->start;
> - em->len = async_extent->ram_size;
> - em->orig_start = em->start;
> - em->mod_start = em->start;
> - em->mod_len = em->len;
> -
> - em->block_start = ins.objectid;
> - em->block_len = ins.offset;
> - em->orig_block_len = ins.offset;
> - em->ram_bytes = async_extent->ram_size;
> - em->bdev = fs_info->fs_devices->latest_bdev;
> - em->compress_type = async_extent->compress_type;
> - set_bit(EXTENT_FLAG_PINNED, &em->flags);
> - set_bit(EXTENT_FLAG_COMPRESSED, &em->flags);
> - em->generation = -1;
> -
> - while (1) {
> - write_lock(&em_tree->lock);
> - ret = add_extent_mapping(em_tree, em, 1);
> - write_unlock(&em_tree->lock);
> - if (ret != -EEXIST) {
> - free_extent_map(em);
> - break;
> - }
> - btrfs_drop_extent_cache(inode, async_extent->start,
> - async_extent->start +
> - async_extent->ram_size - 1, 0);
> - }
> -
> - if (ret)
> + em = create_io_em(inode, async_extent->start,
> + async_extent->ram_size, /* len */
> + async_extent->start, /* orig_start */
> + ins.objectid, /* block_start */
> + ins.offset, /* block_len */
> + ins.offset, /* orig_block_len */
> + async_extent->ram_size, /* ram_bytes */
> + async_extent->compress_type,
> + BTRFS_ORDERED_COMPRESSED);
> + if (IS_ERR(em))
> + /* ret value is not necessary due to void function */
> goto out_free_reserve;
> + free_extent_map(em);
>
> ret = btrfs_add_ordered_extent_compress(inode,
> async_extent->start,
> @@ -952,7 +924,6 @@ static noinline int cow_file_range(struct inode *inode,
> u64 blocksize = fs_info->sectorsize;
> struct btrfs_key ins;
> struct extent_map *em;
> - struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree;
> int ret = 0;
>
> if (btrfs_is_free_space_inode(inode)) {
> @@ -1008,39 +979,18 @@ static noinline int cow_file_range(struct inode *inode,
> if (ret < 0)
> goto out_unlock;
>
> - em = alloc_extent_map();
> - if (!em) {
> - ret = -ENOMEM;
> - goto out_reserve;
> - }
> - em->start = start;
> - em->orig_start = em->start;
> ram_size = ins.offset;
> - em->len = ins.offset;
> - em->mod_start = em->start;
> - em->mod_len = em->len;
> -
> - em->block_start = ins.objectid;
> - em->block_len = ins.offset;
> - em->orig_block_len = ins.offset;
> - em->ram_bytes = ram_size;
> - em->bdev = fs_info->fs_devices->latest_bdev;
> - set_bit(EXTENT_FLAG_PINNED, &em->flags);
> - em->generation = -1;
> -
> - while (1) {
> - write_lock(&em_tree->lock);
> - ret = add_extent_mapping(em_tree, em, 1);
> - write_unlock(&em_tree->lock);
> - if (ret != -EEXIST) {
> - free_extent_map(em);
> - break;
> - }
> - btrfs_drop_extent_cache(inode, start,
> - start + ram_size - 1, 0);
> - }
> - if (ret)
> + em = create_io_em(inode, start, ins.offset, /* len */
> + start, /* orig_start */
> + ins.objectid, /* block_start */
> + ins.offset, /* block_len */
> + ins.offset, /* orig_block_len */
> + ram_size, /* ram_bytes */
> + BTRFS_COMPRESS_NONE, /* compress_type */
> + 0 /* type */);
Here the type is 0, as was previously a result of kmem_cache_zalloc, but
the value 0 also corresponds to BTRFS_ORDERED_IO_DONE. I suggest to add
another symbolic value that would represent the intentions here and not
reusing the existin value. A separate patch is fine, I'm adding this to
the queue.
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html