/* ima_iint_find_insert_get - get the iint associated with an inode * * Most insertions are done at inode_alloc, except those allocated * before late_initcall. When the iint does not exist, allocate it, * initialize and insert it, and increment the iint refcount. * * (Can't initialize at security_initcall before any inodes are * allocated, got to wait at least until proc_init.) * * Return the iint. */ struct ima_iint_cache *ima_iint_find_insert_get(struct inode *inode) { struct ima_iint_cache *iint = NULL; iint = ima_iint_find_get(inode); if (iint) return iint; iint = ima_iint_insert(inode); if (iint) kref_get(&iint->refcount); return iint; }
/** * ima_file_free - called on __fput() * @file: pointer to file structure being freed * * Flag files that changed, based on i_version; * and decrement the iint readcount/writecount. */ void ima_file_free(struct file *file) { struct inode *inode = file->f_dentry->d_inode; struct ima_iint_cache *iint; if (!ima_initialized || !S_ISREG(inode->i_mode)) return; iint = ima_iint_find_get(inode); if (!iint) return; mutex_lock(&iint->mutex); if (iint->opencount <= 0) { printk(KERN_INFO "%s: %s open/free imbalance (r:%ld w:%ld o:%ld f:%ld)\n", __FUNCTION__, file->f_dentry->d_name.name, iint->readcount, iint->writecount, iint->opencount, atomic_long_read(&file->f_count)); if (!(iint->flags & IMA_IINT_DUMP_STACK)) { dump_stack(); iint->flags |= IMA_IINT_DUMP_STACK; } } iint->opencount--; if ((file->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_READ) iint->readcount--; if (file->f_mode & FMODE_WRITE) { iint->writecount--; if (iint->writecount == 0) { if (iint->version != inode->i_version) iint->flags &= ~IMA_MEASURED; } } mutex_unlock(&iint->mutex); kref_put(&iint->refcount, iint_free); }