diff options
author | Maxim Patlasov <mpatlasov@parallels.com> | 2012-10-26 11:49:33 -0400 |
---|---|---|
committer | Miklos Szeredi <mszeredi@suse.cz> | 2013-01-24 10:21:27 -0500 |
commit | 85f40aec887110ae6bbefa87988def4606a3d583 (patch) | |
tree | 1408110166343717d8b2710f337882309451b7af /fs/fuse/dev.c | |
parent | b2430d7567a376b3685627ca7e9d712f6f27d49b (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.c | 7 |
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; |