• Jan Kara's avatar
    ocfs2: Fix possible deadlock with quotas in ocfs2_setattr() · 65bac575
    Jan Kara authored
    We called vfs_dq_transfer() with global quota file lock held. This can lead
    to deadlocks as if vfs_dq_transfer() has to allocate new quota structure,
    it calls ocfs2_dquot_acquire() which tries to get quota file lock again and
    this can block if another node requested the lock in the mean time.
    
    Since we have to call vfs_dq_transfer() with transaction already started
    and quota file lock ranks above the transaction start, we cannot just rely
    on ocfs2_dquot_acquire() or ocfs2_dquot_release() on getting the lock
    if they need it. We fix the problem by acquiring pointers to all quota
    structures needed by vfs_dq_transfer() already before calling the function.
    By this we are sure that all quota structures are properly allocated and
    they can be freed only after we drop references to them. Thus we don't need
    quota file lock anywhere inside vfs_dq_transfer().
    Signed-off-by: default avatarJan Kara <jack@suse.cz>
    Signed-off-by: default avatarJoel Becker <joel.becker@oracle.com>
    65bac575
file.c 53.2 KB