diff options
| -rw-r--r-- | security/integrity/iint.c | 16 | 
1 files changed, 7 insertions, 9 deletions
diff --git a/security/integrity/iint.c b/security/integrity/iint.c index c91a436e13a..d82a5a13d85 100644 --- a/security/integrity/iint.c +++ b/security/integrity/iint.c @@ -22,7 +22,7 @@  #include "integrity.h"  static struct rb_root integrity_iint_tree = RB_ROOT; -static DEFINE_SPINLOCK(integrity_iint_lock); +static DEFINE_RWLOCK(integrity_iint_lock);  static struct kmem_cache *iint_cache __read_mostly;  int iint_initialized; @@ -35,8 +35,6 @@ static struct integrity_iint_cache *__integrity_iint_find(struct inode *inode)  	struct integrity_iint_cache *iint;  	struct rb_node *n = integrity_iint_tree.rb_node; -	assert_spin_locked(&integrity_iint_lock); -  	while (n) {  		iint = rb_entry(n, struct integrity_iint_cache, rb_node); @@ -63,9 +61,9 @@ struct integrity_iint_cache *integrity_iint_find(struct inode *inode)  	if (!IS_IMA(inode))  		return NULL; -	spin_lock(&integrity_iint_lock); +	read_lock(&integrity_iint_lock);  	iint = __integrity_iint_find(inode); -	spin_unlock(&integrity_iint_lock); +	read_unlock(&integrity_iint_lock);  	return iint;  } @@ -100,7 +98,7 @@ struct integrity_iint_cache *integrity_inode_get(struct inode *inode)  	if (!iint)  		return NULL; -	spin_lock(&integrity_iint_lock); +	write_lock(&integrity_iint_lock);  	p = &integrity_iint_tree.rb_node;  	while (*p) { @@ -119,7 +117,7 @@ struct integrity_iint_cache *integrity_inode_get(struct inode *inode)  	rb_link_node(node, parent, p);  	rb_insert_color(node, &integrity_iint_tree); -	spin_unlock(&integrity_iint_lock); +	write_unlock(&integrity_iint_lock);  	return iint;  } @@ -136,10 +134,10 @@ void integrity_inode_free(struct inode *inode)  	if (!IS_IMA(inode))  		return; -	spin_lock(&integrity_iint_lock); +	write_lock(&integrity_iint_lock);  	iint = __integrity_iint_find(inode);  	rb_erase(&iint->rb_node, &integrity_iint_tree); -	spin_unlock(&integrity_iint_lock); +	write_unlock(&integrity_iint_lock);  	iint_free(iint);  }  |