* FIEMAP ioctl gets "wrong" address for the extent
@ 2020-07-02 9:11 Rebraca Dejan (BSOT/PJ-ES1-Bg)
2020-07-02 10:18 ` Qu Wenruo
2020-07-02 11:43 ` David Sterba
0 siblings, 2 replies; 9+ messages in thread
From: Rebraca Dejan (BSOT/PJ-ES1-Bg) @ 2020-07-02 9:11 UTC (permalink / raw)
To: linux-btrfs@vger.kernel.org
Hi all,
I'm collecting file extents for our application from BtrFs filesystem image.
I've noticed that for some files a get the "wrong" physical offset for start of the extent. I verified it using hexdump of the filesystem image: when dump the content starting from the address returned from FIEMAP ioctl, I see that the content is absolutely different from the content of the file itself. Also, the FIEMAP ioctl reports regular extent, it is not inline.
Environment:
- 4.15.0-96-generic #97~16.04.1-Ubuntu SMP Wed Apr 1 03:03:31 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
- btrfs-progs v4.4
Does anyone has any idea? I would appreciate your help on this one.
Tnx.
Best regards,
Dejan
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: FIEMAP ioctl gets "wrong" address for the extent
2020-07-02 9:11 FIEMAP ioctl gets "wrong" address for the extent Rebraca Dejan (BSOT/PJ-ES1-Bg)
@ 2020-07-02 10:18 ` Qu Wenruo
2020-07-02 11:08 ` Rebraca Dejan (BSOT/PJ-ES1-Bg)
2020-07-02 11:43 ` David Sterba
1 sibling, 1 reply; 9+ messages in thread
From: Qu Wenruo @ 2020-07-02 10:18 UTC (permalink / raw)
To: Rebraca Dejan (BSOT/PJ-ES1-Bg), linux-btrfs@vger.kernel.org
[-- Attachment #1.1: Type: text/plain, Size: 2174 bytes --]
On 2020/7/2 下午5:11, Rebraca Dejan (BSOT/PJ-ES1-Bg) wrote:
> Hi all,
>
> I'm collecting file extents for our application from BtrFs filesystem image.
> I've noticed that for some files a get the "wrong" physical offset for start of the extent.
First thing first, btrfs fiemap ioctl only returns btrfs logical address.
That's an address space in [0, U64_MAX), thus it's not a physical offset
you can find in the device.
For example, for a btrfs on a 10G disk, btrfs fiemap can return address
at 128G, which you can never find on that disk.
This is not that strange, as btrfs can be a multi-device fs, thus we
must have an internal address space, and then map part of the logical
address into physical disk space.
> I verified it using hexdump of the filesystem image: when dump the content starting from the address returned from FIEMAP ioctl, I see that the content is absolutely different from the content of the file itself. Also, the FIEMAP ioctl reports regular extent, it is not inline.
If you're using the logical address returned from disk directly, then
you won't get the correct data obviously.
What you need is to map the btrfs logical address to physical device
offset, that is done by referring to chunk tree.
And even after the conversion, it's not always the case for all profiles.
For SINGLE/DUP/RAID0/RAID1/RAID10/RAID1C*, you can find the data
directly, but for RAID5/6, you need to bother the P/Q stripe.
And furthermore, there are compressed data extents, which on-disk data
is compressed, which also diffs from the uncompressed data.
For the chunk mapping, you can verify the mapping of <logical address>
to <physical address> using btrfs inspect dump-tree -t chunk <device>.
The details of the btrfs_chunk on-disk format can be found here:
https://btrfs.wiki.kernel.org/index.php/On-disk_Format#CHUNK_ITEM_.28e4.29
Thanks,
Qu
>
> Environment:
> - 4.15.0-96-generic #97~16.04.1-Ubuntu SMP Wed Apr 1 03:03:31 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
> - btrfs-progs v4.4
>
> Does anyone has any idea? I would appreciate your help on this one.
> Tnx.
>
> Best regards,
> Dejan
>
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 9+ messages in thread
* RE: FIEMAP ioctl gets "wrong" address for the extent
2020-07-02 10:18 ` Qu Wenruo
@ 2020-07-02 11:08 ` Rebraca Dejan (BSOT/PJ-ES1-Bg)
2020-07-02 11:21 ` Qu Wenruo
0 siblings, 1 reply; 9+ messages in thread
From: Rebraca Dejan (BSOT/PJ-ES1-Bg) @ 2020-07-02 11:08 UTC (permalink / raw)
To: Qu Wenruo, linux-btrfs@vger.kernel.org
Hi Qu,
I'm using this structure to get the address of file extent:
struct fiemap_extent {
__u64 fe_logical; /* logical offset in bytes for the start of
* the extent */
__u64 fe_physical; /* physical offset in bytes for the start
* of the extent */
__u64 fe_length; /* length in bytes for the extent */
__u64 fe_reserved64[2];
__u32 fe_flags; /* FIEMAP_EXTENT_* flags for this extent */
__u32 fe_reserved[3];
};
And using fe_physical field I verified that it really reflects the offset in filesystem image - I can see that file content begins at this offset.
The problem is that I run into some specific case where file content doesn't begin at fe_physical, I rather have something else at this offset.
Thanks,
Dejan
-----Original Message-----
From: Qu Wenruo <quwenruo.btrfs@gmx.com>
Sent: četvrtak, 02. jul 2020. 12:19
To: Rebraca Dejan (BSOT/PJ-ES1-Bg) <Dejan.Rebraca@rs.bosch.com>; linux-btrfs@vger.kernel.org
Subject: Re: FIEMAP ioctl gets "wrong" address for the extent
On 2020/7/2 下午5:11, Rebraca Dejan (BSOT/PJ-ES1-Bg) wrote:
> Hi all,
>
> I'm collecting file extents for our application from BtrFs filesystem image.
> I've noticed that for some files a get the "wrong" physical offset for start of the extent.
First thing first, btrfs fiemap ioctl only returns btrfs logical address.
That's an address space in [0, U64_MAX), thus it's not a physical offset you can find in the device.
For example, for a btrfs on a 10G disk, btrfs fiemap can return address at 128G, which you can never find on that disk.
This is not that strange, as btrfs can be a multi-device fs, thus we must have an internal address space, and then map part of the logical address into physical disk space.
> I verified it using hexdump of the filesystem image: when dump the content starting from the address returned from FIEMAP ioctl, I see that the content is absolutely different from the content of the file itself. Also, the FIEMAP ioctl reports regular extent, it is not inline.
If you're using the logical address returned from disk directly, then you won't get the correct data obviously.
What you need is to map the btrfs logical address to physical device offset, that is done by referring to chunk tree.
And even after the conversion, it's not always the case for all profiles.
For SINGLE/DUP/RAID0/RAID1/RAID10/RAID1C*, you can find the data directly, but for RAID5/6, you need to bother the P/Q stripe.
And furthermore, there are compressed data extents, which on-disk data is compressed, which also diffs from the uncompressed data.
For the chunk mapping, you can verify the mapping of <logical address> to <physical address> using btrfs inspect dump-tree -t chunk <device>.
The details of the btrfs_chunk on-disk format can be found here:
https://btrfs.wiki.kernel.org/index.php/On-disk_Format#CHUNK_ITEM_.28e4.29
Thanks,
Qu
>
> Environment:
> - 4.15.0-96-generic #97~16.04.1-Ubuntu SMP Wed Apr 1 03:03:31 UTC 2020
> x86_64 x86_64 x86_64 GNU/Linux
> - btrfs-progs v4.4
>
> Does anyone has any idea? I would appreciate your help on this one.
> Tnx.
>
> Best regards,
> Dejan
>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: FIEMAP ioctl gets "wrong" address for the extent
2020-07-02 11:08 ` Rebraca Dejan (BSOT/PJ-ES1-Bg)
@ 2020-07-02 11:21 ` Qu Wenruo
2020-07-03 7:13 ` Rebraca Dejan (BSOT/PJ-ES1-Bg)
2020-07-06 17:10 ` Omar Sandoval
0 siblings, 2 replies; 9+ messages in thread
From: Qu Wenruo @ 2020-07-02 11:21 UTC (permalink / raw)
To: Rebraca Dejan (BSOT/PJ-ES1-Bg), linux-btrfs@vger.kernel.org
[-- Attachment #1.1: Type: text/plain, Size: 3697 bytes --]
On 2020/7/2 下午7:08, Rebraca Dejan (BSOT/PJ-ES1-Bg) wrote:
> Hi Qu,
>
> I'm using this structure to get the address of file extent:
>
> struct fiemap_extent {
> __u64 fe_logical; /* logical offset in bytes for the start of
> * the extent */
> __u64 fe_physical; /* physical offset in bytes for the start
> * of the extent */
fe_physical in btrfs is btrfs logical address.
> __u64 fe_length; /* length in bytes for the extent */
> __u64 fe_reserved64[2];
> __u32 fe_flags; /* FIEMAP_EXTENT_* flags for this extent */
> __u32 fe_reserved[3];
> };
>
> And using fe_physical field I verified that it really reflects the offset in filesystem image - I can see that file content begins at this offset.
> The problem is that I run into some specific case where file content doesn't begin at fe_physical, I rather have something else at this offset.
As said, there is no guarantee that btrfs logical address is mapped 1:1
on disk.
It's possible, but never guaranteed.
You need to pass that fe_physical number to btrfs-map-logical to find
the real on-disk offset.
Thanks,
Qu
>
> Thanks,
> Dejan
>
> -----Original Message-----
> From: Qu Wenruo <quwenruo.btrfs@gmx.com>
> Sent: četvrtak, 02. jul 2020. 12:19
> To: Rebraca Dejan (BSOT/PJ-ES1-Bg) <Dejan.Rebraca@rs.bosch.com>; linux-btrfs@vger.kernel.org
> Subject: Re: FIEMAP ioctl gets "wrong" address for the extent
>
>
>
> On 2020/7/2 下午5:11, Rebraca Dejan (BSOT/PJ-ES1-Bg) wrote:
>> Hi all,
>>
>> I'm collecting file extents for our application from BtrFs filesystem image.
>> I've noticed that for some files a get the "wrong" physical offset for start of the extent.
>
> First thing first, btrfs fiemap ioctl only returns btrfs logical address.
> That's an address space in [0, U64_MAX), thus it's not a physical offset you can find in the device.
>
> For example, for a btrfs on a 10G disk, btrfs fiemap can return address at 128G, which you can never find on that disk.
>
> This is not that strange, as btrfs can be a multi-device fs, thus we must have an internal address space, and then map part of the logical address into physical disk space.
>
>> I verified it using hexdump of the filesystem image: when dump the content starting from the address returned from FIEMAP ioctl, I see that the content is absolutely different from the content of the file itself. Also, the FIEMAP ioctl reports regular extent, it is not inline.
>
> If you're using the logical address returned from disk directly, then you won't get the correct data obviously.
>
> What you need is to map the btrfs logical address to physical device offset, that is done by referring to chunk tree.
> And even after the conversion, it's not always the case for all profiles.
> For SINGLE/DUP/RAID0/RAID1/RAID10/RAID1C*, you can find the data directly, but for RAID5/6, you need to bother the P/Q stripe.
>
> And furthermore, there are compressed data extents, which on-disk data is compressed, which also diffs from the uncompressed data.
>
>
> For the chunk mapping, you can verify the mapping of <logical address> to <physical address> using btrfs inspect dump-tree -t chunk <device>.
>
> The details of the btrfs_chunk on-disk format can be found here:
> https://btrfs.wiki.kernel.org/index.php/On-disk_Format#CHUNK_ITEM_.28e4.29
>
> Thanks,
> Qu
>
>>
>> Environment:
>> - 4.15.0-96-generic #97~16.04.1-Ubuntu SMP Wed Apr 1 03:03:31 UTC 2020
>> x86_64 x86_64 x86_64 GNU/Linux
>> - btrfs-progs v4.4
>>
>> Does anyone has any idea? I would appreciate your help on this one.
>> Tnx.
>>
>> Best regards,
>> Dejan
>>
>
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: FIEMAP ioctl gets "wrong" address for the extent
2020-07-02 9:11 FIEMAP ioctl gets "wrong" address for the extent Rebraca Dejan (BSOT/PJ-ES1-Bg)
2020-07-02 10:18 ` Qu Wenruo
@ 2020-07-02 11:43 ` David Sterba
2020-07-07 9:43 ` Anand Jain
1 sibling, 1 reply; 9+ messages in thread
From: David Sterba @ 2020-07-02 11:43 UTC (permalink / raw)
To: Rebraca Dejan (BSOT/PJ-ES1-Bg); +Cc: linux-btrfs@vger.kernel.org
On Thu, Jul 02, 2020 at 09:11:20AM +0000, Rebraca Dejan (BSOT/PJ-ES1-Bg) wrote:
> Hi all,
>
> I'm collecting file extents for our application from BtrFs filesystem image.
> I've noticed that for some files a get the "wrong" physical offset for
> start of the extent. I verified it using hexdump of the filesystem
> image: when dump the content starting from the address returned from
> FIEMAP ioctl, I see that the content is absolutely different from the
> content of the file itself. Also, the FIEMAP ioctl reports regular
> extent, it is not inline.
There are 3 address spaces:
- device physical offsets
- filesystem physical offsets
- filesystem logical offsets
What you seem to expect is that device physical and filesystem physical
and the same. This is not true in general in btrfs and fiemap will
return only the filesystem offsets. To get to the device offsets you'd
need to do the reverse mapping.
^ permalink raw reply [flat|nested] 9+ messages in thread
* RE: FIEMAP ioctl gets "wrong" address for the extent
2020-07-02 11:21 ` Qu Wenruo
@ 2020-07-03 7:13 ` Rebraca Dejan (BSOT/PJ-ES1-Bg)
2020-07-06 17:10 ` Omar Sandoval
1 sibling, 0 replies; 9+ messages in thread
From: Rebraca Dejan (BSOT/PJ-ES1-Bg) @ 2020-07-03 7:13 UTC (permalink / raw)
To: Qu Wenruo, linux-btrfs@vger.kernel.org
Thanks a lot Qu for this clarification, I was not aware of it.
Cheers,
Dejan
-----Original Message-----
From: Qu Wenruo <quwenruo.btrfs@gmx.com>
Sent: četvrtak, 02. jul 2020. 13:22
To: Rebraca Dejan (BSOT/PJ-ES1-Bg) <Dejan.Rebraca@rs.bosch.com>; linux-btrfs@vger.kernel.org
Subject: Re: FIEMAP ioctl gets "wrong" address for the extent
On 2020/7/2 下午7:08, Rebraca Dejan (BSOT/PJ-ES1-Bg) wrote:
> Hi Qu,
>
> I'm using this structure to get the address of file extent:
>
> struct fiemap_extent {
> __u64 fe_logical; /* logical offset in bytes for the start of
> * the extent */
> __u64 fe_physical; /* physical offset in bytes for the start
> * of the extent */
fe_physical in btrfs is btrfs logical address.
> __u64 fe_length; /* length in bytes for the extent */
> __u64 fe_reserved64[2];
> __u32 fe_flags; /* FIEMAP_EXTENT_* flags for this extent */
> __u32 fe_reserved[3];
> };
>
> And using fe_physical field I verified that it really reflects the offset in filesystem image - I can see that file content begins at this offset.
> The problem is that I run into some specific case where file content doesn't begin at fe_physical, I rather have something else at this offset.
As said, there is no guarantee that btrfs logical address is mapped 1:1 on disk.
It's possible, but never guaranteed.
You need to pass that fe_physical number to btrfs-map-logical to find the real on-disk offset.
Thanks,
Qu
>
> Thanks,
> Dejan
>
> -----Original Message-----
> From: Qu Wenruo <quwenruo.btrfs@gmx.com>
> Sent: četvrtak, 02. jul 2020. 12:19
> To: Rebraca Dejan (BSOT/PJ-ES1-Bg) <Dejan.Rebraca@rs.bosch.com>;
> linux-btrfs@vger.kernel.org
> Subject: Re: FIEMAP ioctl gets "wrong" address for the extent
>
>
>
> On 2020/7/2 下午5:11, Rebraca Dejan (BSOT/PJ-ES1-Bg) wrote:
>> Hi all,
>>
>> I'm collecting file extents for our application from BtrFs filesystem image.
>> I've noticed that for some files a get the "wrong" physical offset for start of the extent.
>
> First thing first, btrfs fiemap ioctl only returns btrfs logical address.
> That's an address space in [0, U64_MAX), thus it's not a physical offset you can find in the device.
>
> For example, for a btrfs on a 10G disk, btrfs fiemap can return address at 128G, which you can never find on that disk.
>
> This is not that strange, as btrfs can be a multi-device fs, thus we must have an internal address space, and then map part of the logical address into physical disk space.
>
>> I verified it using hexdump of the filesystem image: when dump the content starting from the address returned from FIEMAP ioctl, I see that the content is absolutely different from the content of the file itself. Also, the FIEMAP ioctl reports regular extent, it is not inline.
>
> If you're using the logical address returned from disk directly, then you won't get the correct data obviously.
>
> What you need is to map the btrfs logical address to physical device offset, that is done by referring to chunk tree.
> And even after the conversion, it's not always the case for all profiles.
> For SINGLE/DUP/RAID0/RAID1/RAID10/RAID1C*, you can find the data directly, but for RAID5/6, you need to bother the P/Q stripe.
>
> And furthermore, there are compressed data extents, which on-disk data is compressed, which also diffs from the uncompressed data.
>
>
> For the chunk mapping, you can verify the mapping of <logical address> to <physical address> using btrfs inspect dump-tree -t chunk <device>.
>
> The details of the btrfs_chunk on-disk format can be found here:
> https://btrfs.wiki.kernel.org/index.php/On-disk_Format#CHUNK_ITEM_.28e
> 4.29
>
> Thanks,
> Qu
>
>>
>> Environment:
>> - 4.15.0-96-generic #97~16.04.1-Ubuntu SMP Wed Apr 1 03:03:31 UTC
>> 2020
>> x86_64 x86_64 x86_64 GNU/Linux
>> - btrfs-progs v4.4
>>
>> Does anyone has any idea? I would appreciate your help on this one.
>> Tnx.
>>
>> Best regards,
>> Dejan
>>
>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: FIEMAP ioctl gets "wrong" address for the extent
2020-07-02 11:21 ` Qu Wenruo
2020-07-03 7:13 ` Rebraca Dejan (BSOT/PJ-ES1-Bg)
@ 2020-07-06 17:10 ` Omar Sandoval
1 sibling, 0 replies; 9+ messages in thread
From: Omar Sandoval @ 2020-07-06 17:10 UTC (permalink / raw)
To: Qu Wenruo; +Cc: Rebraca Dejan (BSOT/PJ-ES1-Bg), linux-btrfs@vger.kernel.org
On Thu, Jul 02, 2020 at 07:21:42PM +0800, Qu Wenruo wrote:
>
>
> On 2020/7/2 下午7:08, Rebraca Dejan (BSOT/PJ-ES1-Bg) wrote:
> > Hi Qu,
> >
> > I'm using this structure to get the address of file extent:
> >
> > struct fiemap_extent {
> > __u64 fe_logical; /* logical offset in bytes for the start of
> > * the extent */
> > __u64 fe_physical; /* physical offset in bytes for the start
> > * of the extent */
>
> fe_physical in btrfs is btrfs logical address.
>
> > __u64 fe_length; /* length in bytes for the extent */
> > __u64 fe_reserved64[2];
> > __u32 fe_flags; /* FIEMAP_EXTENT_* flags for this extent */
> > __u32 fe_reserved[3];
> > };
> >
> > And using fe_physical field I verified that it really reflects the offset in filesystem image - I can see that file content begins at this offset.
> > The problem is that I run into some specific case where file content doesn't begin at fe_physical, I rather have something else at this offset.
>
> As said, there is no guarantee that btrfs logical address is mapped 1:1
> on disk.
> It's possible, but never guaranteed.
>
> You need to pass that fe_physical number to btrfs-map-logical to find
> the real on-disk offset.
>
> Thanks,
> Qu
FYI, I have a utility that does this mapping for all extents in a file:
https://github.com/osandov/osandov-linux/blob/master/scripts/btrfs_map_physical.c
$ sudo ./btrfs_map_physical archlinux-2020.07.01-x86_64.iso | column -ts $'\t'
FILE OFFSET FILE SIZE EXTENT OFFSET EXTENT TYPE LOGICAL SIZE LOGICAL OFFSET PHYSICAL SIZE DEVID PHYSICAL OFFSET
0 6811648 0 regular 6815744 304680529920 6815744 1 89898610688
6811648 4096 0 regular 4096 304594616320 4096 1 89812697088
6815744 70250496 0 regular 70254592 419517255680 70254592 1 168228114432
77066240 4096 0 regular 4096 419587510272 4096 1 168298369024
77070336 127647744 0 regular 127647744 443648155648 127647744 1 209538883584
204718080 552960 0 regular 557056 304605401088 557056 1 89823481856
205271040 134217728 0 regular 134217728 491017764864 134217728 1 238654881792
339488768 43814912 0 regular 43814912 419587514368 43814912 1 168298373120
383303680 241664 0 regular 245760 304605958144 245760 1 89824038912
383545344 4096 0 regular 4096 304594620416 4096 1 89812701184
383549440 134217728 0 regular 134217728 517290700800 134217728 1 255264141312
517767168 78376960 0 regular 78381056 451287601152 78381056 1 213957103616
596144128 82284544 0 regular 82284544 517424918528 82284544 1 255398359040
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: FIEMAP ioctl gets "wrong" address for the extent
2020-07-02 11:43 ` David Sterba
@ 2020-07-07 9:43 ` Anand Jain
2020-07-07 11:38 ` David Sterba
0 siblings, 1 reply; 9+ messages in thread
From: Anand Jain @ 2020-07-07 9:43 UTC (permalink / raw)
To: dsterba, Rebraca Dejan (BSOT/PJ-ES1-Bg),
linux-btrfs@vger.kernel.org
On 2/7/20 7:43 pm, David Sterba wrote:
> On Thu, Jul 02, 2020 at 09:11:20AM +0000, Rebraca Dejan (BSOT/PJ-ES1-Bg) wrote:
>> Hi all,
>>
>> I'm collecting file extents for our application from BtrFs filesystem image.
>> I've noticed that for some files a get the "wrong" physical offset for
>> start of the extent. I verified it using hexdump of the filesystem
>> image: when dump the content starting from the address returned from
>> FIEMAP ioctl, I see that the content is absolutely different from the
>> content of the file itself. Also, the FIEMAP ioctl reports regular
>> extent, it is not inline.
>
> There are 3 address spaces:
>
> - device physical offsets
> - filesystem physical offsets
> - filesystem logical offsets
>
> What you seem to expect is that device physical and filesystem physical
> and the same. This is not true in general in btrfs and fiemap will
> return only the filesystem offsets. To get to the device offsets you'd
> need to do the reverse mapping.
Do you think is it a good idea to rather update vfs? A quick check
indicates struct fiemap_extent has reserved space to hold the devid, and
should handle the backward compatibility issues.
struct fiemap_extent {
__u64 fe_logical; /* logical offset in bytes for the start of
* the extent */
__u64 fe_physical; /* physical offset in bytes for the start
* of the extent */
__u64 fe_length; /* length in bytes for the extent */
__u64 fe_reserved64[2];
__u32 fe_flags; /* FIEMAP_EXTENT_* flags for this extent */
__u32 fe_reserved[3];
};
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: FIEMAP ioctl gets "wrong" address for the extent
2020-07-07 9:43 ` Anand Jain
@ 2020-07-07 11:38 ` David Sterba
0 siblings, 0 replies; 9+ messages in thread
From: David Sterba @ 2020-07-07 11:38 UTC (permalink / raw)
To: Anand Jain
Cc: dsterba, Rebraca Dejan (BSOT/PJ-ES1-Bg),
linux-btrfs@vger.kernel.org
On Tue, Jul 07, 2020 at 05:43:09PM +0800, Anand Jain wrote:
> On 2/7/20 7:43 pm, David Sterba wrote:
> > On Thu, Jul 02, 2020 at 09:11:20AM +0000, Rebraca Dejan (BSOT/PJ-ES1-Bg) wrote:
> >> Hi all,
> >>
> >> I'm collecting file extents for our application from BtrFs filesystem image.
> >> I've noticed that for some files a get the "wrong" physical offset for
> >> start of the extent. I verified it using hexdump of the filesystem
> >> image: when dump the content starting from the address returned from
> >> FIEMAP ioctl, I see that the content is absolutely different from the
> >> content of the file itself. Also, the FIEMAP ioctl reports regular
> >> extent, it is not inline.
> >
> > There are 3 address spaces:
> >
> > - device physical offsets
> > - filesystem physical offsets
> > - filesystem logical offsets
> >
> > What you seem to expect is that device physical and filesystem physical
> > and the same. This is not true in general in btrfs and fiemap will
> > return only the filesystem offsets. To get to the device offsets you'd
> > need to do the reverse mapping.
>
> Do you think is it a good idea to rather update vfs? A quick check
> indicates struct fiemap_extent has reserved space to hold the devid, and
> should handle the backward compatibility issues.
This was proposed a few years back on LSF/MM, whether to extend fiemap
with the device related information or to add a completely new ioctl
that would not have to extend the existing interface in a way that could
become unwieldy.
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2020-07-07 11:39 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-07-02 9:11 FIEMAP ioctl gets "wrong" address for the extent Rebraca Dejan (BSOT/PJ-ES1-Bg)
2020-07-02 10:18 ` Qu Wenruo
2020-07-02 11:08 ` Rebraca Dejan (BSOT/PJ-ES1-Bg)
2020-07-02 11:21 ` Qu Wenruo
2020-07-03 7:13 ` Rebraca Dejan (BSOT/PJ-ES1-Bg)
2020-07-06 17:10 ` Omar Sandoval
2020-07-02 11:43 ` David Sterba
2020-07-07 9:43 ` Anand Jain
2020-07-07 11:38 ` David Sterba
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox