* Bug or feature? logical_to_ino skips inodes with offset mismatch
@ 2017-02-05 21:54 Hans van Kranenburg
2017-02-05 22:45 ` Hans van Kranenburg
0 siblings, 1 reply; 2+ messages in thread
From: Hans van Kranenburg @ 2017-02-05 21:54 UTC (permalink / raw)
To: linux-btrfs
I was playing around with logical_to_ino and also implemented calling
ino_lookup today to create a program that will print all data extents in
a block group, and their related inodes and at least one filename per inode.
https://github.com/knorrie/python-btrfs/commits/develop
See "examples: show filenames for data extents"
I ran into the following behaviour of logical_to_ino:
If the offset value in a backreference of an extent_item does not match
the offset value of the extent_data object in the fs tree,
logical_to_ino will skip the inode that uses data from the extent, and
not report it.
This leads to extents for which logical_to_ino does not give any result,
while there's actually a file using data from the extent.
Is this a bug or a feature?
How to test (only relevant output lines pasted):
1. copy a file into place:
-# cp /boot/vmlinuz-4.9.0-1-amd64 /mnt/i320/fstree/
-# examples/show_block_group_contents.py 289406976 /mnt/i320/fstree/
extent vaddr 336048128 length 4186112 refs 1 gen 57 flags DATA
inline extent data backref root 5 objectid 266 offset 0 count 1
-# examples/show_block_group_data_extent_filenames.py 289406976
/mnt/i320/fstree/
extent vaddr 336048128 length 4186112 refs 1 gen 57 flags DATA
root 5 inode 266 offset 0 path 'vmlinuz-4.9.0-1-amd64'
-# btrfs inspect-internal logical-resolve 336048128 .
./vmlinuz-4.9.0-1-amd64
2. Now, overwrite the beginning of the file, so we have a new extent for
that data, and so that the old big extent holds 16kiB of
'wasted/unreachable' data at the beginning.
-# dd if=/dev/urandom bs=16k conv=notrunc of=vmlinuz-4.9.0-1-amd64 count=1
Result:
-# examples/show_block_group_contents.py 289406976 /mnt/i320/fstree/
extent vaddr 336048128 length 4186112 refs 1 gen 57 flags DATA
inline extent data backref root 5 objectid 266 offset 0 count 1
extent vaddr 341217280 length 16384 refs 1 gen 60 flags DATA
inline extent data backref root 5 objectid 266 offset 0 count 1
Notice that the backrefs both list offset 0, since there's only one per
referenced inode and it doesn't get updated when the're a change in
which parts of the extent are actually still used by the inode.
3. logical_to_ino does not list the inode any more as user of this
extent now:
-# examples/show_block_group_data_extent_filenames.py 289406976
/mnt/i320/fstree/
extent vaddr 336048128 length 4186112 refs 1 gen 57 flags DATA
extent vaddr 341217280 length 16384 refs 1 gen 60 flags DATA
root 5 inode 266 offset 0 path 'vmlinuz-4.9.0-1-amd64'
-# btrfs inspect-internal logical-resolve 336048128 .
<no output>
-# btrfs-debug-tree -t 5 /dev/i320/fstree
item 6 key (266 EXTENT_DATA 0) itemoff 15765 itemsize 53
extent data disk byte 341217280 nr 16384
extent data offset 0 nr 16384 ram 16384
extent compression(none)
item 7 key (266 EXTENT_DATA 16384) itemoff 15712 itemsize 53
extent data disk byte 336048128 nr 4186112
extent data offset 16384 nr 4169728 ram 4186112
extent compression(none)
--
Hans van Kranenburg
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: Bug or feature? logical_to_ino skips inodes with offset mismatch
2017-02-05 21:54 Bug or feature? logical_to_ino skips inodes with offset mismatch Hans van Kranenburg
@ 2017-02-05 22:45 ` Hans van Kranenburg
0 siblings, 0 replies; 2+ messages in thread
From: Hans van Kranenburg @ 2017-02-05 22:45 UTC (permalink / raw)
To: linux-btrfs
On 02/05/2017 10:54 PM, Hans van Kranenburg wrote:
> I was playing around with logical_to_ino and also implemented calling
> ino_lookup today to create a program that will print all data extents in
> a block group, and their related inodes and at least one filename per inode.
>
> https://github.com/knorrie/python-btrfs/commits/develop
> See "examples: show filenames for data extents"
>
> I ran into the following behaviour of logical_to_ino:
>
> If the offset value in a backreference of an extent_item does not match
> the offset value of the extent_data object in the fs tree,
> logical_to_ino will skip the inode that uses data from the extent, and
> not report it.
Ah, wait... To answer my own question... The reason is probably because
the data at that exact place is not actually in use.
-# btrfs inspect-internal logical-resolve 336064511 . (+ 16KiB - 1)
-# btrfs inspect-internal logical-resolve 336064512 . (+ 16KiB)
./vmlinuz-4.9.0-1-amd64
-# btrfs inspect-internal logical-resolve 336064513 .
./vmlinuz-4.9.0-1-amd64
Jups... Makes sense.
But, it also means that I cannot use logical_to_ino as a helper to
expand shared backrefs to actual inode info... Meh.
--
Hans van Kranenburg
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2017-02-05 22:45 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-02-05 21:54 Bug or feature? logical_to_ino skips inodes with offset mismatch Hans van Kranenburg
2017-02-05 22:45 ` Hans van Kranenburg
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox