@@ -665,11 +665,11 @@ static void fuse_release_user_pages(struct fuse_args_pages *ap, ssize_t nres,
665665{
666666 unsigned int i ;
667667
668- for (i = 0 ; i < ap -> num_pages ; i ++ ) {
668+ for (i = 0 ; i < ap -> num_folios ; i ++ ) {
669669 if (should_dirty )
670- set_page_dirty_lock (ap -> pages [i ]);
670+ folio_mark_dirty_lock (ap -> folios [i ]);
671671 if (ap -> args .is_pinned )
672- unpin_user_page (ap -> pages [i ]);
672+ unpin_folio (ap -> folios [i ]);
673673 }
674674
675675 if (nres > 0 && ap -> args .invalidate_vmap )
@@ -742,24 +742,6 @@ static void fuse_aio_complete(struct fuse_io_priv *io, int err, ssize_t pos)
742742 kref_put (& io -> refcnt , fuse_io_release );
743743}
744744
745- static struct fuse_io_args * fuse_io_alloc (struct fuse_io_priv * io ,
746- unsigned int npages )
747- {
748- struct fuse_io_args * ia ;
749-
750- ia = kzalloc (sizeof (* ia ), GFP_KERNEL );
751- if (ia ) {
752- ia -> io = io ;
753- ia -> ap .pages = fuse_pages_alloc (npages , GFP_KERNEL ,
754- & ia -> ap .descs );
755- if (!ia -> ap .pages ) {
756- kfree (ia );
757- ia = NULL ;
758- }
759- }
760- return ia ;
761- }
762-
763745static struct fuse_io_args * fuse_io_folios_alloc (struct fuse_io_priv * io ,
764746 unsigned int nfolios )
765747{
@@ -779,12 +761,6 @@ static struct fuse_io_args *fuse_io_folios_alloc(struct fuse_io_priv *io,
779761 return ia ;
780762}
781763
782- static void fuse_io_free (struct fuse_io_args * ia )
783- {
784- kfree (ia -> ap .pages );
785- kfree (ia );
786- }
787-
788764static void fuse_io_folios_free (struct fuse_io_args * ia )
789765{
790766 kfree (ia -> ap .folios );
@@ -821,7 +797,7 @@ static void fuse_aio_complete_req(struct fuse_mount *fm, struct fuse_args *args,
821797 fuse_release_user_pages (& ia -> ap , err ?: nres , io -> should_dirty );
822798
823799 fuse_aio_complete (io , err , pos );
824- fuse_io_free (ia );
800+ fuse_io_folios_free (ia );
825801}
826802
827803static ssize_t fuse_async_req_send (struct fuse_mount * fm ,
@@ -1531,6 +1507,7 @@ static int fuse_get_user_pages(struct fuse_args_pages *ap, struct iov_iter *ii,
15311507 bool use_pages_for_kvec_io )
15321508{
15331509 bool flush_or_invalidate = false;
1510+ unsigned int nr_pages = 0 ;
15341511 size_t nbytes = 0 ; /* # bytes already packed in req */
15351512 ssize_t ret = 0 ;
15361513
@@ -1560,31 +1537,44 @@ static int fuse_get_user_pages(struct fuse_args_pages *ap, struct iov_iter *ii,
15601537 }
15611538 }
15621539
1563- while (nbytes < * nbytesp && ap -> num_pages < max_pages ) {
1564- unsigned npages ;
1540+ /*
1541+ * Until there is support for iov_iter_extract_folios(), we have to
1542+ * manually extract pages using iov_iter_extract_pages() and then
1543+ * copy that to a folios array.
1544+ */
1545+ struct page * * pages = kzalloc (max_pages * sizeof (struct page * ),
1546+ GFP_KERNEL );
1547+ if (!pages )
1548+ return - ENOMEM ;
1549+
1550+ while (nbytes < * nbytesp && nr_pages < max_pages ) {
1551+ unsigned nfolios , i ;
15651552 size_t start ;
1566- struct page * * pt_pages ;
15671553
1568- pt_pages = & ap -> pages [ap -> num_pages ];
1569- ret = iov_iter_extract_pages (ii , & pt_pages ,
1554+ ret = iov_iter_extract_pages (ii , & pages ,
15701555 * nbytesp - nbytes ,
1571- max_pages - ap -> num_pages ,
1556+ max_pages - nr_pages ,
15721557 0 , & start );
15731558 if (ret < 0 )
15741559 break ;
15751560
15761561 nbytes += ret ;
15771562
15781563 ret += start ;
1579- npages = DIV_ROUND_UP (ret , PAGE_SIZE );
1564+ /* Currently, all folios in FUSE are one page */
1565+ nfolios = DIV_ROUND_UP (ret , PAGE_SIZE );
15801566
1581- ap -> descs [ap -> num_pages ].offset = start ;
1582- fuse_page_descs_length_init (ap -> descs , ap -> num_pages , npages );
1567+ ap -> folio_descs [ap -> num_folios ].offset = start ;
1568+ fuse_folio_descs_length_init (ap -> folio_descs , ap -> num_folios , nfolios );
1569+ for (i = 0 ; i < nfolios ; i ++ )
1570+ ap -> folios [i + ap -> num_folios ] = page_folio (pages [i ]);
15831571
1584- ap -> num_pages += npages ;
1585- ap -> descs [ap -> num_pages - 1 ].length -=
1572+ ap -> num_folios += nfolios ;
1573+ ap -> folio_descs [ap -> num_folios - 1 ].length -=
15861574 (PAGE_SIZE - ret ) & (PAGE_SIZE - 1 );
1575+ nr_pages += nfolios ;
15871576 }
1577+ kfree (pages );
15881578
15891579 if (write && flush_or_invalidate )
15901580 flush_kernel_vmap_range (ap -> args .vmap_base , nbytes );
@@ -1624,14 +1614,14 @@ ssize_t fuse_direct_io(struct fuse_io_priv *io, struct iov_iter *iter,
16241614 bool fopen_direct_io = ff -> open_flags & FOPEN_DIRECT_IO ;
16251615
16261616 max_pages = iov_iter_npages (iter , fc -> max_pages );
1627- ia = fuse_io_alloc (io , max_pages );
1617+ ia = fuse_io_folios_alloc (io , max_pages );
16281618 if (!ia )
16291619 return - ENOMEM ;
16301620
16311621 if (fopen_direct_io && fc -> direct_io_allow_mmap ) {
16321622 res = filemap_write_and_wait_range (mapping , pos , pos + count - 1 );
16331623 if (res ) {
1634- fuse_io_free (ia );
1624+ fuse_io_folios_free (ia );
16351625 return res ;
16361626 }
16371627 }
@@ -1646,7 +1636,7 @@ ssize_t fuse_direct_io(struct fuse_io_priv *io, struct iov_iter *iter,
16461636 if (fopen_direct_io && write ) {
16471637 res = invalidate_inode_pages2_range (mapping , idx_from , idx_to );
16481638 if (res ) {
1649- fuse_io_free (ia );
1639+ fuse_io_folios_free (ia );
16501640 return res ;
16511641 }
16521642 }
@@ -1673,7 +1663,7 @@ ssize_t fuse_direct_io(struct fuse_io_priv *io, struct iov_iter *iter,
16731663
16741664 if (!io -> async || nres < 0 ) {
16751665 fuse_release_user_pages (& ia -> ap , nres , io -> should_dirty );
1676- fuse_io_free (ia );
1666+ fuse_io_folios_free (ia );
16771667 }
16781668 ia = NULL ;
16791669 if (nres < 0 ) {
@@ -1692,13 +1682,13 @@ ssize_t fuse_direct_io(struct fuse_io_priv *io, struct iov_iter *iter,
16921682 }
16931683 if (count ) {
16941684 max_pages = iov_iter_npages (iter , fc -> max_pages );
1695- ia = fuse_io_alloc (io , max_pages );
1685+ ia = fuse_io_folios_alloc (io , max_pages );
16961686 if (!ia )
16971687 break ;
16981688 }
16991689 }
17001690 if (ia )
1701- fuse_io_free (ia );
1691+ fuse_io_folios_free (ia );
17021692 if (res > 0 )
17031693 * ppos = pos ;
17041694
0 commit comments