Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a68a27b6 authored by Mimi Zohar's avatar Mimi Zohar
Browse files

IMA: convert i_readcount to atomic



Convert the inode's i_readcount from an unsigned int to atomic.

Signed-off-by: default avatarMimi Zohar <zohar@us.ibm.com>
Acked-by: default avatarEric Paris <eparis@redhat.com>
parent 75a25637
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -794,8 +794,7 @@ struct inode {
#endif

#ifdef CONFIG_IMA
	/* protected by i_lock */
	unsigned int		i_readcount; /* struct files open RO */
	atomic_t		i_readcount; /* struct files open RO */
#endif
	atomic_t		i_writecount;
#ifdef CONFIG_SECURITY
+4 −3
Original line number Diff line number Diff line
@@ -137,10 +137,11 @@ void ima_inode_free(struct inode *inode)
{
	struct ima_iint_cache *iint;

	if (inode->i_readcount)
		printk(KERN_INFO "%s: readcount: %u\n", __func__, inode->i_readcount);
	if (atomic_read(&inode->i_readcount))
		printk(KERN_INFO "%s: readcount: %u\n", __func__,
		       atomic_read(&inode->i_readcount));

	inode->i_readcount = 0;
	atomic_set(&inode->i_readcount, 0);

	if (!IS_IMA(inode))
		return;
+6 −5
Original line number Diff line number Diff line
@@ -113,7 +113,7 @@ void ima_counts_get(struct file *file)
		goto out;

	if (mode & FMODE_WRITE) {
		if (inode->i_readcount && IS_IMA(inode))
		if (atomic_read(&inode->i_readcount) && IS_IMA(inode))
			send_tomtou = true;
		goto out;
	}
@@ -127,7 +127,7 @@ void ima_counts_get(struct file *file)
out:
	/* remember the vfs deals with i_writecount */
	if ((mode & (FMODE_READ | FMODE_WRITE)) == FMODE_READ)
		inode->i_readcount++;
		atomic_inc(&inode->i_readcount);

	spin_unlock(&inode->i_lock);

@@ -149,15 +149,16 @@ static void ima_dec_counts(struct inode *inode, struct file *file)
	assert_spin_locked(&inode->i_lock);

	if ((mode & (FMODE_READ | FMODE_WRITE)) == FMODE_READ) {
		if (unlikely(inode->i_readcount == 0)) {
		if (unlikely(atomic_read(&inode->i_readcount) == 0)) {
			if (!ima_limit_imbalance(file)) {
				printk(KERN_INFO "%s: open/free imbalance (r:%u)\n",
				       __func__, inode->i_readcount);
				       __func__,
				       atomic_read(&inode->i_readcount));
				dump_stack();
			}
			return;
		}
		inode->i_readcount--;
		atomic_dec(&inode->i_readcount);
	}
}