On Fri, Sep 07, 2018 at 02:16:24PM +0800, Qu Wenruo wrote: > [BUG] > fstrim on some btrfs only trims the unallocated space, not trimming any > space in existing block groups. > > [CAUSE] > Before fstrim_range passed to btrfs_trim_fs(), it get truncated to > range [0, super->total_bytes). > So later btrfs_trim_fs() will only be able to trim block groups in range > [0, super->total_bytes). > > While for btrfs, any bytenr aligned to sector size is valid, since btrfs use > its logical address space, there is nothing limiting the location where > we put block groups. > > For btrfs with routine balance, it's quite easy to relocate all > block groups and bytenr of block groups will start beyond super->total_bytes. > > In that case, btrfs will not trim existing block groups. > > [FIX] > Just remove the truncation in btrfs_ioctl_fitrim(), so btrfs_trim_fs() > can get the unmodified range, which is normally set to [0, U64_MAX]. > > Reported-by: Chris Murphy <lists@xxxxxxxxxxxxxxxxx> > Fixes: f4c697e6406d ("btrfs: return EINVAL if start > total_bytes in fitrim ioctl") > Cc: <stable@xxxxxxxxxxxxxxx> # v4.0+ > Signed-off-by: Qu Wenruo <wqu@xxxxxxxx> Reviewed-by: David Sterba <dsterba@xxxxxxxx>