static ssize_t cuse_read_iter(struct kiocb *kiocb, struct iov_iter *to)
{
- struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(kiocb->ki_filp);
+ struct fuse_io_priv io = { .async = 0, .file = kiocb->ki_filp };
loff_t pos = 0;
return fuse_direct_io(&io, to, &pos, FUSE_DIO_CUSE);
static ssize_t cuse_write_iter(struct kiocb *kiocb, struct iov_iter *from)
{
- struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(kiocb->ki_filp);
+ struct fuse_io_priv io = { .async = 0, .file = kiocb->ki_filp };
loff_t pos = 0;
/*
* No locking or generic_write_checks(), the server is
}
}
-static void fuse_io_release(struct kref *kref)
-{
- kfree(container_of(kref, struct fuse_io_priv, refcnt));
-}
-
static ssize_t fuse_get_res_by_io(struct fuse_io_priv *io)
{
if (io->err)
}
io->iocb->ki_complete(io->iocb, res, 0);
+ kfree(io);
}
-
- kref_put(&io->refcnt, fuse_io_release);
}
static void fuse_aio_complete_req(struct fuse_conn *fc, struct fuse_req *req)
size_t num_bytes, struct fuse_io_priv *io)
{
spin_lock(&io->lock);
- kref_get(&io->refcnt);
io->size += num_bytes;
io->reqs++;
spin_unlock(&io->lock);
static int fuse_do_readpage(struct file *file, struct page *page)
{
- struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(file);
+ struct fuse_io_priv io = { .async = 0, .file = file };
struct inode *inode = page->mapping->host;
struct fuse_conn *fc = get_fuse_conn(inode);
struct fuse_req *req;
size_t res;
unsigned offset;
unsigned i;
- struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(file);
+ struct fuse_io_priv io = { .async = 0, .file = file };
for (i = 0; i < req->num_pages; i++)
fuse_wait_on_page_writeback(inode, req->pages[i]->index);
static ssize_t fuse_direct_read_iter(struct kiocb *iocb, struct iov_iter *to)
{
- struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(iocb->ki_filp);
+ struct fuse_io_priv io = { .async = 0, .file = iocb->ki_filp };
return __fuse_direct_read(&io, to, &iocb->ki_pos);
}
{
struct file *file = iocb->ki_filp;
struct inode *inode = file_inode(file);
- struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(file);
+ struct fuse_io_priv io = { .async = 0, .file = file };
ssize_t res;
if (is_bad_inode(inode))
if (!io)
return -ENOMEM;
spin_lock_init(&io->lock);
- kref_init(&io->refcnt);
io->reqs = 1;
io->bytes = -1;
io->size = 0;
iov_iter_rw(iter) == WRITE)
io->async = false;
- if (io->async && is_sync) {
- /*
- * Additional reference to keep io around after
- * calling fuse_aio_complete()
- */
- kref_get(&io->refcnt);
+ if (io->async && is_sync)
io->done = &wait;
- }
if (iov_iter_rw(iter) == WRITE) {
ret = fuse_direct_io(io, iter, &pos, FUSE_DIO_WRITE);
ret = fuse_get_res_by_io(io);
}
- kref_put(&io->refcnt, fuse_io_release);
+ kfree(io);
if (iov_iter_rw(iter) == WRITE) {
if (ret > 0)
#include <linux/workqueue.h>
#include <linux/pid_namespace.h>
#include <linux/user_namespace.h>
-#include <linux/kref.h>
/** Max number of pages that can be used in a single read request */
#define FUSE_MAX_PAGES_PER_REQ 32
/** The request IO state (for asynchronous processing) */
struct fuse_io_priv {
- struct kref refcnt;
int async;
spinlock_t lock;
unsigned reqs;
struct completion *done;
};
-#define FUSE_IO_PRIV_SYNC(f) \
-{ \
- .refcnt = { ATOMIC_INIT(1) }, \
- .async = 0, \
- .file = f, \
-}
-
/**
* Request flags
*