@@ -736,28 +736,27 @@ static int __iomap_write_begin(const struct iomap_iter *iter, size_t len,
736736 return 0 ;
737737}
738738
739- static struct folio * __iomap_get_folio (struct iomap_iter * iter , size_t len )
739+ static struct folio * __iomap_get_folio (struct iomap_iter * iter ,
740+ const struct iomap_write_ops * write_ops , size_t len )
740741{
741- const struct iomap_folio_ops * folio_ops = iter -> iomap .folio_ops ;
742742 loff_t pos = iter -> pos ;
743743
744744 if (!mapping_large_folio_support (iter -> inode -> i_mapping ))
745745 len = min_t (size_t , len , PAGE_SIZE - offset_in_page (pos ));
746746
747- if (folio_ops && folio_ops -> get_folio )
748- return folio_ops -> get_folio (iter , pos , len );
749- else
750- return iomap_get_folio (iter , pos , len );
747+ if (write_ops && write_ops -> get_folio )
748+ return write_ops -> get_folio (iter , pos , len );
749+ return iomap_get_folio (iter , pos , len );
751750}
752751
753- static void __iomap_put_folio (struct iomap_iter * iter , size_t ret ,
752+ static void __iomap_put_folio (struct iomap_iter * iter ,
753+ const struct iomap_write_ops * write_ops , size_t ret ,
754754 struct folio * folio )
755755{
756- const struct iomap_folio_ops * folio_ops = iter -> iomap .folio_ops ;
757756 loff_t pos = iter -> pos ;
758757
759- if (folio_ops && folio_ops -> put_folio ) {
760- folio_ops -> put_folio (iter -> inode , pos , ret , folio );
758+ if (write_ops && write_ops -> put_folio ) {
759+ write_ops -> put_folio (iter -> inode , pos , ret , folio );
761760 } else {
762761 folio_unlock (folio );
763762 folio_put (folio );
@@ -794,10 +793,10 @@ static int iomap_write_begin_inline(const struct iomap_iter *iter,
794793 * offset, and length. Callers can optionally pass a max length *plen,
795794 * otherwise init to zero.
796795 */
797- static int iomap_write_begin (struct iomap_iter * iter , struct folio * * foliop ,
796+ static int iomap_write_begin (struct iomap_iter * iter ,
797+ const struct iomap_write_ops * write_ops , struct folio * * foliop ,
798798 size_t * poffset , u64 * plen )
799799{
800- const struct iomap_folio_ops * folio_ops = iter -> iomap .folio_ops ;
801800 const struct iomap * srcmap = iomap_iter_srcmap (iter );
802801 loff_t pos = iter -> pos ;
803802 u64 len = min_t (u64 , SIZE_MAX , iomap_length (iter ));
@@ -812,7 +811,7 @@ static int iomap_write_begin(struct iomap_iter *iter, struct folio **foliop,
812811 if (fatal_signal_pending (current ))
813812 return - EINTR ;
814813
815- folio = __iomap_get_folio (iter , len );
814+ folio = __iomap_get_folio (iter , write_ops , len );
816815 if (IS_ERR (folio ))
817816 return PTR_ERR (folio );
818817
@@ -826,8 +825,8 @@ static int iomap_write_begin(struct iomap_iter *iter, struct folio **foliop,
826825 * could do the wrong thing here (zero a page range incorrectly or fail
827826 * to zero) and corrupt data.
828827 */
829- if (folio_ops && folio_ops -> iomap_valid ) {
830- bool iomap_valid = folio_ops -> iomap_valid (iter -> inode ,
828+ if (write_ops && write_ops -> iomap_valid ) {
829+ bool iomap_valid = write_ops -> iomap_valid (iter -> inode ,
831830 & iter -> iomap );
832831 if (!iomap_valid ) {
833832 iter -> iomap .flags |= IOMAP_F_STALE ;
@@ -853,8 +852,7 @@ static int iomap_write_begin(struct iomap_iter *iter, struct folio **foliop,
853852 return 0 ;
854853
855854out_unlock :
856- __iomap_put_folio (iter , 0 , folio );
857-
855+ __iomap_put_folio (iter , write_ops , 0 , folio );
858856 return status ;
859857}
860858
@@ -926,7 +924,8 @@ static bool iomap_write_end(struct iomap_iter *iter, size_t len, size_t copied,
926924 return __iomap_write_end (iter -> inode , pos , len , copied , folio );
927925}
928926
929- static int iomap_write_iter (struct iomap_iter * iter , struct iov_iter * i )
927+ static int iomap_write_iter (struct iomap_iter * iter , struct iov_iter * i ,
928+ const struct iomap_write_ops * write_ops )
930929{
931930 ssize_t total_written = 0 ;
932931 int status = 0 ;
@@ -970,7 +969,8 @@ static int iomap_write_iter(struct iomap_iter *iter, struct iov_iter *i)
970969 break ;
971970 }
972971
973- status = iomap_write_begin (iter , & folio , & offset , & bytes );
972+ status = iomap_write_begin (iter , write_ops , & folio , & offset ,
973+ & bytes );
974974 if (unlikely (status )) {
975975 iomap_write_failed (iter -> inode , iter -> pos , bytes );
976976 break ;
@@ -999,7 +999,7 @@ static int iomap_write_iter(struct iomap_iter *iter, struct iov_iter *i)
999999 i_size_write (iter -> inode , pos + written );
10001000 iter -> iomap .flags |= IOMAP_F_SIZE_CHANGED ;
10011001 }
1002- __iomap_put_folio (iter , written , folio );
1002+ __iomap_put_folio (iter , write_ops , written , folio );
10031003
10041004 if (old_size < pos )
10051005 pagecache_isize_extended (iter -> inode , old_size , pos );
@@ -1032,7 +1032,8 @@ static int iomap_write_iter(struct iomap_iter *iter, struct iov_iter *i)
10321032
10331033ssize_t
10341034iomap_file_buffered_write (struct kiocb * iocb , struct iov_iter * i ,
1035- const struct iomap_ops * ops , void * private )
1035+ const struct iomap_ops * ops ,
1036+ const struct iomap_write_ops * write_ops , void * private )
10361037{
10371038 struct iomap_iter iter = {
10381039 .inode = iocb -> ki_filp -> f_mapping -> host ,
@@ -1049,7 +1050,7 @@ iomap_file_buffered_write(struct kiocb *iocb, struct iov_iter *i,
10491050 iter .flags |= IOMAP_DONTCACHE ;
10501051
10511052 while ((ret = iomap_iter (& iter , ops )) > 0 )
1052- iter .status = iomap_write_iter (& iter , i );
1053+ iter .status = iomap_write_iter (& iter , i , write_ops );
10531054
10541055 if (unlikely (iter .pos == iocb -> ki_pos ))
10551056 return ret ;
@@ -1283,7 +1284,8 @@ void iomap_write_delalloc_release(struct inode *inode, loff_t start_byte,
12831284}
12841285EXPORT_SYMBOL_GPL (iomap_write_delalloc_release );
12851286
1286- static int iomap_unshare_iter (struct iomap_iter * iter )
1287+ static int iomap_unshare_iter (struct iomap_iter * iter ,
1288+ const struct iomap_write_ops * write_ops )
12871289{
12881290 struct iomap * iomap = & iter -> iomap ;
12891291 u64 bytes = iomap_length (iter );
@@ -1298,14 +1300,15 @@ static int iomap_unshare_iter(struct iomap_iter *iter)
12981300 bool ret ;
12991301
13001302 bytes = min_t (u64 , SIZE_MAX , bytes );
1301- status = iomap_write_begin (iter , & folio , & offset , & bytes );
1303+ status = iomap_write_begin (iter , write_ops , & folio , & offset ,
1304+ & bytes );
13021305 if (unlikely (status ))
13031306 return status ;
13041307 if (iomap -> flags & IOMAP_F_STALE )
13051308 break ;
13061309
13071310 ret = iomap_write_end (iter , bytes , bytes , folio );
1308- __iomap_put_folio (iter , bytes , folio );
1311+ __iomap_put_folio (iter , write_ops , bytes , folio );
13091312 if (WARN_ON_ONCE (!ret ))
13101313 return - EIO ;
13111314
@@ -1323,7 +1326,8 @@ static int iomap_unshare_iter(struct iomap_iter *iter)
13231326
13241327int
13251328iomap_file_unshare (struct inode * inode , loff_t pos , loff_t len ,
1326- const struct iomap_ops * ops )
1329+ const struct iomap_ops * ops ,
1330+ const struct iomap_write_ops * write_ops )
13271331{
13281332 struct iomap_iter iter = {
13291333 .inode = inode ,
@@ -1338,7 +1342,7 @@ iomap_file_unshare(struct inode *inode, loff_t pos, loff_t len,
13381342
13391343 iter .len = min (len , size - pos );
13401344 while ((ret = iomap_iter (& iter , ops )) > 0 )
1341- iter .status = iomap_unshare_iter (& iter );
1345+ iter .status = iomap_unshare_iter (& iter , write_ops );
13421346 return ret ;
13431347}
13441348EXPORT_SYMBOL_GPL (iomap_file_unshare );
@@ -1357,7 +1361,8 @@ static inline int iomap_zero_iter_flush_and_stale(struct iomap_iter *i)
13571361 return filemap_write_and_wait_range (mapping , i -> pos , end );
13581362}
13591363
1360- static int iomap_zero_iter (struct iomap_iter * iter , bool * did_zero )
1364+ static int iomap_zero_iter (struct iomap_iter * iter , bool * did_zero ,
1365+ const struct iomap_write_ops * write_ops )
13611366{
13621367 u64 bytes = iomap_length (iter );
13631368 int status ;
@@ -1368,7 +1373,8 @@ static int iomap_zero_iter(struct iomap_iter *iter, bool *did_zero)
13681373 bool ret ;
13691374
13701375 bytes = min_t (u64 , SIZE_MAX , bytes );
1371- status = iomap_write_begin (iter , & folio , & offset , & bytes );
1376+ status = iomap_write_begin (iter , write_ops , & folio , & offset ,
1377+ & bytes );
13721378 if (status )
13731379 return status ;
13741380 if (iter -> iomap .flags & IOMAP_F_STALE )
@@ -1381,7 +1387,7 @@ static int iomap_zero_iter(struct iomap_iter *iter, bool *did_zero)
13811387 folio_mark_accessed (folio );
13821388
13831389 ret = iomap_write_end (iter , bytes , bytes , folio );
1384- __iomap_put_folio (iter , bytes , folio );
1390+ __iomap_put_folio (iter , write_ops , bytes , folio );
13851391 if (WARN_ON_ONCE (!ret ))
13861392 return - EIO ;
13871393
@@ -1397,7 +1403,8 @@ static int iomap_zero_iter(struct iomap_iter *iter, bool *did_zero)
13971403
13981404int
13991405iomap_zero_range (struct inode * inode , loff_t pos , loff_t len , bool * did_zero ,
1400- const struct iomap_ops * ops , void * private )
1406+ const struct iomap_ops * ops ,
1407+ const struct iomap_write_ops * write_ops , void * private )
14011408{
14021409 struct iomap_iter iter = {
14031410 .inode = inode ,
@@ -1427,7 +1434,8 @@ iomap_zero_range(struct inode *inode, loff_t pos, loff_t len, bool *did_zero,
14271434 filemap_range_needs_writeback (mapping , pos , pos + plen - 1 )) {
14281435 iter .len = plen ;
14291436 while ((ret = iomap_iter (& iter , ops )) > 0 )
1430- iter .status = iomap_zero_iter (& iter , did_zero );
1437+ iter .status = iomap_zero_iter (& iter , did_zero ,
1438+ write_ops );
14311439
14321440 iter .len = len - (iter .pos - pos );
14331441 if (ret || !iter .len )
@@ -1458,15 +1466,16 @@ iomap_zero_range(struct inode *inode, loff_t pos, loff_t len, bool *did_zero,
14581466 continue ;
14591467 }
14601468
1461- iter .status = iomap_zero_iter (& iter , did_zero );
1469+ iter .status = iomap_zero_iter (& iter , did_zero , write_ops );
14621470 }
14631471 return ret ;
14641472}
14651473EXPORT_SYMBOL_GPL (iomap_zero_range );
14661474
14671475int
14681476iomap_truncate_page (struct inode * inode , loff_t pos , bool * did_zero ,
1469- const struct iomap_ops * ops , void * private )
1477+ const struct iomap_ops * ops ,
1478+ const struct iomap_write_ops * write_ops , void * private )
14701479{
14711480 unsigned int blocksize = i_blocksize (inode );
14721481 unsigned int off = pos & (blocksize - 1 );
@@ -1475,7 +1484,7 @@ iomap_truncate_page(struct inode *inode, loff_t pos, bool *did_zero,
14751484 if (!off )
14761485 return 0 ;
14771486 return iomap_zero_range (inode , pos , blocksize - off , did_zero , ops ,
1478- private );
1487+ write_ops , private );
14791488}
14801489EXPORT_SYMBOL_GPL (iomap_truncate_page );
14811490
0 commit comments