Use the generic direct_write_fallback helper instead of duplicating the
logic.

Signed-off-by: Christoph Hellwig <h...@lst.de>
---
 fs/fuse/file.c | 27 +++------------------------
 1 file changed, 3 insertions(+), 24 deletions(-)

diff --git a/fs/fuse/file.c b/fs/fuse/file.c
index 5f7b58798f99fc..02ab446ab57f1f 100644
--- a/fs/fuse/file.c
+++ b/fs/fuse/file.c
@@ -1340,11 +1340,9 @@ static ssize_t fuse_cache_write_iter(struct kiocb *iocb, 
struct iov_iter *from)
        struct file *file = iocb->ki_filp;
        struct address_space *mapping = file->f_mapping;
        ssize_t written = 0;
-       ssize_t written_buffered = 0;
        struct inode *inode = mapping->host;
        ssize_t err;
        struct fuse_conn *fc = get_fuse_conn(inode);
-       loff_t endbyte = 0;
 
        if (fc->writeback_cache) {
                /* Update size (EOF optimization) and mode (SUID clearing) */
@@ -1382,28 +1380,9 @@ static ssize_t fuse_cache_write_iter(struct kiocb *iocb, 
struct iov_iter *from)
 
        if (iocb->ki_flags & IOCB_DIRECT) {
                written = generic_file_direct_write(iocb, from);
-               if (written < 0 || !iov_iter_count(from))
-                       goto out;
-
-               written_buffered = fuse_perform_write(iocb, from);
-               if (written_buffered < 0) {
-                       err = written_buffered;
-                       goto out;
-               }
-               endbyte = iocb->ki_pos + written_buffered - 1;
-
-               err = filemap_write_and_wait_range(file->f_mapping,
-                                                  iocb->ki_pos,
-                                                  endbyte);
-               if (err)
-                       goto out;
-
-               invalidate_mapping_pages(file->f_mapping,
-                                        iocb->ki_pos >> PAGE_SHIFT,
-                                        endbyte >> PAGE_SHIFT);
-
-               written += written_buffered;
-               iocb->ki_pos += written_buffered;
+               if (written >= 0 && iov_iter_count(from))
+                       written = direct_write_fallback(iocb, from, written,
+                                       fuse_perform_write(iocb, from));
        } else {
                written = fuse_perform_write(iocb, from);
        }
-- 
2.39.2

Reply via email to