• Chao Liu's avatar
    f2fs: fix to remove F2FS_COMPR_FL and tag F2FS_NOCOMP_FL at the same time · 8ee236dc
    Chao Liu authored
    If the inode has the compress flag, it will fail to use
    'chattr -c +m' to remove its compress flag and tag no compress flag.
    However, the same command will be successful when executed again,
    as shown below:
    
      $ touch foo.txt
      $ chattr +c foo.txt
      $ chattr -c +m foo.txt
      chattr: Invalid argument while setting flags on foo.txt
      $ chattr -c +m foo.txt
      $ f2fs_io getflags foo.txt
      get a flag on foo.txt ret=0, flags=nocompression,inline_data
    
    Fix this by removing some checks in f2fs_setflags_common()
    that do not affect the original logic. I go through all the
    possible scenarios, and the results are as follows. Bold is
    the only thing that has changed.
    
    +---------------+-----------+-----------+----------+
    |               |            file flags            |
    + command       +-----------+-----------+----------+
    |               | no flag   | compr     | nocompr  |
    +---------------+-----------+-----------+----------+
    | chattr +c     | compr     | compr     | -EINVAL  |
    | chattr -c     | no flag   | no flag   | nocompr  |
    | chattr +m     | nocompr   | -EINVAL   | nocompr  |
    | chattr -m     | no flag   | compr     | no flag  |
    | chattr +c +m  | -EINVAL   | -EINVAL   | -EINVAL  |
    | chattr +c -m  | compr     | compr     | compr    |
    | chattr -c +m  | nocompr   | *nocompr* | nocompr  |
    | chattr -c -m  | no flag   | no flag   | no flag  |
    +---------------+-----------+-----------+----------+
    
    Link: https://lore.kernel.org/linux-f2fs-devel/20220621064833.1079383-1-chaoliu719@gmail.com/
    Fixes: 4c8ff709 ("f2fs: support data compression")
    Reviewed-by: default avatarChao Yu <chao@kernel.org>
    Signed-off-by: default avatarChao Liu <liuchao@coolpad.com>
    Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
    8ee236dc
file.c 115 KB