• Filipe Manana's avatar
    Btrfs: fix failure to persist compression property xattr deletion on fsync · 3763771c
    Filipe Manana authored
    After the recent series of cleanups in the properties and xattrs modules
    that landed in the 5.2 merge window, we ended up with a regression where
    after deleting the compression xattr property through the setflags ioctl,
    we don't set the BTRFS_INODE_COPY_EVERYTHING flag in the inode anymore.
    As a consequence, if the inode was fsync'ed when it had the compression
    property set, after deleting the compression property through the setflags
    ioctl and fsync'ing again the inode, the log will still contain the
    compression xattr, because the inode did not had that bit set, which
    made the fsync not delete all xattrs from the log and copy all xattrs
    from the subvolume tree to the log tree.
    
    This regression happens due to the fact that that series of cleanups
    made btrfs_set_prop() call the old function do_setxattr() (which is now
    named btrfs_setxattr()), and not the old version of btrfs_setxattr(),
    which is now called btrfs_setxattr_trans().
    
    Fix this by setting the BTRFS_INODE_COPY_EVERYTHING bit in the current
    btrfs_setxattr() function and remove it from everywhere else, including
    its setup at btrfs_ioctl_setflags(). This is cleaner, avoids similar
    regressions in the future, and centralizes the setup of the bit. After
    all, the need to setup this bit should only be in the xattrs module,
    since it is an implementation of xattrs.
    
    Fixes: 04e6863b ("btrfs: split btrfs_setxattr calls regarding transaction")
    CC: stable@vger.kernel.org # 4.4+
    Signed-off-by: default avatarFilipe Manana <fdmanana@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    3763771c
ioctl.c 140 KB