From mboxrd@z Thu Jan 1 00:00:00 1970 From: Dmitry Monakhov Subject: [PATCH 3/3] ecryptfs: add fadvise/set_flags calbacks Date: Tue, 14 Dec 2010 15:11:21 +0000 Message-ID: <1292339481-24702-3-git-send-email-dmonakhov@openvz.org> References: <1292339481-24702-1-git-send-email-dmonakhov@openvz.org> Cc: viro@zeniv.linux.org.uk, Dmitry Monakhov To: ecryptfs-devel@lists.launchpad.net, linux-fsdevel@vger.kernel.org Return-path: Received: from mail-ey0-f171.google.com ([209.85.215.171]:52040 "EHLO mail-ey0-f171.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1758712Ab0LNPLa (ORCPT ); Tue, 14 Dec 2010 10:11:30 -0500 Received: by mail-ey0-f171.google.com with SMTP id 5so412229eyg.2 for ; Tue, 14 Dec 2010 07:11:29 -0800 (PST) In-Reply-To: <1292339481-24702-1-git-send-email-dmonakhov@openvz.org> Sender: linux-fsdevel-owner@vger.kernel.org List-ID: Signed-off-by: Dmitry Monakhov --- 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 #include #include +#include #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