fuse: convert readdir to simple api
The old fuse_read_fill() helper can be deleted, now that the last user is gone. The fuse_io_args struct is moved to fuse_i.h so it can be shared between readdir/read code. Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
This commit is contained in:
parent
134831e36b
commit
43f5098eb8
|
@ -532,42 +532,6 @@ static int fuse_fsync(struct file *file, loff_t start, loff_t end,
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
void fuse_read_fill(struct fuse_req *req, struct file *file, loff_t pos,
|
|
||||||
size_t count, int opcode)
|
|
||||||
{
|
|
||||||
struct fuse_read_in *inarg = &req->misc.read.in;
|
|
||||||
struct fuse_file *ff = file->private_data;
|
|
||||||
|
|
||||||
inarg->fh = ff->fh;
|
|
||||||
inarg->offset = pos;
|
|
||||||
inarg->size = count;
|
|
||||||
inarg->flags = file->f_flags;
|
|
||||||
req->in.h.opcode = opcode;
|
|
||||||
req->in.h.nodeid = ff->nodeid;
|
|
||||||
req->in.numargs = 1;
|
|
||||||
req->in.args[0].size = sizeof(struct fuse_read_in);
|
|
||||||
req->in.args[0].value = inarg;
|
|
||||||
req->out.argvar = 1;
|
|
||||||
req->out.numargs = 1;
|
|
||||||
req->out.args[0].size = count;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct fuse_io_args {
|
|
||||||
union {
|
|
||||||
struct {
|
|
||||||
struct fuse_read_in in;
|
|
||||||
u64 attr_ver;
|
|
||||||
} read;
|
|
||||||
struct {
|
|
||||||
struct fuse_write_in in;
|
|
||||||
struct fuse_write_out out;
|
|
||||||
} write;
|
|
||||||
};
|
|
||||||
struct fuse_args_pages ap;
|
|
||||||
struct fuse_io_priv *io;
|
|
||||||
struct fuse_file *ff;
|
|
||||||
};
|
|
||||||
|
|
||||||
void fuse_read_args_fill(struct fuse_io_args *ia, struct file *file, loff_t pos,
|
void fuse_read_args_fill(struct fuse_io_args *ia, struct file *file, loff_t pos,
|
||||||
size_t count, int opcode)
|
size_t count, int opcode)
|
||||||
{
|
{
|
||||||
|
|
|
@ -830,11 +830,28 @@ void fuse_queue_forget(struct fuse_conn *fc, struct fuse_forget_link *forget,
|
||||||
|
|
||||||
struct fuse_forget_link *fuse_alloc_forget(void);
|
struct fuse_forget_link *fuse_alloc_forget(void);
|
||||||
|
|
||||||
/**
|
/*
|
||||||
* Initialize READ or READDIR request
|
* Initialize READ or READDIR request
|
||||||
*/
|
*/
|
||||||
void fuse_read_fill(struct fuse_req *req, struct file *file,
|
struct fuse_io_args {
|
||||||
loff_t pos, size_t count, int opcode);
|
union {
|
||||||
|
struct {
|
||||||
|
struct fuse_read_in in;
|
||||||
|
u64 attr_ver;
|
||||||
|
} read;
|
||||||
|
struct {
|
||||||
|
struct fuse_write_in in;
|
||||||
|
struct fuse_write_out out;
|
||||||
|
} write;
|
||||||
|
};
|
||||||
|
struct fuse_args_pages ap;
|
||||||
|
struct fuse_io_priv *io;
|
||||||
|
struct fuse_file *ff;
|
||||||
|
};
|
||||||
|
|
||||||
|
void fuse_read_args_fill(struct fuse_io_args *ia, struct file *file, loff_t pos,
|
||||||
|
size_t count, int opcode);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send OPEN or OPENDIR request
|
* Send OPEN or OPENDIR request
|
||||||
|
|
|
@ -316,62 +316,55 @@ static int parse_dirplusfile(char *buf, size_t nbytes, struct file *file,
|
||||||
|
|
||||||
static int fuse_readdir_uncached(struct file *file, struct dir_context *ctx)
|
static int fuse_readdir_uncached(struct file *file, struct dir_context *ctx)
|
||||||
{
|
{
|
||||||
int plus, err;
|
int plus;
|
||||||
size_t nbytes;
|
ssize_t res;
|
||||||
struct page *page;
|
struct page *page;
|
||||||
struct inode *inode = file_inode(file);
|
struct inode *inode = file_inode(file);
|
||||||
struct fuse_conn *fc = get_fuse_conn(inode);
|
struct fuse_conn *fc = get_fuse_conn(inode);
|
||||||
struct fuse_req *req;
|
struct fuse_io_args ia = {};
|
||||||
|
struct fuse_args_pages *ap = &ia.ap;
|
||||||
|
struct fuse_page_desc desc = { .length = PAGE_SIZE };
|
||||||
u64 attr_version = 0;
|
u64 attr_version = 0;
|
||||||
bool locked;
|
bool locked;
|
||||||
|
|
||||||
req = fuse_get_req(fc, 1);
|
|
||||||
if (IS_ERR(req))
|
|
||||||
return PTR_ERR(req);
|
|
||||||
|
|
||||||
page = alloc_page(GFP_KERNEL);
|
page = alloc_page(GFP_KERNEL);
|
||||||
if (!page) {
|
if (!page)
|
||||||
fuse_put_request(fc, req);
|
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
|
||||||
|
|
||||||
plus = fuse_use_readdirplus(inode, ctx);
|
plus = fuse_use_readdirplus(inode, ctx);
|
||||||
req->out.argpages = 1;
|
ap->args.out_pages = 1;
|
||||||
req->num_pages = 1;
|
ap->num_pages = 1;
|
||||||
req->pages[0] = page;
|
ap->pages = &page;
|
||||||
req->page_descs[0].length = PAGE_SIZE;
|
ap->descs = &desc;
|
||||||
if (plus) {
|
if (plus) {
|
||||||
attr_version = fuse_get_attr_version(fc);
|
attr_version = fuse_get_attr_version(fc);
|
||||||
fuse_read_fill(req, file, ctx->pos, PAGE_SIZE,
|
fuse_read_args_fill(&ia, file, ctx->pos, PAGE_SIZE,
|
||||||
FUSE_READDIRPLUS);
|
FUSE_READDIRPLUS);
|
||||||
} else {
|
} else {
|
||||||
fuse_read_fill(req, file, ctx->pos, PAGE_SIZE,
|
fuse_read_args_fill(&ia, file, ctx->pos, PAGE_SIZE,
|
||||||
FUSE_READDIR);
|
FUSE_READDIR);
|
||||||
}
|
}
|
||||||
locked = fuse_lock_inode(inode);
|
locked = fuse_lock_inode(inode);
|
||||||
fuse_request_send(fc, req);
|
res = fuse_simple_request(fc, &ap->args);
|
||||||
fuse_unlock_inode(inode, locked);
|
fuse_unlock_inode(inode, locked);
|
||||||
nbytes = req->out.args[0].size;
|
if (res >= 0) {
|
||||||
err = req->out.h.error;
|
if (!res) {
|
||||||
fuse_put_request(fc, req);
|
|
||||||
if (!err) {
|
|
||||||
if (!nbytes) {
|
|
||||||
struct fuse_file *ff = file->private_data;
|
struct fuse_file *ff = file->private_data;
|
||||||
|
|
||||||
if (ff->open_flags & FOPEN_CACHE_DIR)
|
if (ff->open_flags & FOPEN_CACHE_DIR)
|
||||||
fuse_readdir_cache_end(file, ctx->pos);
|
fuse_readdir_cache_end(file, ctx->pos);
|
||||||
} else if (plus) {
|
} else if (plus) {
|
||||||
err = parse_dirplusfile(page_address(page), nbytes,
|
res = parse_dirplusfile(page_address(page), res,
|
||||||
file, ctx, attr_version);
|
file, ctx, attr_version);
|
||||||
} else {
|
} else {
|
||||||
err = parse_dirfile(page_address(page), nbytes, file,
|
res = parse_dirfile(page_address(page), res, file,
|
||||||
ctx);
|
ctx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
__free_page(page);
|
__free_page(page);
|
||||||
fuse_invalidate_atime(inode);
|
fuse_invalidate_atime(inode);
|
||||||
return err;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
enum fuse_parse_result {
|
enum fuse_parse_result {
|
||||||
|
|
Loading…
Reference in New Issue