From: Eric Paris This patch converts the remaining isec->sem into a mutex. Very similar locking is provided as before only in the faster smaller mutex rather than a semaphore. An out_unlock path is introduced rather than the conditional unlocking found in the original code. Signed-off-by: Eric Paris Acked-by: Stephen Smalley Acked-by: James Morris Signed-off-by: Andrew Morton --- security/selinux/hooks.c | 30 +++++++++++++--------------- security/selinux/include/objsec.h | 2 - 2 files changed, 15 insertions(+), 17 deletions(-) diff -puN security/selinux/hooks.c~selinux-2-3-change-isec-semaphore-to-a-mutex security/selinux/hooks.c --- a/security/selinux/hooks.c~selinux-2-3-change-isec-semaphore-to-a-mutex +++ a/security/selinux/hooks.c @@ -71,6 +71,7 @@ #include #include #include +#include #include "avc.h" #include "objsec.h" @@ -185,7 +186,7 @@ static int inode_alloc_security(struct i return -ENOMEM; memset(isec, 0, sizeof(*isec)); - init_MUTEX(&isec->sem); + mutex_init(&isec->lock); INIT_LIST_HEAD(&isec->list); isec->inode = inode; isec->sid = SECINITSID_UNLABELED; @@ -841,15 +842,13 @@ static int inode_doinit_with_dentry(stru char *context = NULL; unsigned len = 0; int rc = 0; - int hold_sem = 0; if (isec->initialized) goto out; - down(&isec->sem); - hold_sem = 1; + mutex_lock(&isec->lock); if (isec->initialized) - goto out; + goto out_unlock; sbsec = inode->i_sb->s_security; if (!sbsec->initialized) { @@ -860,7 +859,7 @@ static int inode_doinit_with_dentry(stru if (list_empty(&isec->list)) list_add(&isec->list, &sbsec->isec_head); spin_unlock(&sbsec->isec_lock); - goto out; + goto out_unlock; } switch (sbsec->behavior) { @@ -883,7 +882,7 @@ static int inode_doinit_with_dentry(stru printk(KERN_WARNING "%s: no dentry for dev=%s " "ino=%ld\n", __FUNCTION__, inode->i_sb->s_id, inode->i_ino); - goto out; + goto out_unlock; } len = INITCONTEXTLEN; @@ -891,7 +890,7 @@ static int inode_doinit_with_dentry(stru if (!context) { rc = -ENOMEM; dput(dentry); - goto out; + goto out_unlock; } rc = inode->i_op->getxattr(dentry, XATTR_NAME_SELINUX, context, len); @@ -901,7 +900,7 @@ static int inode_doinit_with_dentry(stru NULL, 0); if (rc < 0) { dput(dentry); - goto out; + goto out_unlock; } kfree(context); len = rc; @@ -909,7 +908,7 @@ static int inode_doinit_with_dentry(stru if (!context) { rc = -ENOMEM; dput(dentry); - goto out; + goto out_unlock; } rc = inode->i_op->getxattr(dentry, XATTR_NAME_SELINUX, @@ -922,7 +921,7 @@ static int inode_doinit_with_dentry(stru "%d for dev=%s ino=%ld\n", __FUNCTION__, -rc, inode->i_sb->s_id, inode->i_ino); kfree(context); - goto out; + goto out_unlock; } /* Map ENODATA to the default file SID */ sid = sbsec->def_sid; @@ -958,7 +957,7 @@ static int inode_doinit_with_dentry(stru isec->sclass, &sid); if (rc) - goto out; + goto out_unlock; isec->sid = sid; break; case SECURITY_FS_USE_MNTPOINT: @@ -976,7 +975,7 @@ static int inode_doinit_with_dentry(stru isec->sclass, &sid); if (rc) - goto out; + goto out_unlock; isec->sid = sid; } } @@ -985,12 +984,11 @@ static int inode_doinit_with_dentry(stru isec->initialized = 1; +out_unlock: + mutex_unlock(&isec->lock); out: if (isec->sclass == SECCLASS_FILE) isec->sclass = inode_mode_to_security_class(inode->i_mode); - - if (hold_sem) - up(&isec->sem); return rc; } diff -puN security/selinux/include/objsec.h~selinux-2-3-change-isec-semaphore-to-a-mutex security/selinux/include/objsec.h --- a/security/selinux/include/objsec.h~selinux-2-3-change-isec-semaphore-to-a-mutex +++ a/security/selinux/include/objsec.h @@ -44,7 +44,7 @@ struct inode_security_struct { u32 sid; /* SID of this object */ u16 sclass; /* security class of this object */ unsigned char initialized; /* initialization flag */ - struct semaphore sem; + struct mutex lock; unsigned char inherit; /* inherit SID from parent entry */ }; _