• Chao Yu's avatar
    f2fs: fix to retrieve inline xattr space · 0fd306ae
    Chao Yu authored
    [ Upstream commit 45a74688 ]
    
    With below mkfs and mount option, generic/339 of fstest will report that
    scratch image becomes corrupted.
    
    MKFS_OPTIONS  -- -O extra_attr -O project_quota -O inode_checksum -O flexible_inline_xattr -O inode_crtime -f /dev/zram1
    MOUNT_OPTIONS -- -o acl,user_xattr -o discard,noinline_xattr /dev/zram1 /mnt/scratch_f2fs
    
    [ASSERT] (f2fs_check_dirent_position:1315)  --> Wrong position of dirent pino:1970, name: (...)
    level:8, dir_level:0, pgofs:951, correct range:[900, 901]
    
    In old kernel, inline data and directory always reserved 200 bytes in
    inode layout, even if inline_xattr is disabled, then new kernel tries
    to retrieve that space for non-inline xattr inode, but for inline dentry,
    its layout size should be fixed, so we just keep that reserved space.
    
    But the problem here is that, after inline dentry conversion, inline
    dentry layout no longer exists, if we still reserve inline xattr space,
    after dents updates, there will be a hole in inline xattr space, which
    can break hierarchy hash directory structure.
    
    This patch fixes this issue by retrieving inline xattr space after
    inline dentry conversion.
    
    Fixes: 6afc662e ("f2fs: support flexible inline xattr size")
    Signed-off-by: default avatarChao Yu <yuchao0@huawei.com>
    Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
    Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
    0fd306ae
inline.c 17.2 KB