diff --git a/fs/fuse/passthrough.c b/fs/fuse/passthrough.c index 10b6872cdaa7..5a78cb336db4 100644 --- a/fs/fuse/passthrough.c +++ b/fs/fuse/passthrough.c @@ -6,11 +6,6 @@ #include #include -struct fuse_aio_req { - struct kiocb iocb; - struct kiocb *iocb_fuse; -}; - static void fuse_copyattr(struct file *dst_file, struct file *src_file) { struct inode *dst = file_inode(dst_file); @@ -37,32 +32,6 @@ static inline rwf_t iocb_to_rw_flags(int ifl) return flags; } -static void fuse_aio_cleanup_handler(struct fuse_aio_req *aio_req) -{ - struct kiocb *iocb = &aio_req->iocb; - struct kiocb *iocb_fuse = aio_req->iocb_fuse; - - if (iocb->ki_flags & IOCB_WRITE) { - __sb_writers_acquired(file_inode(iocb->ki_filp)->i_sb, - SB_FREEZE_WRITE); - file_end_write(iocb->ki_filp); - fuse_copyattr(iocb_fuse->ki_filp, iocb->ki_filp); - } - - iocb_fuse->ki_pos = iocb->ki_pos; - kfree(aio_req); -} - -static void fuse_aio_rw_complete(struct kiocb *iocb, long res, long res2) -{ - struct fuse_aio_req *aio_req = - container_of(iocb, struct fuse_aio_req, iocb); - struct kiocb *iocb_fuse = aio_req->iocb_fuse; - - fuse_aio_cleanup_handler(aio_req); - iocb_fuse->ki_complete(iocb_fuse, res, res2); -} - ssize_t fuse_passthrough_read_iter(struct kiocb *iocb_fuse, struct iov_iter *iter) { @@ -74,23 +43,8 @@ ssize_t fuse_passthrough_read_iter(struct kiocb *iocb_fuse, if (!iov_iter_count(iter)) return 0; - if (is_sync_kiocb(iocb_fuse)) { - ret = vfs_iter_read(passthrough_filp, iter, &iocb_fuse->ki_pos, - iocb_to_rw_flags(iocb_fuse->ki_flags)); - } else { - struct fuse_aio_req *aio_req; - - aio_req = kmalloc(sizeof(struct fuse_aio_req), GFP_KERNEL); - if (!aio_req) - return -ENOMEM; - - aio_req->iocb_fuse = iocb_fuse; - kiocb_clone(&aio_req->iocb, iocb_fuse, passthrough_filp); - aio_req->iocb.ki_complete = fuse_aio_rw_complete; - ret = call_read_iter(passthrough_filp, &aio_req->iocb, iter); - if (ret != -EIOCBQUEUED) - fuse_aio_cleanup_handler(aio_req); - } + ret = vfs_iter_read(passthrough_filp, iter, &iocb_fuse->ki_pos, + iocb_to_rw_flags(iocb_fuse->ki_flags)); return ret; } @@ -103,40 +57,19 @@ ssize_t fuse_passthrough_write_iter(struct kiocb *iocb_fuse, struct fuse_file *ff = fuse_filp->private_data; struct inode *fuse_inode = file_inode(fuse_filp); struct file *passthrough_filp = ff->passthrough.filp; - struct inode *passthrough_inode = file_inode(passthrough_filp); if (!iov_iter_count(iter)) return 0; inode_lock(fuse_inode); - if (is_sync_kiocb(iocb_fuse)) { - file_start_write(passthrough_filp); - ret = vfs_iter_write(passthrough_filp, iter, &iocb_fuse->ki_pos, - iocb_to_rw_flags(iocb_fuse->ki_flags)); - file_end_write(passthrough_filp); - if (ret > 0) - fuse_copyattr(fuse_filp, passthrough_filp); - } else { - struct fuse_aio_req *aio_req; + file_start_write(passthrough_filp); + ret = vfs_iter_write(passthrough_filp, iter, &iocb_fuse->ki_pos, + iocb_to_rw_flags(iocb_fuse->ki_flags)); + file_end_write(passthrough_filp); + if (ret > 0) + fuse_copyattr(fuse_filp, passthrough_filp); - aio_req = kmalloc(sizeof(struct fuse_aio_req), GFP_KERNEL); - if (!aio_req) { - ret = -ENOMEM; - goto out; - } - - file_start_write(passthrough_filp); - __sb_writers_release(passthrough_inode->i_sb, SB_FREEZE_WRITE); - - aio_req->iocb_fuse = iocb_fuse; - kiocb_clone(&aio_req->iocb, iocb_fuse, passthrough_filp); - aio_req->iocb.ki_complete = fuse_aio_rw_complete; - ret = call_write_iter(passthrough_filp, &aio_req->iocb, iter); - if (ret != -EIOCBQUEUED) - fuse_aio_cleanup_handler(aio_req); - } -out: inode_unlock(fuse_inode); return ret;