• Andreas Gruenbacher's avatar
    selinux: Convert isec->lock into a spinlock · 9287aed2
    Andreas Gruenbacher authored
    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: default avatarAndreas Gruenbacher <agruenba@redhat.com>
    [PM: minor tweaks to keep checkpatch.pl happy]
    Signed-off-by: default avatarPaul Moore <paul@paul-moore.com>
    9287aed2
objsec.h 3.64 KB