Define iget/iput_readcount() functions to be called from the VFS layer. Signed-off-by: Mimi Zohar <zohar@xxxxxxxxxx> --- include/linux/fs.h | 16 ++++++++++++++++ security/integrity/ima/Makefile | 2 +- security/integrity/ima/ima_readcount.c | 25 +++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 1 deletions(-) create mode 100644 security/integrity/ima/ima_readcount.c diff --git a/include/linux/fs.h b/include/linux/fs.h index 18d677c..7f5939d 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2178,6 +2178,22 @@ static inline void allow_write_access(struct file *file) if (file) atomic_inc(&file->f_path.dentry->d_inode->i_writecount); } +#ifdef CONFIG_IMA +extern void iput_readcount(struct inode *inode); +static inline void iget_readcount(struct inode *inode) +{ + atomic_inc(&inode->i_readcount); +} +#else +static inline void iput_readcount(struct inode *inode) +{ + return; +} +static inline void iget_readcount(struct inode *inode) +{ + return; +} +#endif extern int do_pipe_flags(int *, int); extern struct file *create_read_pipe(struct file *f, int flags); extern struct file *create_write_pipe(int flags); diff --git a/security/integrity/ima/Makefile b/security/integrity/ima/Makefile index 787c4cb..131eb1f 100644 --- a/security/integrity/ima/Makefile +++ b/security/integrity/ima/Makefile @@ -6,4 +6,4 @@ obj-$(CONFIG_IMA) += ima.o ima-y := ima_fs.o ima_queue.o ima_init.o ima_main.o ima_crypto.o ima_api.o \ - ima_policy.o ima_iint.o ima_audit.o + ima_policy.o ima_iint.o ima_audit.o ima_readcount.o diff --git a/security/integrity/ima/ima_readcount.c b/security/integrity/ima/ima_readcount.c new file mode 100644 index 0000000..d139e2a9 --- /dev/null +++ b/security/integrity/ima/ima_readcount.c @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2010 IBM Corporation + * + * Authors: + * Mimi Zohar <zohar@xxxxxxxxxx> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation, version 2 of the + * License. + */ +#include <linux/module.h> +#include <linux/spinlock.h> +#include <linux/fs.h> + +void iput_readcount(struct inode *inode) +{ + spin_lock(&inode->i_lock); + if (unlikely((atomic_read(&inode->i_readcount) == 0))) + printk(KERN_INFO "i_readcount: imbalance ino %ld\n", + inode->i_ino); + else + atomic_dec(&inode->i_readcount); + spin_unlock(&inode->i_lock); +} -- 1.7.2.2 -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html