The original dax patchset split the ext2/4_file_operations
because of the two NULL splice_read/splice_write in the dax
case.

At vfs if splice_read/splice_write are NULL would 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, ...).

CC: Dave Chinner <[email protected]>
CC: Matthew Wilcox <[email protected]>
Signed-off-by: Boaz Harrosh <[email protected]>
---
 fs/ext2/ext2.h  |  1 -
 fs/ext2/file.c  | 18 ------------------
 fs/ext2/inode.c |  5 +----
 fs/ext2/namei.c | 10 ++--------
 fs/ext4/ext4.h  |  1 -
 fs/ext4/file.c  | 20 --------------------
 fs/ext4/inode.c |  5 +----
 fs/ext4/namei.c | 10 ++--------
 fs/splice.c     |  3 +++
 9 files changed, 9 insertions(+), 64 deletions(-)

diff --git a/fs/ext2/ext2.h b/fs/ext2/ext2.h
index 678f9ab..8d15feb 100644
--- a/fs/ext2/ext2.h
+++ b/fs/ext2/ext2.h
@@ -793,7 +793,6 @@ extern int ext2_fsync(struct file *file, loff_t start, 
loff_t end,
                      int datasync);
 extern const struct inode_operations ext2_file_inode_operations;
 extern const struct file_operations ext2_file_operations;
-extern const struct file_operations ext2_dax_file_operations;
 
 /* inode.c */
 extern const struct address_space_operations ext2_aops;
diff --git a/fs/ext2/file.c b/fs/ext2/file.c
index 866a3ce..19cac93 100644
--- a/fs/ext2/file.c
+++ b/fs/ext2/file.c
@@ -109,24 +109,6 @@ const struct file_operations ext2_file_operations = {
        .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 = {
 #ifdef CONFIG_EXT2_FS_XATTR
        .setxattr       = generic_setxattr,
diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c
index df9d6af..b29eb67 100644
--- a/fs/ext2/inode.c
+++ b/fs/ext2/inode.c
@@ -1388,10 +1388,7 @@ struct inode *ext2_iget (struct super_block *sb, 
unsigned long ino)
 
        if (S_ISREG(inode->i_mode)) {
                inode->i_op = &ext2_file_inode_operations;
-               if (test_opt(inode->i_sb, DAX)) {
-                       inode->i_mapping->a_ops = &ext2_aops;
-                       inode->i_fop = &ext2_dax_file_operations;
-               } else if (test_opt(inode->i_sb, NOBH)) {
+               if (test_opt(inode->i_sb, NOBH)) {
                        inode->i_mapping->a_ops = &ext2_nobh_aops;
                        inode->i_fop = &ext2_file_operations;
                } else {
diff --git a/fs/ext2/namei.c b/fs/ext2/namei.c
index 148f6e3..ce42293 100644
--- a/fs/ext2/namei.c
+++ b/fs/ext2/namei.c
@@ -104,10 +104,7 @@ static int ext2_create (struct inode * dir, struct dentry 
* dentry, umode_t mode
                return PTR_ERR(inode);
 
        inode->i_op = &ext2_file_inode_operations;
-       if (test_opt(inode->i_sb, DAX)) {
-               inode->i_mapping->a_ops = &ext2_aops;
-               inode->i_fop = &ext2_dax_file_operations;
-       } else if (test_opt(inode->i_sb, NOBH)) {
+       if (test_opt(inode->i_sb, NOBH)) {
                inode->i_mapping->a_ops = &ext2_nobh_aops;
                inode->i_fop = &ext2_file_operations;
        } else {
@@ -125,10 +122,7 @@ static int ext2_tmpfile(struct inode *dir, struct dentry 
*dentry, umode_t mode)
                return PTR_ERR(inode);
 
        inode->i_op = &ext2_file_inode_operations;
-       if (test_opt(inode->i_sb, DAX)) {
-               inode->i_mapping->a_ops = &ext2_aops;
-               inode->i_fop = &ext2_dax_file_operations;
-       } else if (test_opt(inode->i_sb, NOBH)) {
+       if (test_opt(inode->i_sb, NOBH)) {
                inode->i_mapping->a_ops = &ext2_nobh_aops;
                inode->i_fop = &ext2_file_operations;
        } else {
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
index f63c3d5..8a3981e 100644
--- a/fs/ext4/ext4.h
+++ b/fs/ext4/ext4.h
@@ -2593,7 +2593,6 @@ extern const struct file_operations ext4_dir_operations;
 /* file.c */
 extern const struct inode_operations ext4_file_inode_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);
 
 /* inline.c */
diff --git a/fs/ext4/file.c b/fs/ext4/file.c
index aa78c70..e6d4280 100644
--- a/fs/ext4/file.c
+++ b/fs/ext4/file.c
@@ -625,26 +625,6 @@ const struct file_operations ext4_file_operations = {
        .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 = {
        .setattr        = ext4_setattr,
        .getattr        = ext4_getattr,
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index a3f4513..035b7a0 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -4090,10 +4090,7 @@ struct inode *ext4_iget(struct super_block *sb, unsigned 
long ino)
 
        if (S_ISREG(inode->i_mode)) {
                inode->i_op = &ext4_file_inode_operations;
-               if (test_opt(inode->i_sb, DAX))
-                       inode->i_fop = &ext4_dax_file_operations;
-               else
-                       inode->i_fop = &ext4_file_operations;
+               inode->i_fop = &ext4_file_operations;
                ext4_set_aops(inode);
        } else if (S_ISDIR(inode->i_mode)) {
                inode->i_op = &ext4_dir_inode_operations;
diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c
index 28fe71a..2291923 100644
--- a/fs/ext4/namei.c
+++ b/fs/ext4/namei.c
@@ -2235,10 +2235,7 @@ retry:
        err = PTR_ERR(inode);
        if (!IS_ERR(inode)) {
                inode->i_op = &ext4_file_inode_operations;
-               if (test_opt(inode->i_sb, DAX))
-                       inode->i_fop = &ext4_dax_file_operations;
-               else
-                       inode->i_fop = &ext4_file_operations;
+               inode->i_fop = &ext4_file_operations;
                ext4_set_aops(inode);
                err = ext4_add_nondir(handle, dentry, inode);
                if (!err && IS_DIRSYNC(dir))
@@ -2302,10 +2299,7 @@ retry:
        err = PTR_ERR(inode);
        if (!IS_ERR(inode)) {
                inode->i_op = &ext4_file_inode_operations;
-               if (test_opt(inode->i_sb, DAX))
-                       inode->i_fop = &ext4_dax_file_operations;
-               else
-                       inode->i_fop = &ext4_file_operations;
+               inode->i_fop = &ext4_file_operations;
                ext4_set_aops(inode);
                d_tmpfile(dentry, inode);
                err = ext4_orphan_add(handle, inode);
diff --git a/fs/splice.c b/fs/splice.c
index 41cbb16..476024b 100644
--- a/fs/splice.c
+++ b/fs/splice.c
@@ -523,6 +523,9 @@ ssize_t generic_file_splice_read(struct file *in, loff_t 
*ppos,
        loff_t isize, left;
        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);
        if (unlikely(*ppos >= isize))
                return 0;
-- 
1.9.3


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to