diff options
Diffstat (limited to 'fs/ecryptfs/file.c')
| -rw-r--r-- | fs/ecryptfs/file.c | 43 | 
1 files changed, 30 insertions, 13 deletions
diff --git a/fs/ecryptfs/file.c b/fs/ecryptfs/file.c index b07731e68c0b..a65786e26b05 100644 --- a/fs/ecryptfs/file.c +++ b/fs/ecryptfs/file.c @@ -31,7 +31,6 @@  #include <linux/security.h>  #include <linux/compat.h>  #include <linux/fs_stack.h> -#include <linux/aio.h>  #include "ecryptfs_kernel.h"  /** @@ -52,12 +51,6 @@ static ssize_t ecryptfs_read_update_atime(struct kiocb *iocb,  	struct file *file = iocb->ki_filp;  	rc = generic_file_read_iter(iocb, to); -	/* -	 * Even though this is a async interface, we need to wait -	 * for IO to finish to update atime -	 */ -	if (-EIOCBQUEUED == rc) -		rc = wait_on_sync_kiocb(iocb);  	if (rc >= 0) {  		path = ecryptfs_dentry_to_lower_path(file->f_path.dentry);  		touch_atime(path); @@ -303,9 +296,22 @@ ecryptfs_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned long arg)  	struct file *lower_file = ecryptfs_file_to_lower(file);  	long rc = -ENOTTY; -	if (lower_file->f_op->unlocked_ioctl) +	if (!lower_file->f_op->unlocked_ioctl) +		return rc; + +	switch (cmd) { +	case FITRIM: +	case FS_IOC_GETFLAGS: +	case FS_IOC_SETFLAGS: +	case FS_IOC_GETVERSION: +	case FS_IOC_SETVERSION:  		rc = lower_file->f_op->unlocked_ioctl(lower_file, cmd, arg); -	return rc; +		fsstack_copy_attr_all(file_inode(file), file_inode(lower_file)); + +		return rc; +	default: +		return rc; +	}  }  #ifdef CONFIG_COMPAT @@ -315,9 +321,22 @@ ecryptfs_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)  	struct file *lower_file = ecryptfs_file_to_lower(file);  	long rc = -ENOIOCTLCMD; -	if (lower_file->f_op->compat_ioctl) +	if (!lower_file->f_op->compat_ioctl) +		return rc; + +	switch (cmd) { +	case FITRIM: +	case FS_IOC32_GETFLAGS: +	case FS_IOC32_SETFLAGS: +	case FS_IOC32_GETVERSION: +	case FS_IOC32_SETVERSION:  		rc = lower_file->f_op->compat_ioctl(lower_file, cmd, arg); -	return rc; +		fsstack_copy_attr_all(file_inode(file), file_inode(lower_file)); + +		return rc; +	default: +		return rc; +	}  }  #endif @@ -339,9 +358,7 @@ const struct file_operations ecryptfs_dir_fops = {  const struct file_operations ecryptfs_main_fops = {  	.llseek = generic_file_llseek, -	.read = new_sync_read,  	.read_iter = ecryptfs_read_update_atime, -	.write = new_sync_write,  	.write_iter = generic_file_write_iter,  	.iterate = ecryptfs_readdir,  	.unlocked_ioctl = ecryptfs_unlocked_ioctl,  |