• Filipe Manana's avatar
    Btrfs: don't insert useless holes when punching beyond the inode's size · 12870f1c
    Filipe Manana authored
    If we punch beyond the size of an inode, we'll correctly remove any prealloc extents,
    but we'll also insert file extent items representing holes (disk bytenr == 0) that start
    with a key offset that lies beyond the inode's size and are not contiguous with the last
    file extent item.
    
    Example:
    
      $XFS_IO_PROG -f -c "truncate 118811" $SCRATCH_MNT/foo
      $XFS_IO_PROG -c "fpunch 582007 864596" $SCRATCH_MNT/foo
      $XFS_IO_PROG -c "pwrite -S 0x0d -b 39987 92267 39987" $SCRATCH_MNT/foo
    
    btrfs-debug-tree output:
    
      item 4 key (257 INODE_ITEM 0) itemoff 15885 itemsize 160
    	inode generation 6 transid 6 size 132254 block group 0 mode 100600 links 1
      item 5 key (257 INODE_REF 256) itemoff 15872 itemsize 13
    	inode ref index 2 namelen 3 name: foo
      item 6 key (257 EXTENT_DATA 0) itemoff 15819 itemsize 53
    	extent data disk byte 0 nr 0 gen 6
    	extent data offset 0 nr 90112 ram 122880
    	extent compression 0
      item 7 key (257 EXTENT_DATA 90112) itemoff 15766 itemsize 53
    	extent data disk byte 12845056 nr 4096 gen 6
    	extent data offset 0 nr 45056 ram 45056
    	extent compression 2
      item 8 key (257 EXTENT_DATA 585728) itemoff 15713 itemsize 53
    	extent data disk byte 0 nr 0 gen 6
    	extent data offset 0 nr 860160 ram 860160
    	extent compression 0
    
    The last extent item, which represents a hole, is useless as it lies beyond the inode's
    size.
    Signed-off-by: default avatarFilipe David Borba Manana <fdmanana@gmail.com>
    Signed-off-by: default avatarJosef Bacik <jbacik@fb.com>
    12870f1c
file.c 68.4 KB