Linux Btrfs filesystem development
 help / color / mirror / Atom feed
From: robbieko <robbieko@synology.com>
To: fdmanana@kernel.org
Cc: linux-btrfs@vger.kernel.org, linux-btrfs-owner@vger.kernel.org
Subject: Re: [PATCH] Btrfs: fix physical offset reported by fiemap for inline extents
Date: Wed, 20 Jun 2018 10:55:14 +0800	[thread overview]
Message-ID: <a3ac21e1b8a15a3f8ec8d67992ef4de8@synology.com> (raw)
In-Reply-To: <20180619113142.9020-1-fdmanana@kernel.org>

fdmanana@kernel.org 於 2018-06-19 19:31 寫到:
> From: Filipe Manana <fdmanana@suse.com>
> 
> Commit 9d311e11fc1f ("Btrfs: fiemap: pass correct bytenr when
> fm_extent_count is zero") introduced a regression where we no longer
> report 0 as the physical offset for inline extents. This is because it
> always sets the variable used to report the physical offset ("disko")
> as em->block_start plus some offset, and em->block_start has the value
> 18446744073709551614 ((u64) -2) for inline extents.
> 
> This made the btrfs test 004 (from fstests) often fail, for example, 
> for
> a file with an inline extent we have the following items in the 
> subvolume
> tree:
> 
>     item 101 key (418 INODE_ITEM 0) itemoff 11029 itemsize 160
>            generation 25 transid 38 size 1525 nbytes 1525
>            block group 0 mode 100666 links 1 uid 0 gid 0 rdev 0
>            sequence 0 flags 0x2(none)
>            atime 1529342058.461891730 (2018-06-18 18:14:18)
>            ctime 1529342058.461891730 (2018-06-18 18:14:18)
>            mtime 1529342058.461891730 (2018-06-18 18:14:18)
>            otime 1529342055.869892885 (2018-06-18 18:14:15)
>     item 102 key (418 INODE_REF 264) itemoff 11016 itemsize 13
>            index 25 namelen 3 name: fc7
>     item 103 key (418 EXTENT_DATA 0) itemoff 9470 itemsize 1546
>            generation 38 type 0 (inline)
>            inline extent data size 1525 ram_bytes 1525 compression 0 
> (none)
> 
> Then when test 004 invoked fiemap against the file it got a non-zero
> physical offset:
> 
>  $ filefrag -v /mnt/p0/d4/d7/fc7
>  Filesystem type is: 9123683e
>  File size of /mnt/p0/d4/d7/fc7 is 1525 (1 block of 4096 bytes)
>   ext:     logical_offset:        physical_offset: length:   expected: 
> flags:
>     0:        0..    4095: 18446744073709551614..      4093:   4096:
>           last,not_aligned,inline,eof
>  /mnt/p0/d4/d7/fc7: 1 extent found
> 
> This resulted in the test failing like this:
> 
> btrfs/004 49s ... [failed, exit status 1]- output mismatch (see
> /home/fdmanana/git/hub/xfstests/results//btrfs/004.out.bad)
>     --- tests/btrfs/004.out	2016-08-23 10:17:35.027012095 +0100
>     +++
> /home/fdmanana/git/hub/xfstests/results//btrfs/004.out.bad	2018-06-18
> 18:15:02.385872155 +0100
>     @@ -1,3 +1,10 @@
>      QA output created by 004
>      *** test backref walking
>     -*** done
>     +./tests/btrfs/004: line 227: [: 7.55578637259143e+22: integer
> expression expected
>     +ERROR: 7.55578637259143e+22 is not a valid numeric value.
>     +unexpected output from
>     +	/home/fdmanana/git/hub/btrfs-progs/btrfs inspect-internal
> logical-resolve -s 65536 -P 7.55578637259143e+22
> /home/fdmanana/btrfs-tests/scratch_1
>     ...
>     (Run 'diff -u tests/btrfs/004.out
> /home/fdmanana/git/hub/xfstests/results//btrfs/004.out.bad'  to see
> the entire diff)
> Ran: btrfs/004
> 
> The large number in scientific notation reported as an invalid numeric
> value is the result from the filter passed to perl which multiplies the
> physical offset by the block size reported by fiemap.
> 
> So fix this by ensuring the physical offset is always set to 0 when we
> are processing an inline extent.
> 
> Fixes: 9d311e11fc1f ("Btrfs: fiemap: pass correct bytenr when
> fm_extent_count is zero")
> Signed-off-by: Filipe Manana <fdmanana@suse.com>
> ---
>  fs/btrfs/extent_io.c | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
> index 8e4a7cdbc9f5..978327d98fc5 100644
> --- a/fs/btrfs/extent_io.c
> +++ b/fs/btrfs/extent_io.c
> @@ -4559,6 +4559,7 @@ int extent_fiemap(struct inode *inode, struct
> fiemap_extent_info *fieinfo,
>  			end = 1;
>  			flags |= FIEMAP_EXTENT_LAST;
>  		} else if (em->block_start == EXTENT_MAP_INLINE) {
> +			disko = 0;
>  			flags |= (FIEMAP_EXTENT_DATA_INLINE |
>  				  FIEMAP_EXTENT_NOT_ALIGNED);
>  		} else if (em->block_start == EXTENT_MAP_DELALLOC) {


EXTENT_MAP_DELALLOC should have the same problem.

em->block_start has some special values. The following values ​​should 
not be considered disko
#define EXTENT_MAP_LAST_BYTE((u64)-4)
#define EXTENT_MAP_HOLE((u64)-3)
#define EXTENT_MAP_INLINE((u64)-2)
#define EXTENT_MAP_DELALLOC((u64)-1)

Is the following change more suitable?
if (em->block_start >= EXTENT_MAP_LAST_BYTE)
     disko = 0;
else
     disko = em->block_start + offset_in_extent;

Thanks.
Robbie Ko



  parent reply	other threads:[~2018-06-20  2:55 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-06-19 11:31 [PATCH] Btrfs: fix physical offset reported by fiemap for inline extents fdmanana
2018-06-19 17:53 ` David Sterba
2018-06-20  2:55 ` robbieko [this message]
2018-06-20  9:02   ` Filipe Manana
2018-06-20  9:02 ` [PATCH v2] " fdmanana
2018-06-25  9:36   ` Nikolay Borisov

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=a3ac21e1b8a15a3f8ec8d67992ef4de8@synology.com \
    --to=robbieko@synology.com \
    --cc=fdmanana@kernel.org \
    --cc=linux-btrfs-owner@vger.kernel.org \
    --cc=linux-btrfs@vger.kernel.org \
    /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