• Jan Kara's avatar
    ext3: Fix oops in ext3_try_to_allocate_with_rsv() · ad95c5e9
    Jan Kara authored
    Block allocation is called from two places: ext3_get_blocks_handle() and
    ext3_xattr_block_set(). These two callers are not necessarily synchronized
    because xattr code holds only xattr_sem and i_mutex, and
    ext3_get_blocks_handle() may hold only truncate_mutex when called from
    writepage() path. Block reservation code does not expect two concurrent
    allocations to happen to the same inode and thus assertions can be triggered
    or reservation structure corruption can occur.
    
    Fix the problem by taking truncate_mutex in xattr code to serialize
    allocations.
    
    CC: Sage Weil <sage@newdream.net>
    CC: stable@kernel.org
    Reported-by: default avatarFyodor Ustinov <ufm@ufm.su>
    Signed-off-by: default avatarJan Kara <jack@suse.cz>
    ad95c5e9
xattr.c 34.7 KB