• Jan Kara's avatar
    ext4: fix xattr shifting when expanding inodes · 0e792c6d
    Jan Kara authored
    commit d0141191 upstream.
    
    The code in ext4_expand_extra_isize_ea() treated new_extra_isize
    argument sometimes as the desired target i_extra_isize and sometimes as
    the amount by which we need to grow current i_extra_isize. These happen
    to coincide when i_extra_isize is 0 which used to be the common case and
    so nobody noticed this until recently when we added i_projid to the
    inode and so i_extra_isize now needs to grow from 28 to 32 bytes.
    
    The result of these bugs was that we sometimes unnecessarily decided to
    move xattrs out of inode even if there was enough space and we often
    ended up corrupting in-inode xattrs because arguments to
    ext4_xattr_shift_entries() were just wrong. This could demonstrate
    itself as BUG_ON in ext4_xattr_shift_entries() triggering.
    
    Fix the problem by introducing new isize_diff variable and use it where
    appropriate.
    Reported-by: default avatarDave Chinner <david@fromorbit.com>
    Signed-off-by: default avatarJan Kara <jack@suse.cz>
    Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    0e792c6d
xattr.c 48.1 KB