[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <aacb742c-2081-441e-ac52-d9e0f580ab1e@wdc.com>
Date: Mon, 23 Sep 2024 08:15:32 +0000
From: Johannes Thumshirn <Johannes.Thumshirn@....com>
To: Qu Wenruo <quwenruo.btrfs@....com>, Johannes Thumshirn <jth@...nel.org>,
Chris Mason <clm@...com>, Josef Bacik <josef@...icpanda.com>, David Sterba
<dsterba@...e.com>, "open list:BTRFS FILE SYSTEM"
<linux-btrfs@...r.kernel.org>, open list <linux-kernel@...r.kernel.org>
CC: WenRuo Qu <wqu@...e.com>, Naohiro Aota <Naohiro.Aota@....com>
Subject: Re: [PATCH] btrfs: also add stripe entries for NOCOW writes
On 23.09.24 09:56, Qu Wenruo wrote:
>>> 在 2024/9/23 16:15, Johannes Thumshirn 写道:
>>>> From: Johannes Thumshirn <johannes.thumshirn@....com>
>>>>
>>>> NOCOW writes do not generate stripe_extent entries in the RAID stripe
>>>> tree, as the RAID stripe-tree feature initially was designed with a
>>>> zoned filesystem in mind and on a zoned filesystem, we do not allow NOCOW
>>>> writes. But the RAID stripe-tree feature is independent from the zoned
>>>> feature, so we must also allow NOCOW writes for zoned filesystems.
>>>>
>>>> Signed-off-by: Johannes Thumshirn <johannes.thumshirn@....com>
>>>
>>> Sorry I'm going to repeat myself again, I still believe if we insert an
>>> RST entry at falloc() time, it will be more consistent with the non-RST
>>> code.
>>>
>>> Yes, I known preallocated space will not need any read nor search RST
>>> entry, and we just fill the page cache with zero at read time.
>>>
>>> But the point of proper (not just dummy) RST entry for the whole
>>> preallocated space is, we do not need to touch the RST entry anymore for
>>> NOCOW/PREALLOCATED write at all.
>>>
>>> This makes the RST NOCOW/PREALLOC writes behavior to align with the
>>> non-RST code, which doesn't update any extent item, but only modify the
>>> file extent for PREALLOC writes.
>>
>> Please re-read the patch. This is not a dummy RST entry but a real RST
>> entry for NOCOW writes.
>>
> I know, but my point is, if the RST entry for preallocated range is
> already a regular one, you won't even need to insert/update the RST tree
> at all.
>
> Just like we do not need to update the extent tree for
> NOCOW/PREALLOCATED writes.
But as long as there is no data on disk there is no point of having a
logical to N-disk physical mapping. We haven't even called
btrfs_map_block() before, so where do we know which disks will get the
blocks at which address? Look at this example:
Fallocate [0, 1M]
virtme-scsi:/mnt # xfs_io -fc "falloc 0 1M" -c sync test
virtme-scsi:/mnt # btrfs ins dump-tree -t extent /dev/sda | \
grep -A 1 EXTENT_ITEM
item 13 key (298844160 EXTENT_ITEM 1048576) itemoff 15828
itemsize 53
refs 1 gen 8 flags DATA
virtme-scsi:/mnt # btrfs ins dump-tree -t fs /dev/sda | \
grep -A 3 EXTENT_DATA
item 6 key (257 EXTENT_DATA 0) itemoff 15816 itemsize 53
generation 8 type 2 (prealloc)
prealloc data disk byte 298844160 nr 1048576 [1]
prealloc data offset 0 nr 1048576
Write at [64k, 128k]
virtme-scsi:/mnt # xfs_io -fc "pwrite 64k 64k" test
wrote 65536/65536 bytes at offset 65536
64 KiB, 16 ops; 0.0003 sec (183.284 MiB/sec and 46920.8211 ops/sec)
virtme-scsi:/mnt # btrfs ins dump-tree -t fs /dev/sda | grep -A 3
EXTENT_DATA
item 6 key (257 EXTENT_DATA 0) itemoff 15816 itemsize 53
generation 9 type 2 (prealloc)
prealloc data disk byte 298844160 nr 1048576
prealloc data offset 0 nr 65536
item 7 key (257 EXTENT_DATA 65536) itemoff 15763 itemsize 53
generation 9 type 1 (regular)
extent data disk byte 298844160 nr 1048576 [2]
extent data offset 65536 nr 65536 ram 1048576
--
item 8 key (257 EXTENT_DATA 131072) itemoff 15710 itemsize 53
generation 9 type 2 (prealloc)
prealloc data disk byte 298844160 nr 1048576
prealloc data offset 131072 nr 917504
virtme-scsi:/mnt # btrfs ins dump-tree -t raid-stripe /dev/sda
btrfs-progs v6.9
raid stripe tree key (RAID_STRIPE_TREE ROOT_ITEM 0)
leaf 30638080 items 1 free space 16226 generation 9 owner RAID_STRIPE_TREE
leaf 30638080 flags 0x1(WRITTEN) backref revision 1
checksum stored 9ed94b4d
checksum calced 9ed94b4d
fs uuid bebf1755-9379-4ac8-a623-ad0dc52641cf
chunk uuid 463f7b1d-c0b8-4373-8334-52f5bf83475e
item 0 key (298909696 RAID_STRIPE 65536) itemoff 16251 itemsize 32
stripe 0 devid 1 physical 298909696 [3]
stripe 1 devid 2 physical 277938176
[1] we preallocate the data for [0, 1M] @ 298844160
[2] we have the actual written data for [64k, 128k] @ 298844160
What should I do to insert the RST entry there as we get:
[3] the physical copies starting at 298909696 on devid 1 and 277938176
on devid 2
Powered by blists - more mailing lists