Commit 33826ebb authored by Miklos Szeredi's avatar Miklos Szeredi

fuse: convert writepages to simple api

Derive fuse_writepage_args from fuse_io_args.

Sending the request is tricky since it was done with fi->lock held, hence
we must either use atomic allocation or release the lock.  Both are
possible so try atomic first and if it fails, release the lock and do the
regular allocation with GFP_NOFS and __GFP_NOFAIL.  Both flags are
necessary for correct operation.

Move the page realloc function from dev.c to file.c and convert to using
fuse_writepage_args.

The last caller of fuse_write_fill() is gone, so get rid of it.
Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
parent 43f5098e
...@@ -96,33 +96,6 @@ static void fuse_req_pages_free(struct fuse_req *req) ...@@ -96,33 +96,6 @@ static void fuse_req_pages_free(struct fuse_req *req)
kfree(req->pages); kfree(req->pages);
} }
bool fuse_req_realloc_pages(struct fuse_conn *fc, struct fuse_req *req,
gfp_t flags)
{
struct page **pages;
struct fuse_page_desc *page_descs;
unsigned int npages = min_t(unsigned int,
max_t(unsigned int, req->max_pages * 2,
FUSE_DEFAULT_MAX_PAGES_PER_REQ),
fc->max_pages);
WARN_ON(npages <= req->max_pages);
pages = fuse_pages_alloc(npages, flags, &page_descs);
if (!pages)
return false;
memcpy(pages, req->pages, sizeof(struct page *) * req->max_pages);
memcpy(page_descs, req->page_descs,
sizeof(struct fuse_page_desc) * req->max_pages);
fuse_req_pages_free(req);
__set_bit(FR_ALLOC_PAGES, &req->flags);
req->pages = pages;
req->page_descs = page_descs;
req->max_pages = npages;
return true;
}
void fuse_request_free(struct fuse_req *req) void fuse_request_free(struct fuse_req *req)
{ {
fuse_req_pages_free(req); fuse_req_pages_free(req);
......
This diff is collapsed.
...@@ -932,9 +932,6 @@ struct fuse_req *fuse_request_alloc_nofs(unsigned npages); ...@@ -932,9 +932,6 @@ struct fuse_req *fuse_request_alloc_nofs(unsigned npages);
struct page **fuse_pages_alloc(unsigned int npages, gfp_t flags, struct page **fuse_pages_alloc(unsigned int npages, gfp_t flags,
struct fuse_page_desc **desc); struct fuse_page_desc **desc);
bool fuse_req_realloc_pages(struct fuse_conn *fc, struct fuse_req *req,
gfp_t flags);
/** /**
* Free a request * Free a request
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment