• Chao Yu's avatar
    f2fs: fix to retrieve inline xattr space · 45a74688
    Chao Yu authored
    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>
    45a74688
inline.c 17.2 KB