]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - security/integrity/ima/ima_main.c
IMA: move read counter into struct inode
[net-next-2.6.git] / security / integrity / ima / ima_main.c
index 24660bf3f82ab27a22de12a551961e84772738bc..2a77b14fee27cf11327aa8581112fa11a30a0bc0 100644 (file)
@@ -85,17 +85,6 @@ out:
        return found;
 }
 
-/*
- * Update the counts given an fmode_t
- */
-static void ima_inc_counts(struct ima_iint_cache *iint, fmode_t mode)
-{
-       assert_spin_locked(&iint->inode->i_lock);
-
-       if ((mode & (FMODE_READ | FMODE_WRITE)) == FMODE_READ)
-               iint->readcount++;
-}
-
 /*
  * ima_counts_get - increment file counts
  *
@@ -112,27 +101,23 @@ void ima_counts_get(struct file *file)
        struct dentry *dentry = file->f_path.dentry;
        struct inode *inode = dentry->d_inode;
        fmode_t mode = file->f_mode;
-       struct ima_iint_cache *iint;
        int rc;
        bool send_tomtou = false, send_writers = false;
 
-       if (!iint_initialized || !S_ISREG(inode->i_mode))
+       if (!S_ISREG(inode->i_mode))
                return;
-       iint = ima_iint_find_get(inode);
-       if (!iint)
-               return;
-       mutex_lock(&iint->mutex);
+
        spin_lock(&inode->i_lock);
 
        if (!ima_initialized)
                goto out;
 
-       rc = ima_must_measure(iint, inode, MAY_READ, FILE_CHECK);
+       rc = ima_must_measure(NULL, inode, MAY_READ, FILE_CHECK);
        if (rc < 0)
                goto out;
 
        if (mode & FMODE_WRITE) {
-               if (iint->readcount)
+               if (inode->i_readcount)
                        send_tomtou = true;
                goto out;
        }
@@ -140,10 +125,10 @@ void ima_counts_get(struct file *file)
        if (atomic_read(&inode->i_writecount) > 0)
                send_writers = true;
 out:
-       ima_inc_counts(iint, file->f_mode);
+       /* remember the vfs deals with i_writecount */
+       if ((mode & (FMODE_READ | FMODE_WRITE)) == FMODE_READ)
+               inode->i_readcount++;
        spin_unlock(&inode->i_lock);
-       mutex_unlock(&iint->mutex);
-       kref_put(&iint->refcount, iint_free);
 
        if (send_tomtou)
                ima_add_violation(inode, dentry->d_name.name, "invalid_pcr",
@@ -166,9 +151,9 @@ static void ima_dec_counts(struct ima_iint_cache *iint, struct inode *inode,
        assert_spin_locked(&inode->i_lock);
 
        if ((mode & (FMODE_READ | FMODE_WRITE)) == FMODE_READ) {
-               if (unlikely(iint->readcount == 0))
+               if (unlikely(inode->i_readcount == 0))
                        dump = true;
-               iint->readcount--;
+               inode->i_readcount--;
        }
        if (mode & FMODE_WRITE) {
                if (atomic_read(&inode->i_writecount) <= 0)
@@ -180,7 +165,7 @@ static void ima_dec_counts(struct ima_iint_cache *iint, struct inode *inode,
 
        if (dump && !ima_limit_imbalance(file)) {
                printk(KERN_INFO "%s: open/free imbalance (r:%u)\n",
-                      __func__, iint->readcount);
+                      __func__, inode->i_readcount);
                dump_stack();
        }
 }