• Chung-Chiang Cheng's avatar
    btrfs: do not allow compression on nodatacow files · 0e852ab8
    Chung-Chiang Cheng authored
    Compression and nodatacow are mutually exclusive. A similar issue was
    fixed by commit f37c563b ("btrfs: add missing check for nocow and
    compression inode flags"). Besides ioctl, there is another way to
    enable/disable/reset compression directly via xattr. The following
    steps will result in a invalid combination.
    
      $ touch bar
      $ chattr +C bar
      $ lsattr bar
      ---------------C-- bar
      $ setfattr -n btrfs.compression -v zstd bar
      $ lsattr bar
      --------c------C-- bar
    
    To align with the logic in check_fsflags, nocompress will also be
    unacceptable after this patch, to prevent mix any compression-related
    options with nodatacow.
    
      $ touch bar
      $ chattr +C bar
      $ lsattr bar
      ---------------C-- bar
      $ setfattr -n btrfs.compression -v zstd bar
      setfattr: bar: Invalid argument
      $ setfattr -n btrfs.compression -v no bar
      setfattr: bar: Invalid argument
    
    When both compression and nodatacow are enabled, then
    btrfs_run_delalloc_range prefers nodatacow and no compression happens.
    Reported-by: default avatarJayce Lin <jaycelin@synology.com>
    CC: stable@vger.kernel.org # 5.10.x: e6f9d696: btrfs: export a helper for compression hard check
    CC: stable@vger.kernel.org # 5.10.x
    Reviewed-by: default avatarFilipe Manana <fdmanana@suse.com>
    Signed-off-by: default avatarChung-Chiang Cheng <cccheng@synology.com>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    0e852ab8
xattr.c 13.2 KB