dax: unify ext2/4_{dax,}_file_operations
The original dax patchset split the ext2/4_file_operations because of the two NULL splice_read/splice_write in the dax case. In the vfs if splice_read/splice_write are NULL we then call default_splice_read/write. What we do here is make generic_file_splice_read aware of IS_DAX() so the original ext2/4_file_operations can be used as is. For write it appears that iter_file_splice_write is just fine. It uses the regular f_op->write(file,..) or new_sync_write(file, ...). Signed-off-by: Boaz Harrosh <boaz@plexistor.com> Reviewed-by: Jan Kara <jack@suse.cz> Cc: Dave Chinner <dchinner@redhat.com> Cc: Matthew Wilcox <willy@linux.intel.com> Cc: Hugh Dickins <hughd@google.com> Cc: Mel Gorman <mgorman@suse.de> Cc: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
0e3b210ce1
commit
be64f884be
|
@ -793,7 +793,6 @@ extern int ext2_fsync(struct file *file, loff_t start, loff_t end,
|
||||||
int datasync);
|
int datasync);
|
||||||
extern const struct inode_operations ext2_file_inode_operations;
|
extern const struct inode_operations ext2_file_inode_operations;
|
||||||
extern const struct file_operations ext2_file_operations;
|
extern const struct file_operations ext2_file_operations;
|
||||||
extern const struct file_operations ext2_dax_file_operations;
|
|
||||||
|
|
||||||
/* inode.c */
|
/* inode.c */
|
||||||
extern const struct address_space_operations ext2_aops;
|
extern const struct address_space_operations ext2_aops;
|
||||||
|
|
|
@ -109,24 +109,6 @@ const struct file_operations ext2_file_operations = {
|
||||||
.splice_write = iter_file_splice_write,
|
.splice_write = iter_file_splice_write,
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef CONFIG_FS_DAX
|
|
||||||
const struct file_operations ext2_dax_file_operations = {
|
|
||||||
.llseek = generic_file_llseek,
|
|
||||||
.read = new_sync_read,
|
|
||||||
.write = new_sync_write,
|
|
||||||
.read_iter = generic_file_read_iter,
|
|
||||||
.write_iter = generic_file_write_iter,
|
|
||||||
.unlocked_ioctl = ext2_ioctl,
|
|
||||||
#ifdef CONFIG_COMPAT
|
|
||||||
.compat_ioctl = ext2_compat_ioctl,
|
|
||||||
#endif
|
|
||||||
.mmap = ext2_file_mmap,
|
|
||||||
.open = dquot_file_open,
|
|
||||||
.release = ext2_release_file,
|
|
||||||
.fsync = ext2_fsync,
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
const struct inode_operations ext2_file_inode_operations = {
|
const struct inode_operations ext2_file_inode_operations = {
|
||||||
#ifdef CONFIG_EXT2_FS_XATTR
|
#ifdef CONFIG_EXT2_FS_XATTR
|
||||||
.setxattr = generic_setxattr,
|
.setxattr = generic_setxattr,
|
||||||
|
|
|
@ -1388,10 +1388,7 @@ struct inode *ext2_iget (struct super_block *sb, unsigned long ino)
|
||||||
|
|
||||||
if (S_ISREG(inode->i_mode)) {
|
if (S_ISREG(inode->i_mode)) {
|
||||||
inode->i_op = &ext2_file_inode_operations;
|
inode->i_op = &ext2_file_inode_operations;
|
||||||
if (test_opt(inode->i_sb, DAX)) {
|
if (test_opt(inode->i_sb, NOBH)) {
|
||||||
inode->i_mapping->a_ops = &ext2_aops;
|
|
||||||
inode->i_fop = &ext2_dax_file_operations;
|
|
||||||
} else if (test_opt(inode->i_sb, NOBH)) {
|
|
||||||
inode->i_mapping->a_ops = &ext2_nobh_aops;
|
inode->i_mapping->a_ops = &ext2_nobh_aops;
|
||||||
inode->i_fop = &ext2_file_operations;
|
inode->i_fop = &ext2_file_operations;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -104,10 +104,7 @@ static int ext2_create (struct inode * dir, struct dentry * dentry, umode_t mode
|
||||||
return PTR_ERR(inode);
|
return PTR_ERR(inode);
|
||||||
|
|
||||||
inode->i_op = &ext2_file_inode_operations;
|
inode->i_op = &ext2_file_inode_operations;
|
||||||
if (test_opt(inode->i_sb, DAX)) {
|
if (test_opt(inode->i_sb, NOBH)) {
|
||||||
inode->i_mapping->a_ops = &ext2_aops;
|
|
||||||
inode->i_fop = &ext2_dax_file_operations;
|
|
||||||
} else if (test_opt(inode->i_sb, NOBH)) {
|
|
||||||
inode->i_mapping->a_ops = &ext2_nobh_aops;
|
inode->i_mapping->a_ops = &ext2_nobh_aops;
|
||||||
inode->i_fop = &ext2_file_operations;
|
inode->i_fop = &ext2_file_operations;
|
||||||
} else {
|
} else {
|
||||||
|
@ -125,10 +122,7 @@ static int ext2_tmpfile(struct inode *dir, struct dentry *dentry, umode_t mode)
|
||||||
return PTR_ERR(inode);
|
return PTR_ERR(inode);
|
||||||
|
|
||||||
inode->i_op = &ext2_file_inode_operations;
|
inode->i_op = &ext2_file_inode_operations;
|
||||||
if (test_opt(inode->i_sb, DAX)) {
|
if (test_opt(inode->i_sb, NOBH)) {
|
||||||
inode->i_mapping->a_ops = &ext2_aops;
|
|
||||||
inode->i_fop = &ext2_dax_file_operations;
|
|
||||||
} else if (test_opt(inode->i_sb, NOBH)) {
|
|
||||||
inode->i_mapping->a_ops = &ext2_nobh_aops;
|
inode->i_mapping->a_ops = &ext2_nobh_aops;
|
||||||
inode->i_fop = &ext2_file_operations;
|
inode->i_fop = &ext2_file_operations;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -2593,7 +2593,6 @@ extern const struct file_operations ext4_dir_operations;
|
||||||
/* file.c */
|
/* file.c */
|
||||||
extern const struct inode_operations ext4_file_inode_operations;
|
extern const struct inode_operations ext4_file_inode_operations;
|
||||||
extern const struct file_operations ext4_file_operations;
|
extern const struct file_operations ext4_file_operations;
|
||||||
extern const struct file_operations ext4_dax_file_operations;
|
|
||||||
extern loff_t ext4_llseek(struct file *file, loff_t offset, int origin);
|
extern loff_t ext4_llseek(struct file *file, loff_t offset, int origin);
|
||||||
|
|
||||||
/* inline.c */
|
/* inline.c */
|
||||||
|
|
|
@ -625,26 +625,6 @@ const struct file_operations ext4_file_operations = {
|
||||||
.fallocate = ext4_fallocate,
|
.fallocate = ext4_fallocate,
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef CONFIG_FS_DAX
|
|
||||||
const struct file_operations ext4_dax_file_operations = {
|
|
||||||
.llseek = ext4_llseek,
|
|
||||||
.read = new_sync_read,
|
|
||||||
.write = new_sync_write,
|
|
||||||
.read_iter = generic_file_read_iter,
|
|
||||||
.write_iter = ext4_file_write_iter,
|
|
||||||
.unlocked_ioctl = ext4_ioctl,
|
|
||||||
#ifdef CONFIG_COMPAT
|
|
||||||
.compat_ioctl = ext4_compat_ioctl,
|
|
||||||
#endif
|
|
||||||
.mmap = ext4_file_mmap,
|
|
||||||
.open = ext4_file_open,
|
|
||||||
.release = ext4_release_file,
|
|
||||||
.fsync = ext4_sync_file,
|
|
||||||
/* Splice not yet supported with DAX */
|
|
||||||
.fallocate = ext4_fallocate,
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
const struct inode_operations ext4_file_inode_operations = {
|
const struct inode_operations ext4_file_inode_operations = {
|
||||||
.setattr = ext4_setattr,
|
.setattr = ext4_setattr,
|
||||||
.getattr = ext4_getattr,
|
.getattr = ext4_getattr,
|
||||||
|
|
|
@ -4090,10 +4090,7 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino)
|
||||||
|
|
||||||
if (S_ISREG(inode->i_mode)) {
|
if (S_ISREG(inode->i_mode)) {
|
||||||
inode->i_op = &ext4_file_inode_operations;
|
inode->i_op = &ext4_file_inode_operations;
|
||||||
if (test_opt(inode->i_sb, DAX))
|
inode->i_fop = &ext4_file_operations;
|
||||||
inode->i_fop = &ext4_dax_file_operations;
|
|
||||||
else
|
|
||||||
inode->i_fop = &ext4_file_operations;
|
|
||||||
ext4_set_aops(inode);
|
ext4_set_aops(inode);
|
||||||
} else if (S_ISDIR(inode->i_mode)) {
|
} else if (S_ISDIR(inode->i_mode)) {
|
||||||
inode->i_op = &ext4_dir_inode_operations;
|
inode->i_op = &ext4_dir_inode_operations;
|
||||||
|
|
|
@ -2235,10 +2235,7 @@ static int ext4_create(struct inode *dir, struct dentry *dentry, umode_t mode,
|
||||||
err = PTR_ERR(inode);
|
err = PTR_ERR(inode);
|
||||||
if (!IS_ERR(inode)) {
|
if (!IS_ERR(inode)) {
|
||||||
inode->i_op = &ext4_file_inode_operations;
|
inode->i_op = &ext4_file_inode_operations;
|
||||||
if (test_opt(inode->i_sb, DAX))
|
inode->i_fop = &ext4_file_operations;
|
||||||
inode->i_fop = &ext4_dax_file_operations;
|
|
||||||
else
|
|
||||||
inode->i_fop = &ext4_file_operations;
|
|
||||||
ext4_set_aops(inode);
|
ext4_set_aops(inode);
|
||||||
err = ext4_add_nondir(handle, dentry, inode);
|
err = ext4_add_nondir(handle, dentry, inode);
|
||||||
if (!err && IS_DIRSYNC(dir))
|
if (!err && IS_DIRSYNC(dir))
|
||||||
|
@ -2302,10 +2299,7 @@ static int ext4_tmpfile(struct inode *dir, struct dentry *dentry, umode_t mode)
|
||||||
err = PTR_ERR(inode);
|
err = PTR_ERR(inode);
|
||||||
if (!IS_ERR(inode)) {
|
if (!IS_ERR(inode)) {
|
||||||
inode->i_op = &ext4_file_inode_operations;
|
inode->i_op = &ext4_file_inode_operations;
|
||||||
if (test_opt(inode->i_sb, DAX))
|
inode->i_fop = &ext4_file_operations;
|
||||||
inode->i_fop = &ext4_dax_file_operations;
|
|
||||||
else
|
|
||||||
inode->i_fop = &ext4_file_operations;
|
|
||||||
ext4_set_aops(inode);
|
ext4_set_aops(inode);
|
||||||
d_tmpfile(dentry, inode);
|
d_tmpfile(dentry, inode);
|
||||||
err = ext4_orphan_add(handle, inode);
|
err = ext4_orphan_add(handle, inode);
|
||||||
|
|
|
@ -523,6 +523,9 @@ ssize_t generic_file_splice_read(struct file *in, loff_t *ppos,
|
||||||
loff_t isize, left;
|
loff_t isize, left;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
if (IS_DAX(in->f_mapping->host))
|
||||||
|
return default_file_splice_read(in, ppos, pipe, len, flags);
|
||||||
|
|
||||||
isize = i_size_read(in->f_mapping->host);
|
isize = i_size_read(in->f_mapping->host);
|
||||||
if (unlikely(*ppos >= isize))
|
if (unlikely(*ppos >= isize))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue