#define S_NOCMTIME     128     /* Do not update file c/mtime */
 #define S_SWAPFILE     256     /* Do not truncate: swapon got its bmaps */
 #define S_PRIVATE      512     /* Inode is fs-internal */
+#define S_IMA          1024    /* Inode has an associated IMA struct */
 
 /*
  * Note that nosuid etc flags are inode-specific: setting some file-system
 #define IS_NOCMTIME(inode)     ((inode)->i_flags & S_NOCMTIME)
 #define IS_SWAPFILE(inode)     ((inode)->i_flags & S_SWAPFILE)
 #define IS_PRIVATE(inode)      ((inode)->i_flags & S_PRIVATE)
+#define IS_IMA(inode)          ((inode)->i_flags & S_IMA)
 
 /* the read-only stuff doesn't really belong here, but any other place is
    probably as bad and I don't want to create yet another include file. */
 
 {
        struct ima_iint_cache *iint;
 
+       if (!IS_IMA(inode))
+               return NULL;
+
        spin_lock(&ima_iint_lock);
        iint = __ima_iint_find(inode);
        spin_unlock(&ima_iint_lock);
        new_iint->inode = inode;
        new_node = &new_iint->rb_node;
 
+       mutex_lock(&inode->i_mutex); /* i_flags */
        spin_lock(&ima_iint_lock);
 
        p = &ima_iint_tree.rb_node;
                        goto out_err;
        }
 
+       inode->i_flags |= S_IMA;
        rb_link_node(new_node, parent, p);
        rb_insert_color(new_node, &ima_iint_tree);
 
        spin_unlock(&ima_iint_lock);
+       mutex_unlock(&inode->i_mutex); /* i_flags */
 
        return 0;
 out_err:
        spin_unlock(&ima_iint_lock);
+       mutex_unlock(&inode->i_mutex); /* i_flags */
        iint_free(new_iint);
 
        return rc;
 
        inode->i_readcount = 0;
 
+       if (!IS_IMA(inode))
+               return;
+
        spin_lock(&ima_iint_lock);
        iint = __ima_iint_find(inode);
-       if (iint)
-               rb_erase(&iint->rb_node, &ima_iint_tree);
+       rb_erase(&iint->rb_node, &ima_iint_tree);
        spin_unlock(&ima_iint_lock);
 
-       if (!iint)
-               return;
-
        iint_free(iint);
 }