Commit 9b872cc5 authored by Christian Brauner's avatar Christian Brauner

ntfs3: add legacy ntfs file operations

To ensure that ioctl()s can't be used to circumvent write restrictions.
Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
parent d55f90e9
...@@ -616,4 +616,11 @@ const struct file_operations ntfs_dir_operations = { ...@@ -616,4 +616,11 @@ const struct file_operations ntfs_dir_operations = {
.compat_ioctl = ntfs_compat_ioctl, .compat_ioctl = ntfs_compat_ioctl,
#endif #endif
}; };
const struct file_operations ntfs_legacy_dir_operations = {
.llseek = generic_file_llseek,
.read = generic_read_dir,
.iterate_shared = ntfs_readdir,
.open = ntfs_file_open,
};
// clang-format on // clang-format on
...@@ -1236,4 +1236,12 @@ const struct file_operations ntfs_file_operations = { ...@@ -1236,4 +1236,12 @@ const struct file_operations ntfs_file_operations = {
.fallocate = ntfs_fallocate, .fallocate = ntfs_fallocate,
.release = ntfs_file_release, .release = ntfs_file_release,
}; };
const struct file_operations ntfs_legacy_file_operations = {
.llseek = generic_file_llseek,
.read_iter = ntfs_file_read_iter,
.splice_read = ntfs_file_splice_read,
.open = ntfs_file_open,
.release = ntfs_file_release,
};
// clang-format on // clang-format on
...@@ -440,7 +440,10 @@ static struct inode *ntfs_read_mft(struct inode *inode, ...@@ -440,7 +440,10 @@ static struct inode *ntfs_read_mft(struct inode *inode,
* Usually a hard links to directories are disabled. * Usually a hard links to directories are disabled.
*/ */
inode->i_op = &ntfs_dir_inode_operations; inode->i_op = &ntfs_dir_inode_operations;
inode->i_fop = &ntfs_dir_operations; if (is_legacy_ntfs(inode->i_sb))
inode->i_fop = &ntfs_legacy_dir_operations;
else
inode->i_fop = &ntfs_dir_operations;
ni->i_valid = 0; ni->i_valid = 0;
} else if (S_ISLNK(mode)) { } else if (S_ISLNK(mode)) {
ni->std_fa &= ~FILE_ATTRIBUTE_DIRECTORY; ni->std_fa &= ~FILE_ATTRIBUTE_DIRECTORY;
...@@ -450,7 +453,10 @@ static struct inode *ntfs_read_mft(struct inode *inode, ...@@ -450,7 +453,10 @@ static struct inode *ntfs_read_mft(struct inode *inode,
} else if (S_ISREG(mode)) { } else if (S_ISREG(mode)) {
ni->std_fa &= ~FILE_ATTRIBUTE_DIRECTORY; ni->std_fa &= ~FILE_ATTRIBUTE_DIRECTORY;
inode->i_op = &ntfs_file_inode_operations; inode->i_op = &ntfs_file_inode_operations;
inode->i_fop = &ntfs_file_operations; if (is_legacy_ntfs(inode->i_sb))
inode->i_fop = &ntfs_legacy_file_operations;
else
inode->i_fop = &ntfs_file_operations;
inode->i_mapping->a_ops = is_compressed(ni) ? &ntfs_aops_cmpr : inode->i_mapping->a_ops = is_compressed(ni) ? &ntfs_aops_cmpr :
&ntfs_aops; &ntfs_aops;
if (ino != MFT_REC_MFT) if (ino != MFT_REC_MFT)
...@@ -1614,7 +1620,10 @@ struct inode *ntfs_create_inode(struct mnt_idmap *idmap, struct inode *dir, ...@@ -1614,7 +1620,10 @@ struct inode *ntfs_create_inode(struct mnt_idmap *idmap, struct inode *dir,
if (S_ISDIR(mode)) { if (S_ISDIR(mode)) {
inode->i_op = &ntfs_dir_inode_operations; inode->i_op = &ntfs_dir_inode_operations;
inode->i_fop = &ntfs_dir_operations; if (is_legacy_ntfs(inode->i_sb))
inode->i_fop = &ntfs_legacy_dir_operations;
else
inode->i_fop = &ntfs_dir_operations;
} else if (S_ISLNK(mode)) { } else if (S_ISLNK(mode)) {
inode->i_op = &ntfs_link_inode_operations; inode->i_op = &ntfs_link_inode_operations;
inode->i_fop = NULL; inode->i_fop = NULL;
...@@ -1623,7 +1632,10 @@ struct inode *ntfs_create_inode(struct mnt_idmap *idmap, struct inode *dir, ...@@ -1623,7 +1632,10 @@ struct inode *ntfs_create_inode(struct mnt_idmap *idmap, struct inode *dir,
inode_nohighmem(inode); inode_nohighmem(inode);
} else if (S_ISREG(mode)) { } else if (S_ISREG(mode)) {
inode->i_op = &ntfs_file_inode_operations; inode->i_op = &ntfs_file_inode_operations;
inode->i_fop = &ntfs_file_operations; if (is_legacy_ntfs(inode->i_sb))
inode->i_fop = &ntfs_legacy_file_operations;
else
inode->i_fop = &ntfs_file_operations;
inode->i_mapping->a_ops = is_compressed(ni) ? &ntfs_aops_cmpr : inode->i_mapping->a_ops = is_compressed(ni) ? &ntfs_aops_cmpr :
&ntfs_aops; &ntfs_aops;
init_rwsem(&ni->file.run_lock); init_rwsem(&ni->file.run_lock);
......
...@@ -493,6 +493,7 @@ struct inode *dir_search_u(struct inode *dir, const struct cpu_str *uni, ...@@ -493,6 +493,7 @@ struct inode *dir_search_u(struct inode *dir, const struct cpu_str *uni,
struct ntfs_fnd *fnd); struct ntfs_fnd *fnd);
bool dir_is_empty(struct inode *dir); bool dir_is_empty(struct inode *dir);
extern const struct file_operations ntfs_dir_operations; extern const struct file_operations ntfs_dir_operations;
extern const struct file_operations ntfs_legacy_dir_operations;
/* Globals from file.c */ /* Globals from file.c */
int ntfs_getattr(struct mnt_idmap *idmap, const struct path *path, int ntfs_getattr(struct mnt_idmap *idmap, const struct path *path,
...@@ -507,6 +508,7 @@ long ntfs_compat_ioctl(struct file *filp, u32 cmd, unsigned long arg); ...@@ -507,6 +508,7 @@ long ntfs_compat_ioctl(struct file *filp, u32 cmd, unsigned long arg);
extern const struct inode_operations ntfs_special_inode_operations; extern const struct inode_operations ntfs_special_inode_operations;
extern const struct inode_operations ntfs_file_inode_operations; extern const struct inode_operations ntfs_file_inode_operations;
extern const struct file_operations ntfs_file_operations; extern const struct file_operations ntfs_file_operations;
extern const struct file_operations ntfs_legacy_file_operations;
/* Globals from frecord.c */ /* Globals from frecord.c */
void ni_remove_mi(struct ntfs_inode *ni, struct mft_inode *mi); void ni_remove_mi(struct ntfs_inode *ni, struct mft_inode *mi);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment