@@ -1849,7 +1849,7 @@ static int fuse_retrieve(struct fuse_mount *fm, struct inode *inode,
1849
1849
unsigned int num ;
1850
1850
unsigned int offset ;
1851
1851
size_t total_len = 0 ;
1852
- unsigned int num_pages , cur_pages = 0 ;
1852
+ unsigned int num_pages ;
1853
1853
struct fuse_conn * fc = fm -> fc ;
1854
1854
struct fuse_retrieve_args * ra ;
1855
1855
size_t args_size = sizeof (* ra );
@@ -1867,6 +1867,7 @@ static int fuse_retrieve(struct fuse_mount *fm, struct inode *inode,
1867
1867
1868
1868
num_pages = (num + offset + PAGE_SIZE - 1 ) >> PAGE_SHIFT ;
1869
1869
num_pages = min (num_pages , fc -> max_pages );
1870
+ num = min (num , num_pages << PAGE_SHIFT );
1870
1871
1871
1872
args_size += num_pages * (sizeof (ap -> folios [0 ]) + sizeof (ap -> descs [0 ]));
1872
1873
@@ -1887,25 +1888,29 @@ static int fuse_retrieve(struct fuse_mount *fm, struct inode *inode,
1887
1888
1888
1889
index = outarg -> offset >> PAGE_SHIFT ;
1889
1890
1890
- while (num && cur_pages < num_pages ) {
1891
+ while (num ) {
1891
1892
struct folio * folio ;
1892
- unsigned int this_num ;
1893
+ unsigned int folio_offset ;
1894
+ unsigned int nr_bytes ;
1895
+ unsigned int nr_pages ;
1893
1896
1894
1897
folio = filemap_get_folio (mapping , index );
1895
1898
if (IS_ERR (folio ))
1896
1899
break ;
1897
1900
1898
- this_num = min_t (unsigned , num , PAGE_SIZE - offset );
1901
+ folio_offset = ((index - folio -> index ) << PAGE_SHIFT ) + offset ;
1902
+ nr_bytes = min (folio_size (folio ) - folio_offset , num );
1903
+ nr_pages = (offset + nr_bytes + PAGE_SIZE - 1 ) >> PAGE_SHIFT ;
1904
+
1899
1905
ap -> folios [ap -> num_folios ] = folio ;
1900
- ap -> descs [ap -> num_folios ].offset = offset ;
1901
- ap -> descs [ap -> num_folios ].length = this_num ;
1906
+ ap -> descs [ap -> num_folios ].offset = folio_offset ;
1907
+ ap -> descs [ap -> num_folios ].length = nr_bytes ;
1902
1908
ap -> num_folios ++ ;
1903
- cur_pages ++ ;
1904
1909
1905
1910
offset = 0 ;
1906
- num -= this_num ;
1907
- total_len += this_num ;
1908
- index ++ ;
1911
+ num -= nr_bytes ;
1912
+ total_len += nr_bytes ;
1913
+ index += nr_pages ;
1909
1914
}
1910
1915
ra -> inarg .offset = outarg -> offset ;
1911
1916
ra -> inarg .size = total_len ;
0 commit comments