summaryrefslogtreecommitdiffstats
path: root/fs/fuse/dev.c
diff options
context:
space:
mode:
authorMaxim Patlasov <mpatlasov@parallels.com>2012-10-26 11:49:33 -0400
committerMiklos Szeredi <mszeredi@suse.cz>2013-01-24 10:21:27 -0500
commit85f40aec887110ae6bbefa87988def4606a3d583 (patch)
tree1408110166343717d8b2710f337882309451b7af /fs/fuse/dev.c
parentb2430d7567a376b3685627ca7e9d712f6f27d49b (diff)
fuse: use req->page_descs[] for argpages cases
Previously, anyone who set flag 'argpages' only filled req->pages[] and set per-request page_offset. This patch re-works all cases where argpages=1 to fill req->page_descs[] properly. Having req->page_descs[] filled properly allows to re-work fuse_copy_pages() to copy page fragments described by req->page_descs[]. This will be useful for next patches optimizing direct_IO. Signed-off-by: Maxim Patlasov <mpatlasov@parallels.com> Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
Diffstat (limited to 'fs/fuse/dev.c')
-rw-r--r--fs/fuse/dev.c7
1 files changed, 3 insertions, 4 deletions
diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c
index db4af8f3886a..cbae09e5a491 100644
--- a/fs/fuse/dev.c
+++ b/fs/fuse/dev.c
@@ -903,11 +903,11 @@ static int fuse_copy_pages(struct fuse_copy_state *cs, unsigned nbytes,
903{ 903{
904 unsigned i; 904 unsigned i;
905 struct fuse_req *req = cs->req; 905 struct fuse_req *req = cs->req;
906 unsigned offset = req->page_descs[0].offset;
907 unsigned count = min(nbytes, (unsigned) PAGE_SIZE - offset);
908 906
909 for (i = 0; i < req->num_pages && (nbytes || zeroing); i++) { 907 for (i = 0; i < req->num_pages && (nbytes || zeroing); i++) {
910 int err; 908 int err;
909 unsigned offset = req->page_descs[i].offset;
910 unsigned count = min(nbytes, req->page_descs[i].length);
911 911
912 err = fuse_copy_page(cs, &req->pages[i], offset, count, 912 err = fuse_copy_page(cs, &req->pages[i], offset, count,
913 zeroing); 913 zeroing);
@@ -915,8 +915,6 @@ static int fuse_copy_pages(struct fuse_copy_state *cs, unsigned nbytes,
915 return err; 915 return err;
916 916
917 nbytes -= count; 917 nbytes -= count;
918 count = min(nbytes, (unsigned) PAGE_SIZE);
919 offset = 0;
920 } 918 }
921 return 0; 919 return 0;
922} 920}
@@ -1626,6 +1624,7 @@ static int fuse_retrieve(struct fuse_conn *fc, struct inode *inode,
1626 1624
1627 this_num = min_t(unsigned, num, PAGE_CACHE_SIZE - offset); 1625 this_num = min_t(unsigned, num, PAGE_CACHE_SIZE - offset);
1628 req->pages[req->num_pages] = page; 1626 req->pages[req->num_pages] = page;
1627 req->page_descs[req->num_pages].length = this_num;
1629 req->num_pages++; 1628 req->num_pages++;
1630 1629
1631 offset = 0; 1630 offset = 0;