@@ -734,28 +734,27 @@ static int __iomap_write_begin(const struct iomap_iter *iter, size_t len,
734734 return 0 ;
735735}
736736
737- static struct folio * __iomap_get_folio (struct iomap_iter * iter , size_t len )
737+ static struct folio * __iomap_get_folio (struct iomap_iter * iter ,
738+ const struct iomap_write_ops * write_ops , size_t len )
738739{
739- const struct iomap_folio_ops * folio_ops = iter -> iomap .folio_ops ;
740740 loff_t pos = iter -> pos ;
741741
742742 if (!mapping_large_folio_support (iter -> inode -> i_mapping ))
743743 len = min_t (size_t , len , PAGE_SIZE - offset_in_page (pos ));
744744
745- if (folio_ops && folio_ops -> get_folio )
746- return folio_ops -> get_folio (iter , pos , len );
747- else
748- return iomap_get_folio (iter , pos , len );
745+ if (write_ops && write_ops -> get_folio )
746+ return write_ops -> get_folio (iter , pos , len );
747+ return iomap_get_folio (iter , pos , len );
749748}
750749
751- static void __iomap_put_folio (struct iomap_iter * iter , size_t ret ,
750+ static void __iomap_put_folio (struct iomap_iter * iter ,
751+ const struct iomap_write_ops * write_ops , size_t ret ,
752752 struct folio * folio )
753753{
754- const struct iomap_folio_ops * folio_ops = iter -> iomap .folio_ops ;
755754 loff_t pos = iter -> pos ;
756755
757- if (folio_ops && folio_ops -> put_folio ) {
758- folio_ops -> put_folio (iter -> inode , pos , ret , folio );
756+ if (write_ops && write_ops -> put_folio ) {
757+ write_ops -> put_folio (iter -> inode , pos , ret , folio );
759758 } else {
760759 folio_unlock (folio );
761760 folio_put (folio );
@@ -792,10 +791,10 @@ static int iomap_write_begin_inline(const struct iomap_iter *iter,
792791 * offset, and length. Callers can optionally pass a max length *plen,
793792 * otherwise init to zero.
794793 */
795- static int iomap_write_begin (struct iomap_iter * iter , struct folio * * foliop ,
794+ static int iomap_write_begin (struct iomap_iter * iter ,
795+ const struct iomap_write_ops * write_ops , struct folio * * foliop ,
796796 size_t * poffset , u64 * plen )
797797{
798- const struct iomap_folio_ops * folio_ops = iter -> iomap .folio_ops ;
799798 const struct iomap * srcmap = iomap_iter_srcmap (iter );
800799 loff_t pos = iter -> pos ;
801800 u64 len = min_t (u64 , SIZE_MAX , iomap_length (iter ));
@@ -810,7 +809,7 @@ static int iomap_write_begin(struct iomap_iter *iter, struct folio **foliop,
810809 if (fatal_signal_pending (current ))
811810 return - EINTR ;
812811
813- folio = __iomap_get_folio (iter , len );
812+ folio = __iomap_get_folio (iter , write_ops , len );
814813 if (IS_ERR (folio ))
815814 return PTR_ERR (folio );
816815
@@ -824,8 +823,8 @@ static int iomap_write_begin(struct iomap_iter *iter, struct folio **foliop,
824823 * could do the wrong thing here (zero a page range incorrectly or fail
825824 * to zero) and corrupt data.
826825 */
827- if (folio_ops && folio_ops -> iomap_valid ) {
828- bool iomap_valid = folio_ops -> iomap_valid (iter -> inode ,
826+ if (write_ops && write_ops -> iomap_valid ) {
827+ bool iomap_valid = write_ops -> iomap_valid (iter -> inode ,
829828 & iter -> iomap );
830829 if (!iomap_valid ) {
831830 iter -> iomap .flags |= IOMAP_F_STALE ;
@@ -851,8 +850,7 @@ static int iomap_write_begin(struct iomap_iter *iter, struct folio **foliop,
851850 return 0 ;
852851
853852out_unlock :
854- __iomap_put_folio (iter , 0 , folio );
855-
853+ __iomap_put_folio (iter , write_ops , 0 , folio );
856854 return status ;
857855}
858856
@@ -924,7 +922,8 @@ static bool iomap_write_end(struct iomap_iter *iter, size_t len, size_t copied,
924922 return __iomap_write_end (iter -> inode , pos , len , copied , folio );
925923}
926924
927- static int iomap_write_iter (struct iomap_iter * iter , struct iov_iter * i )
925+ static int iomap_write_iter (struct iomap_iter * iter , struct iov_iter * i ,
926+ const struct iomap_write_ops * write_ops )
928927{
929928 ssize_t total_written = 0 ;
930929 int status = 0 ;
@@ -968,7 +967,8 @@ static int iomap_write_iter(struct iomap_iter *iter, struct iov_iter *i)
968967 break ;
969968 }
970969
971- status = iomap_write_begin (iter , & folio , & offset , & bytes );
970+ status = iomap_write_begin (iter , write_ops , & folio , & offset ,
971+ & bytes );
972972 if (unlikely (status )) {
973973 iomap_write_failed (iter -> inode , iter -> pos , bytes );
974974 break ;
@@ -997,7 +997,7 @@ static int iomap_write_iter(struct iomap_iter *iter, struct iov_iter *i)
997997 i_size_write (iter -> inode , pos + written );
998998 iter -> iomap .flags |= IOMAP_F_SIZE_CHANGED ;
999999 }
1000- __iomap_put_folio (iter , written , folio );
1000+ __iomap_put_folio (iter , write_ops , written , folio );
10011001
10021002 if (old_size < pos )
10031003 pagecache_isize_extended (iter -> inode , old_size , pos );
@@ -1030,7 +1030,8 @@ static int iomap_write_iter(struct iomap_iter *iter, struct iov_iter *i)
10301030
10311031ssize_t
10321032iomap_file_buffered_write (struct kiocb * iocb , struct iov_iter * i ,
1033- const struct iomap_ops * ops , void * private )
1033+ const struct iomap_ops * ops ,
1034+ const struct iomap_write_ops * write_ops , void * private )
10341035{
10351036 struct iomap_iter iter = {
10361037 .inode = iocb -> ki_filp -> f_mapping -> host ,
@@ -1045,7 +1046,7 @@ iomap_file_buffered_write(struct kiocb *iocb, struct iov_iter *i,
10451046 iter .flags |= IOMAP_NOWAIT ;
10461047
10471048 while ((ret = iomap_iter (& iter , ops )) > 0 )
1048- iter .status = iomap_write_iter (& iter , i );
1049+ iter .status = iomap_write_iter (& iter , i , write_ops );
10491050
10501051 if (unlikely (iter .pos == iocb -> ki_pos ))
10511052 return ret ;
@@ -1279,7 +1280,8 @@ void iomap_write_delalloc_release(struct inode *inode, loff_t start_byte,
12791280}
12801281EXPORT_SYMBOL_GPL (iomap_write_delalloc_release );
12811282
1282- static int iomap_unshare_iter (struct iomap_iter * iter )
1283+ static int iomap_unshare_iter (struct iomap_iter * iter ,
1284+ const struct iomap_write_ops * write_ops )
12831285{
12841286 struct iomap * iomap = & iter -> iomap ;
12851287 u64 bytes = iomap_length (iter );
@@ -1294,14 +1296,15 @@ static int iomap_unshare_iter(struct iomap_iter *iter)
12941296 bool ret ;
12951297
12961298 bytes = min_t (u64 , SIZE_MAX , bytes );
1297- status = iomap_write_begin (iter , & folio , & offset , & bytes );
1299+ status = iomap_write_begin (iter , write_ops , & folio , & offset ,
1300+ & bytes );
12981301 if (unlikely (status ))
12991302 return status ;
13001303 if (iomap -> flags & IOMAP_F_STALE )
13011304 break ;
13021305
13031306 ret = iomap_write_end (iter , bytes , bytes , folio );
1304- __iomap_put_folio (iter , bytes , folio );
1307+ __iomap_put_folio (iter , write_ops , bytes , folio );
13051308 if (WARN_ON_ONCE (!ret ))
13061309 return - EIO ;
13071310
@@ -1319,7 +1322,8 @@ static int iomap_unshare_iter(struct iomap_iter *iter)
13191322
13201323int
13211324iomap_file_unshare (struct inode * inode , loff_t pos , loff_t len ,
1322- const struct iomap_ops * ops )
1325+ const struct iomap_ops * ops ,
1326+ const struct iomap_write_ops * write_ops )
13231327{
13241328 struct iomap_iter iter = {
13251329 .inode = inode ,
@@ -1334,7 +1338,7 @@ iomap_file_unshare(struct inode *inode, loff_t pos, loff_t len,
13341338
13351339 iter .len = min (len , size - pos );
13361340 while ((ret = iomap_iter (& iter , ops )) > 0 )
1337- iter .status = iomap_unshare_iter (& iter );
1341+ iter .status = iomap_unshare_iter (& iter , write_ops );
13381342 return ret ;
13391343}
13401344EXPORT_SYMBOL_GPL (iomap_file_unshare );
@@ -1353,7 +1357,8 @@ static inline int iomap_zero_iter_flush_and_stale(struct iomap_iter *i)
13531357 return filemap_write_and_wait_range (mapping , i -> pos , end );
13541358}
13551359
1356- static int iomap_zero_iter (struct iomap_iter * iter , bool * did_zero )
1360+ static int iomap_zero_iter (struct iomap_iter * iter , bool * did_zero ,
1361+ const struct iomap_write_ops * write_ops )
13571362{
13581363 u64 bytes = iomap_length (iter );
13591364 int status ;
@@ -1364,7 +1369,8 @@ static int iomap_zero_iter(struct iomap_iter *iter, bool *did_zero)
13641369 bool ret ;
13651370
13661371 bytes = min_t (u64 , SIZE_MAX , bytes );
1367- status = iomap_write_begin (iter , & folio , & offset , & bytes );
1372+ status = iomap_write_begin (iter , write_ops , & folio , & offset ,
1373+ & bytes );
13681374 if (status )
13691375 return status ;
13701376 if (iter -> iomap .flags & IOMAP_F_STALE )
@@ -1377,7 +1383,7 @@ static int iomap_zero_iter(struct iomap_iter *iter, bool *did_zero)
13771383 folio_mark_accessed (folio );
13781384
13791385 ret = iomap_write_end (iter , bytes , bytes , folio );
1380- __iomap_put_folio (iter , bytes , folio );
1386+ __iomap_put_folio (iter , write_ops , bytes , folio );
13811387 if (WARN_ON_ONCE (!ret ))
13821388 return - EIO ;
13831389
@@ -1393,7 +1399,8 @@ static int iomap_zero_iter(struct iomap_iter *iter, bool *did_zero)
13931399
13941400int
13951401iomap_zero_range (struct inode * inode , loff_t pos , loff_t len , bool * did_zero ,
1396- const struct iomap_ops * ops , void * private )
1402+ const struct iomap_ops * ops ,
1403+ const struct iomap_write_ops * write_ops , void * private )
13971404{
13981405 struct iomap_iter iter = {
13991406 .inode = inode ,
@@ -1423,7 +1430,8 @@ iomap_zero_range(struct inode *inode, loff_t pos, loff_t len, bool *did_zero,
14231430 filemap_range_needs_writeback (mapping , pos , pos + plen - 1 )) {
14241431 iter .len = plen ;
14251432 while ((ret = iomap_iter (& iter , ops )) > 0 )
1426- iter .status = iomap_zero_iter (& iter , did_zero );
1433+ iter .status = iomap_zero_iter (& iter , did_zero ,
1434+ write_ops );
14271435
14281436 iter .len = len - (iter .pos - pos );
14291437 if (ret || !iter .len )
@@ -1454,15 +1462,16 @@ iomap_zero_range(struct inode *inode, loff_t pos, loff_t len, bool *did_zero,
14541462 continue ;
14551463 }
14561464
1457- iter .status = iomap_zero_iter (& iter , did_zero );
1465+ iter .status = iomap_zero_iter (& iter , did_zero , write_ops );
14581466 }
14591467 return ret ;
14601468}
14611469EXPORT_SYMBOL_GPL (iomap_zero_range );
14621470
14631471int
14641472iomap_truncate_page (struct inode * inode , loff_t pos , bool * did_zero ,
1465- const struct iomap_ops * ops , void * private )
1473+ const struct iomap_ops * ops ,
1474+ const struct iomap_write_ops * write_ops , void * private )
14661475{
14671476 unsigned int blocksize = i_blocksize (inode );
14681477 unsigned int off = pos & (blocksize - 1 );
@@ -1471,7 +1480,7 @@ iomap_truncate_page(struct inode *inode, loff_t pos, bool *did_zero,
14711480 if (!off )
14721481 return 0 ;
14731482 return iomap_zero_range (inode , pos , blocksize - off , did_zero , ops ,
1474- private );
1483+ write_ops , private );
14751484}
14761485EXPORT_SYMBOL_GPL (iomap_truncate_page );
14771486
0 commit comments