Signed-off-by: Dmitry Monakhov <dmonakhov@xxxxxxxxxx> --- fs/ecryptfs/file.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 67 insertions(+), 0 deletions(-) diff --git a/fs/ecryptfs/file.c b/fs/ecryptfs/file.c index 91da029..24149ec 100644 --- a/fs/ecryptfs/file.c +++ b/fs/ecryptfs/file.c @@ -31,6 +31,7 @@ #include <linux/security.h> #include <linux/compat.h> #include <linux/fs_stack.h> +#include <linux/fadvise.h> #include "ecryptfs_kernel.h" /** @@ -317,6 +318,68 @@ ecryptfs_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg) } #endif +static int +ecryptfs_fadvise(struct file *file, loff_t offset, loff_t len, int advice) +{ + struct file *lower_file = NULL; + long rc = 0; + + if (ecryptfs_file_to_private(file)) + lower_file = ecryptfs_file_to_lower(file); + + if (!lower_file || !lower_file->f_op) + return rc; + + if (lower_file->f_op && lower_file->f_op->fadvise) + rc = lower_file->f_op->fadvise(lower_file, offset, len, advice); + else + rc = generic_fadvise(lower_file, offset, len, advice); + if (!rc) + generic_fadvise(file, offset, len, advice); + + return rc; +} + +#define ECRYPTFS_FL_MASK (O_NONBLOCK | O_NDELAY | O_DIRECT | O_NOATIME) +static int ecryptfs_set_flags(struct file *file, int flags) +{ + struct ecryptfs_mount_crypt_stat *mount_crypt_stat; + struct dentry *ecryptfs_dentry = file->f_path.dentry; + struct file *lower_file = NULL; + int rc = 0; + mount_crypt_stat = &ecryptfs_superblock_to_private( + ecryptfs_dentry->d_sb)->mount_crypt_stat; + if ((mount_crypt_stat->flags & ECRYPTFS_ENCRYPTED_VIEW_ENABLED) + && (flags & O_APPEND)) { + printk(KERN_WARNING "Mount has encrypted view enabled; " + "files may only be read\n"); + rc = -EPERM; + goto out; + } + if (ecryptfs_file_to_private(file)) + lower_file = ecryptfs_file_to_lower(file); + if (!lower_file) + goto out; + + spin_lock(&file->f_lock); + if (lower_file->f_op && lower_file->f_op->set_flags) + rc = lower_file->f_op->set_flags(lower_file, flags); + else { + spin_lock(&lower_file->f_lock); + lower_file->f_flags = (flags & ECRYPTFS_FL_MASK) | + (lower_file->f_flags & ~ECRYPTFS_FL_MASK); + spin_unlock(&lower_file->f_lock); + } + if (!rc) + file->f_flags = (flags & ECRYPTFS_FL_MASK) | + (file->f_flags & ~ECRYPTFS_FL_MASK); + spin_unlock(&file->f_lock); + +out: + return rc; + + +} const struct file_operations ecryptfs_dir_fops = { .readdir = ecryptfs_readdir, .unlocked_ioctl = ecryptfs_unlocked_ioctl, @@ -330,6 +393,8 @@ const struct file_operations ecryptfs_dir_fops = { .fasync = ecryptfs_fasync, .splice_read = generic_file_splice_read, .llseek = default_llseek, + .set_flags = ecryptfs_set_flags, + .fadvise = ecryptfs_fadvise, }; const struct file_operations ecryptfs_main_fops = { @@ -350,4 +415,6 @@ const struct file_operations ecryptfs_main_fops = { .fsync = ecryptfs_fsync, .fasync = ecryptfs_fasync, .splice_read = generic_file_splice_read, + .set_flags = ecryptfs_set_flags, + .fadvise = ecryptfs_fadvise, }; -- 1.7.2.3 -- 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