[PATCH V5 8/9] fsverity: Move verity status check to fsverity_file_open
From: Chandan Rajendra <hidden>
Date: 2018-12-12 09:52:06
Also in:
linux-doc, linux-f2fs-devel, linux-fsdevel, linux-s390
Subsystem:
ext4 file system, f2fs file system, filesystems (vfs and infrastructure), fsverity: read-only file-based authenticity protection, the rest · Maintainers:
"Theodore Ts'o", Jaegeuk Kim, Chao Yu, Alexander Viro, Christian Brauner, Eric Biggers, Theodore Y. Ts'o, Linus Torvalds
Instead of conditionally checking for verity status of an inode before invoking fsverity_file_open(), this commit moves the check inside the definition of fsverity_file_open(). Signed-off-by: Chandan Rajendra <redacted> (EB: fix the !CONFIG_FS_VERITY case and inline the IS_VERITY() check) Signed-off-by: Eric Biggers <redacted> --- fs/ext4/file.c | 8 +++----- fs/f2fs/file.c | 8 +++----- fs/verity/setup.c | 18 ++---------------- include/linux/fsverity.h | 25 +++++++++++++++++++++++-- 4 files changed, 31 insertions(+), 28 deletions(-)
diff --git a/fs/ext4/file.c b/fs/ext4/file.c
index 30fbd663354f..b404a857cd48 100644
--- a/fs/ext4/file.c
+++ b/fs/ext4/file.c@@ -444,11 +444,9 @@ static int ext4_file_open(struct inode * inode, struct file * filp) if (ret) return ret; - if (IS_VERITY(inode)) { - ret = fsverity_file_open(inode, filp); - if (ret) - return ret; - } + ret = fsverity_file_open(inode, filp); + if (ret) + return ret; /* * Set up the jbd2_inode if we are opening the inode for
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
index 2eb4821d95d1..925c0d9608da 100644
--- a/fs/f2fs/file.c
+++ b/fs/f2fs/file.c@@ -491,11 +491,9 @@ static int f2fs_file_open(struct inode *inode, struct file *filp) if (err) return err; - if (IS_VERITY(inode)) { - err = fsverity_file_open(inode, filp); - if (err) - return err; - } + err = fsverity_file_open(inode, filp); + if (err) + return err; filp->f_mode |= FMODE_NOWAIT;
diff --git a/fs/verity/setup.c b/fs/verity/setup.c
index 08b609127531..4ecaeb89166b 100644
--- a/fs/verity/setup.c
+++ b/fs/verity/setup.c@@ -755,21 +755,7 @@ static int setup_fsverity_info(struct inode *inode) return 0; } -/** - * fsverity_file_open - prepare to open a verity file - * @inode: the inode being opened - * @filp: the struct file being set up - * - * When opening a verity file, deny the open if it is for writing. Otherwise, - * set up the inode's ->i_verity_info (if not already done) by parsing the - * verity metadata at the end of the file. - * - * When combined with fscrypt, this must be called after fscrypt_file_open(). - * Otherwise, we won't have the key set up to decrypt the verity metadata. - * - * Return: 0 on success, -errno on failure - */ -int fsverity_file_open(struct inode *inode, struct file *filp) +int __fsverity_file_open(struct inode *inode, struct file *filp) { if (filp->f_mode & FMODE_WRITE) { pr_debug("Denying opening verity file (ino %lu) for write\n",
@@ -779,7 +765,7 @@ int fsverity_file_open(struct inode *inode, struct file *filp) return setup_fsverity_info(inode); } -EXPORT_SYMBOL_GPL(fsverity_file_open); +EXPORT_SYMBOL_GPL(__fsverity_file_open); /** * fsverity_prepare_setattr - prepare to change a verity inode's attributes
diff --git a/include/linux/fsverity.h b/include/linux/fsverity.h
index ea8c418bd7d5..0ce170c2c167 100644
--- a/include/linux/fsverity.h
+++ b/include/linux/fsverity.h@@ -25,7 +25,7 @@ extern int fsverity_ioctl_enable(struct file *filp, const void __user *arg); extern int fsverity_ioctl_measure(struct file *filp, void __user *arg); /* setup.c */ -extern int fsverity_file_open(struct inode *inode, struct file *filp); +extern int __fsverity_file_open(struct inode *inode, struct file *filp); extern int fsverity_prepare_setattr(struct dentry *dentry, struct iattr *attr); extern int fsverity_prepare_getattr(struct inode *inode); extern void fsverity_cleanup_inode(struct inode *inode);
@@ -58,7 +58,7 @@ static inline int fsverity_ioctl_measure(struct file *filp, void __user *arg) /* setup.c */ -static inline int fsverity_file_open(struct inode *inode, struct file *filp) +static inline int __fsverity_file_open(struct inode *inode, struct file *filp) { return -EOPNOTSUPP; }
@@ -108,4 +108,25 @@ static inline bool fsverity_check_hole(struct inode *inode, struct page *page) #endif /* ! CONFIG_FS_VERITY */ +/** + * fsverity_file_open - prepare to open a verity file + * @inode: the inode being opened + * @filp: the struct file being set up + * + * When opening a verity file, deny the open if it is for writing. Otherwise, + * set up the inode's ->i_verity_info (if not already done) by parsing the + * verity metadata at the end of the file. + * + * When combined with fscrypt, this must be called after fscrypt_file_open(). + * Otherwise, we won't have the key set up to decrypt the verity metadata. + * + * Return: 0 on success, -errno on failure + */ +static inline int fsverity_file_open(struct inode *inode, struct file *filp) +{ + if (IS_VERITY(inode)) + return __fsverity_file_open(inode, filp); + return 0; +} + #endif /* _LINUX_FSVERITY_H */
--
2.19.1