Linux Btrfs filesystem development
 help / color / mirror / Atom feed
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
>>
>>
>

  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