• Jan Kara's avatar
    udf: Fix deadlock between writeback and udf_setsize() · deec8c69
    Jan Kara authored
    [ Upstream commit f2e95355 ]
    
    udf_setsize() called truncate_setsize() with i_data_sem held. Thus
    truncate_pagecache() called from truncate_setsize() could lock a page
    under i_data_sem which can deadlock as page lock ranks below
    i_data_sem - e. g. writeback can hold page lock and try to acquire
    i_data_sem to map a block.
    
    Fix the problem by moving truncate_setsize() calls from under
    i_data_sem. It is safe for us to change i_size without holding
    i_data_sem as all the places that depend on i_size being stable already
    hold inode_lock.
    
    CC: stable@vger.kernel.org
    Fixes: 7e49b6f2Signed-off-by: default avatarJan Kara <jack@suse.cz>
    Signed-off-by: default avatarSasha Levin <alexander.levin@verizon.com>
    deec8c69
inode.c 65.5 KB