|
@@ -303,9 +303,22 @@ ecryptfs_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
|
struct file *lower_file = ecryptfs_file_to_lower(file);
|
|
struct file *lower_file = ecryptfs_file_to_lower(file);
|
|
long rc = -ENOTTY;
|
|
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);
|
|
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
|
|
#ifdef CONFIG_COMPAT
|
|
@@ -315,9 +328,22 @@ ecryptfs_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
|
struct file *lower_file = ecryptfs_file_to_lower(file);
|
|
struct file *lower_file = ecryptfs_file_to_lower(file);
|
|
long rc = -ENOIOCTLCMD;
|
|
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);
|
|
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
|
|
#endif
|
|
|
|
|