• A
    selinux: Convert isec->lock into a spinlock · 9287aed2
    Andreas Gruenbacher 提交于
    Convert isec->lock from a mutex into a spinlock.  Instead of holding
    the lock while sleeping in inode_doinit_with_dentry, set
    isec->initialized to LABEL_PENDING and release the lock.  Then, when
    the sid has been determined, re-acquire the lock.  If isec->initialized
    is still set to LABEL_PENDING, set isec->sid; otherwise, the sid has
    been set by another task (LABEL_INITIALIZED) or invalidated
    (LABEL_INVALID) in the meantime.
    
    This fixes a deadlock on gfs2 where
    
     * one task is in inode_doinit_with_dentry -> gfs2_getxattr, holds
       isec->lock, and tries to acquire the inode's glock, and
    
     * another task is in do_xmote -> inode_go_inval ->
       selinux_inode_invalidate_secctx, holds the inode's glock, and
       tries to acquire isec->lock.
    Signed-off-by: NAndreas Gruenbacher <agruenba@redhat.com>
    [PM: minor tweaks to keep checkpatch.pl happy]
    Signed-off-by: NPaul Moore <paul@paul-moore.com>
    9287aed2
hooks.c 162.8 KB