From: Qu Wenruo <quwenruo.btrfs@gmx.com>
To: Filipe Manana <fdmanana@kernel.org>, Qu Wenruo <wqu@suse.com>
Cc: linux-btrfs@vger.kernel.org
Subject: Re: [PATCH v2 08/11] btrfs: cleanup duplicated parameters related to can_nocow_file_extent_args
Date: Tue, 21 May 2024 07:43:33 +0930 [thread overview]
Message-ID: <2bcd30f8-8bb5-4255-bc3a-69d347a27050@gmx.com> (raw)
In-Reply-To: <CAL3q7H63NVAS9Hy6mMZkU4mdBZvLrudWYkZ6eS=L8uH9rbJgfw@mail.gmail.com>
在 2024/5/21 01:25, Filipe Manana 写道:
> On Fri, May 3, 2024 at 7:02 AM Qu Wenruo <wqu@suse.com> wrote:
[...]
>> @@ -1926,7 +1916,7 @@ static int can_nocow_file_extent(struct btrfs_path *path,
>> goto out;
>>
>> /* An explicit hole, must COW. */
>> - if (args->disk_bytenr == 0)
>> + if (btrfs_file_extent_disk_num_bytes(leaf, fi) == 0)
>
> No, this is not correct.
All my bad, will fix it definitely.
> It's btrfs_file_extent_disk_bytenr() that we want, not
> btrfs_file_extent_disk_num_bytes().
> In fact a disk_num_bytes of 0 should ve invalid and never happen.
Thankfully for most cases, a explict hole has both its disk_num_bytes
and disk_bytenr as zeros, thus I didn't get any test case triggered:
item 6 key (257 EXTENT_DATA 0) itemoff 15816 itemsize 53
generation 7 type 1 (regular)
extent data disk byte 0 nr 0
extent data offset 0 nr 65536 ram 65536
extent compression 0 (none)
But still I should fix that.
Thanks,
Qu
>
>> goto out;
>>
>> /* Compressed/encrypted/encoded extents must be COWed. */
>> @@ -1951,8 +1941,8 @@ static int can_nocow_file_extent(struct btrfs_path *path,
>> btrfs_release_path(path);
>>
>> ret = btrfs_cross_ref_exist(root, btrfs_ino(inode),
>> - key->offset - args->extent_offset,
>> - args->disk_bytenr, args->strict, path);
>> + key->offset - args->file_extent.offset,
>> + args->file_extent.disk_bytenr, args->strict, path);
>> WARN_ON_ONCE(ret > 0 && is_freespace_inode);
>> if (ret != 0)
>> goto out;
>> @@ -1973,21 +1963,18 @@ static int can_nocow_file_extent(struct btrfs_path *path,
>> atomic_read(&root->snapshot_force_cow))
>> goto out;
>>
>> - args->disk_bytenr += args->extent_offset;
>> - args->disk_bytenr += args->start - key->offset;
>> - args->num_bytes = min(args->end + 1, extent_end) - args->start;
>> -
>> - args->file_extent.num_bytes = args->num_bytes;
>> + args->file_extent.num_bytes = min(args->end + 1, extent_end) - args->start;
>> args->file_extent.offset += args->start - key->offset;
>> + io_start = args->file_extent.disk_bytenr + args->file_extent.offset;
>>
>> /*
>> * Force COW if csums exist in the range. This ensures that csums for a
>> * given extent are either valid or do not exist.
>> */
>>
>> - csum_root = btrfs_csum_root(root->fs_info, args->disk_bytenr);
>> - ret = btrfs_lookup_csums_list(csum_root, args->disk_bytenr,
>> - args->disk_bytenr + args->num_bytes - 1,
>> + csum_root = btrfs_csum_root(root->fs_info, io_start);
>> + ret = btrfs_lookup_csums_list(csum_root, io_start,
>> + io_start + args->file_extent.num_bytes - 1,
>> NULL, nowait);
>> WARN_ON_ONCE(ret > 0 && is_freespace_inode);
>> if (ret != 0)
>> @@ -2046,7 +2033,6 @@ static noinline int run_delalloc_nocow(struct btrfs_inode *inode,
>> struct extent_buffer *leaf;
>> struct extent_state *cached_state = NULL;
>> u64 extent_end;
>> - u64 ram_bytes;
>> u64 nocow_end;
>> int extent_type;
>> bool is_prealloc;
>> @@ -2125,7 +2111,6 @@ static noinline int run_delalloc_nocow(struct btrfs_inode *inode,
>> ret = -EUCLEAN;
>> goto error;
>> }
>> - ram_bytes = btrfs_file_extent_ram_bytes(leaf, fi);
>> extent_end = btrfs_file_extent_end(path);
>>
>> /*
>> @@ -2145,7 +2130,9 @@ static noinline int run_delalloc_nocow(struct btrfs_inode *inode,
>> goto must_cow;
>>
>> ret = 0;
>> - nocow_bg = btrfs_inc_nocow_writers(fs_info, nocow_args.disk_bytenr);
>> + nocow_bg = btrfs_inc_nocow_writers(fs_info,
>> + nocow_args.file_extent.disk_bytenr +
>> + nocow_args.file_extent.offset);
>> if (!nocow_bg) {
>> must_cow:
>> /*
>> @@ -2181,16 +2168,18 @@ static noinline int run_delalloc_nocow(struct btrfs_inode *inode,
>> }
>> }
>>
>> - nocow_end = cur_offset + nocow_args.num_bytes - 1;
>> + nocow_end = cur_offset + nocow_args.file_extent.num_bytes - 1;
>> lock_extent(&inode->io_tree, cur_offset, nocow_end, &cached_state);
>>
>> is_prealloc = extent_type == BTRFS_FILE_EXTENT_PREALLOC;
>> if (is_prealloc) {
>> struct extent_map *em;
>>
>> - em = create_io_em(inode, cur_offset, nocow_args.num_bytes,
>> - nocow_args.disk_num_bytes, /* orig_block_len */
>> - ram_bytes, BTRFS_COMPRESS_NONE,
>> + em = create_io_em(inode, cur_offset,
>> + nocow_args.file_extent.num_bytes,
>> + nocow_args.file_extent.disk_num_bytes,
>> + nocow_args.file_extent.ram_bytes,
>> + BTRFS_COMPRESS_NONE,
>> &nocow_args.file_extent,
>> BTRFS_ORDERED_PREALLOC);
>> if (IS_ERR(em)) {
>> @@ -2203,9 +2192,16 @@ static noinline int run_delalloc_nocow(struct btrfs_inode *inode,
>> free_extent_map(em);
>> }
>>
>> + /*
>> + * Check btrfs_create_dio_extent() for why we intentionally pass
>> + * incorrect value for NOCOW/PREALLOC OEs.
>> + */
>
> If in the next version you remove that similar comment/rant about OEs
> and disk_bytenr, also remove this one.
>
> Everything else in this patch looks fine, thanks.
>
>
>> ordered = btrfs_alloc_ordered_extent(inode, cur_offset,
>> - nocow_args.num_bytes, nocow_args.num_bytes,
>> - nocow_args.disk_bytenr, nocow_args.num_bytes, 0,
>> + nocow_args.file_extent.num_bytes,
>> + nocow_args.file_extent.num_bytes,
>> + nocow_args.file_extent.disk_bytenr +
>> + nocow_args.file_extent.offset,
>> + nocow_args.file_extent.num_bytes, 0,
>> is_prealloc
>> ? (1 << BTRFS_ORDERED_PREALLOC)
>> : (1 << BTRFS_ORDERED_NOCOW),
>> @@ -7144,8 +7140,7 @@ static bool btrfs_extent_readonly(struct btrfs_fs_info *fs_info, u64 bytenr)
>> * any ordered extents.
>> */
>> noinline int can_nocow_extent(struct inode *inode, u64 offset, u64 *len,
>> - u64 *orig_block_len,
>> - u64 *ram_bytes, struct btrfs_file_extent *file_extent,
>> + struct btrfs_file_extent *file_extent,
>> bool nowait, bool strict)
>> {
>> struct btrfs_fs_info *fs_info = inode_to_fs_info(inode);
>> @@ -7196,8 +7191,6 @@ noinline int can_nocow_extent(struct inode *inode, u64 offset, u64 *len,
>>
>> fi = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_file_extent_item);
>> found_type = btrfs_file_extent_type(leaf, fi);
>> - if (ram_bytes)
>> - *ram_bytes = btrfs_file_extent_ram_bytes(leaf, fi);
>>
>> nocow_args.start = offset;
>> nocow_args.end = offset + *len - 1;
>> @@ -7215,14 +7208,15 @@ noinline int can_nocow_extent(struct inode *inode, u64 offset, u64 *len,
>> }
>>
>> ret = 0;
>> - if (btrfs_extent_readonly(fs_info, nocow_args.disk_bytenr))
>> + if (btrfs_extent_readonly(fs_info,
>> + nocow_args.file_extent.disk_bytenr + nocow_args.file_extent.offset))
>> goto out;
>>
>> if (!(BTRFS_I(inode)->flags & BTRFS_INODE_NODATACOW) &&
>> found_type == BTRFS_FILE_EXTENT_PREALLOC) {
>> u64 range_end;
>>
>> - range_end = round_up(offset + nocow_args.num_bytes,
>> + range_end = round_up(offset + nocow_args.file_extent.num_bytes,
>> root->fs_info->sectorsize) - 1;
>> ret = test_range_bit_exists(io_tree, offset, range_end, EXTENT_DELALLOC);
>> if (ret) {
>> @@ -7231,13 +7225,11 @@ noinline int can_nocow_extent(struct inode *inode, u64 offset, u64 *len,
>> }
>> }
>>
>> - if (orig_block_len)
>> - *orig_block_len = nocow_args.disk_num_bytes;
>> if (file_extent)
>> memcpy(file_extent, &nocow_args.file_extent,
>> sizeof(struct btrfs_file_extent));
>>
>> - *len = nocow_args.num_bytes;
>> + *len = nocow_args.file_extent.num_bytes;
>> ret = 1;
>> out:
>> btrfs_free_path(path);
>> @@ -7422,7 +7414,7 @@ static int btrfs_get_blocks_direct_write(struct extent_map **map,
>> struct btrfs_file_extent file_extent = { 0 };
>> struct extent_map *em = *map;
>> int type;
>> - u64 block_start, orig_block_len, ram_bytes;
>> + u64 block_start;
>> struct btrfs_block_group *bg;
>> bool can_nocow = false;
>> bool space_reserved = false;
>> @@ -7450,7 +7442,6 @@ static int btrfs_get_blocks_direct_write(struct extent_map **map,
>> block_start = extent_map_block_start(em) + (start - em->start);
>>
>> if (can_nocow_extent(inode, start, &len,
>> - &orig_block_len, &ram_bytes,
>> &file_extent, false, false) == 1) {
>> bg = btrfs_inc_nocow_writers(fs_info, block_start);
>> if (bg)
>> @@ -7477,8 +7468,8 @@ static int btrfs_get_blocks_direct_write(struct extent_map **map,
>> space_reserved = true;
>>
>> em2 = btrfs_create_dio_extent(BTRFS_I(inode), dio_data, start, len,
>> - orig_block_len,
>> - ram_bytes, type,
>> + file_extent.disk_num_bytes,
>> + file_extent.ram_bytes, type,
>> &file_extent);
>> btrfs_dec_nocow_writers(bg);
>> if (type == BTRFS_ORDERED_PREALLOC) {
>> @@ -10709,7 +10700,7 @@ static int btrfs_swap_activate(struct swap_info_struct *sis, struct file *file,
>> free_extent_map(em);
>> em = NULL;
>>
>> - ret = can_nocow_extent(inode, start, &len, NULL, NULL, NULL, false, true);
>> + ret = can_nocow_extent(inode, start, &len, NULL, false, true);
>> if (ret < 0) {
>> goto out;
>> } else if (ret) {
>> --
>> 2.45.0
>>
>>
>
next prev parent reply other threads:[~2024-05-20 22:13 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-05-03 6:01 [PATCH v2 00/11] btrfs: extent-map: unify the members with btrfs_ordered_extent Qu Wenruo
2024-05-03 6:01 ` [PATCH v2 01/11] btrfs: rename extent_map::orig_block_len to disk_num_bytes Qu Wenruo
2024-05-09 16:15 ` Filipe Manana
2024-05-03 6:01 ` [PATCH v2 02/11] btrfs: export the expected file extent through can_nocow_extent() Qu Wenruo
2024-05-09 16:22 ` Filipe Manana
2024-05-09 21:55 ` Qu Wenruo
2024-05-03 6:01 ` [PATCH v2 03/11] btrfs: introduce new members for extent_map Qu Wenruo
2024-05-09 17:05 ` Filipe Manana
2024-05-09 22:11 ` Qu Wenruo
2024-05-10 11:26 ` Filipe Manana
2024-05-10 22:26 ` Qu Wenruo
2024-05-13 12:48 ` Filipe Manana
2024-05-13 12:54 ` Filipe Manana
2024-05-13 17:31 ` Filipe Manana
2024-05-03 6:01 ` [PATCH v2 04/11] btrfs: introduce extra sanity checks for extent maps Qu Wenruo
2024-05-13 12:21 ` Filipe Manana
2024-05-13 22:34 ` Qu Wenruo
2024-05-03 6:01 ` [PATCH v2 05/11] btrfs: remove extent_map::orig_start member Qu Wenruo
2024-05-13 13:09 ` Filipe Manana
2024-05-13 22:14 ` Qu Wenruo
2024-05-03 6:01 ` [PATCH v2 06/11] btrfs: remove extent_map::block_len member Qu Wenruo
2024-05-13 17:44 ` Filipe Manana
2024-05-14 7:09 ` Qu Wenruo
2024-05-03 6:01 ` [PATCH v2 07/11] btrfs: remove extent_map::block_start member Qu Wenruo
2024-05-16 17:28 ` Filipe Manana
2024-05-16 22:45 ` Qu Wenruo
2024-05-03 6:01 ` [PATCH v2 08/11] btrfs: cleanup duplicated parameters related to can_nocow_file_extent_args Qu Wenruo
2024-05-20 15:55 ` Filipe Manana
2024-05-20 22:13 ` Qu Wenruo [this message]
2024-05-03 6:01 ` [PATCH v2 09/11] btrfs: cleanup duplicated parameters related to btrfs_alloc_ordered_extent Qu Wenruo
2024-05-20 16:31 ` Filipe Manana
2024-05-03 6:01 ` [PATCH v2 10/11] btrfs: cleanup duplicated parameters related to create_io_em() Qu Wenruo
2024-05-20 16:46 ` Filipe Manana
2024-05-03 6:01 ` [PATCH v2 11/11] btrfs: cleanup duplicated parameters related to btrfs_create_dio_extent() Qu Wenruo
2024-05-20 16:48 ` Filipe Manana
2024-05-23 4:03 ` Qu Wenruo
2024-05-03 11:53 ` [PATCH v2 00/11] btrfs: extent-map: unify the members with btrfs_ordered_extent David Sterba
2024-05-20 16:55 ` Filipe Manana
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=2bcd30f8-8bb5-4255-bc3a-69d347a27050@gmx.com \
--to=quwenruo.btrfs@gmx.com \
--cc=fdmanana@kernel.org \
--cc=linux-btrfs@vger.kernel.org \
--cc=wqu@suse.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox