mirror of
https://github.com/torvalds/linux.git
synced 2026-06-08 14:42:37 +02:00
Revert "FROMLIST: fuse: Handle asynchronous read and write in passthrough"
This reverts commit aa525f2e91.
Change-Id: I5463b359168f0d13190470ae5ccea0d05cd55ba2
Signed-off-by: Alessio Balsini <balsini@google.com>
This commit is contained in:
parent
6ee117d8c1
commit
b9eef19ad3
|
|
@ -6,11 +6,6 @@
|
|||
#include <linux/idr.h>
|
||||
#include <linux/uio.h>
|
||||
|
||||
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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user