@@ -828,7 +828,7 @@ static int iomap_write_begin(struct iomap_iter *iter, loff_t pos,
828
828
return status ;
829
829
}
830
830
831
- static size_t __iomap_write_end (struct inode * inode , loff_t pos , size_t len ,
831
+ static bool __iomap_write_end (struct inode * inode , loff_t pos , size_t len ,
832
832
size_t copied , struct folio * folio )
833
833
{
834
834
flush_dcache_folio (folio );
@@ -845,14 +845,14 @@ static size_t __iomap_write_end(struct inode *inode, loff_t pos, size_t len,
845
845
* redo the whole thing.
846
846
*/
847
847
if (unlikely (copied < len && !folio_test_uptodate (folio )))
848
- return 0 ;
848
+ return false ;
849
849
iomap_set_range_uptodate (folio , offset_in_folio (folio , pos ), len );
850
850
iomap_set_range_dirty (folio , offset_in_folio (folio , pos ), copied );
851
851
filemap_dirty_folio (inode -> i_mapping , folio );
852
- return copied ;
852
+ return true ;
853
853
}
854
854
855
- static size_t iomap_write_end_inline (const struct iomap_iter * iter ,
855
+ static void iomap_write_end_inline (const struct iomap_iter * iter ,
856
856
struct folio * folio , loff_t pos , size_t copied )
857
857
{
858
858
const struct iomap * iomap = & iter -> iomap ;
@@ -867,20 +867,31 @@ static size_t iomap_write_end_inline(const struct iomap_iter *iter,
867
867
kunmap_local (addr );
868
868
869
869
mark_inode_dirty (iter -> inode );
870
- return copied ;
871
870
}
872
871
873
- /* Returns the number of bytes copied. May be 0. Cannot be an errno. */
874
- static size_t iomap_write_end (struct iomap_iter * iter , loff_t pos , size_t len ,
872
+ /*
873
+ * Returns true if all copied bytes have been written to the pagecache,
874
+ * otherwise return false.
875
+ */
876
+ static bool iomap_write_end (struct iomap_iter * iter , loff_t pos , size_t len ,
875
877
size_t copied , struct folio * folio )
876
878
{
877
879
const struct iomap * srcmap = iomap_iter_srcmap (iter );
878
880
879
- if (srcmap -> type == IOMAP_INLINE )
880
- return iomap_write_end_inline (iter , folio , pos , copied );
881
- if (srcmap -> flags & IOMAP_F_BUFFER_HEAD )
882
- return block_write_end (NULL , iter -> inode -> i_mapping , pos , len ,
883
- copied , & folio -> page , NULL );
881
+ if (srcmap -> type == IOMAP_INLINE ) {
882
+ iomap_write_end_inline (iter , folio , pos , copied );
883
+ return true;
884
+ }
885
+
886
+ if (srcmap -> flags & IOMAP_F_BUFFER_HEAD ) {
887
+ size_t bh_written ;
888
+
889
+ bh_written = block_write_end (NULL , iter -> inode -> i_mapping , pos ,
890
+ len , copied , & folio -> page , NULL );
891
+ WARN_ON_ONCE (bh_written != copied && bh_written != 0 );
892
+ return bh_written == copied ;
893
+ }
894
+
884
895
return __iomap_write_end (iter -> inode , pos , len , copied , folio );
885
896
}
886
897
@@ -945,7 +956,8 @@ static loff_t iomap_write_iter(struct iomap_iter *iter, struct iov_iter *i)
945
956
flush_dcache_folio (folio );
946
957
947
958
copied = copy_folio_from_iter_atomic (folio , offset , bytes , i );
948
- written = iomap_write_end (iter , pos , bytes , copied , folio );
959
+ written = iomap_write_end (iter , pos , bytes , copied , folio ) ?
960
+ copied : 0 ;
949
961
950
962
/*
951
963
* Update the in-memory inode size after copying the data into
@@ -1323,6 +1335,7 @@ static loff_t iomap_unshare_iter(struct iomap_iter *iter)
1323
1335
int status ;
1324
1336
size_t offset ;
1325
1337
size_t bytes = min_t (u64 , SIZE_MAX , length );
1338
+ bool ret ;
1326
1339
1327
1340
status = iomap_write_begin (iter , pos , bytes , & folio );
1328
1341
if (unlikely (status ))
@@ -1334,9 +1347,9 @@ static loff_t iomap_unshare_iter(struct iomap_iter *iter)
1334
1347
if (bytes > folio_size (folio ) - offset )
1335
1348
bytes = folio_size (folio ) - offset ;
1336
1349
1337
- bytes = iomap_write_end (iter , pos , bytes , bytes , folio );
1350
+ ret = iomap_write_end (iter , pos , bytes , bytes , folio );
1338
1351
__iomap_put_folio (iter , pos , bytes , folio );
1339
- if (WARN_ON_ONCE (bytes == 0 ))
1352
+ if (WARN_ON_ONCE (! ret ))
1340
1353
return - EIO ;
1341
1354
1342
1355
cond_resched ();
@@ -1385,6 +1398,7 @@ static loff_t iomap_zero_iter(struct iomap_iter *iter, bool *did_zero)
1385
1398
int status ;
1386
1399
size_t offset ;
1387
1400
size_t bytes = min_t (u64 , SIZE_MAX , length );
1401
+ bool ret ;
1388
1402
1389
1403
status = iomap_write_begin (iter , pos , bytes , & folio );
1390
1404
if (status )
@@ -1399,9 +1413,9 @@ static loff_t iomap_zero_iter(struct iomap_iter *iter, bool *did_zero)
1399
1413
folio_zero_range (folio , offset , bytes );
1400
1414
folio_mark_accessed (folio );
1401
1415
1402
- bytes = iomap_write_end (iter , pos , bytes , bytes , folio );
1416
+ ret = iomap_write_end (iter , pos , bytes , bytes , folio );
1403
1417
__iomap_put_folio (iter , pos , bytes , folio );
1404
- if (WARN_ON_ONCE (bytes == 0 ))
1418
+ if (WARN_ON_ONCE (! ret ))
1405
1419
return - EIO ;
1406
1420
1407
1421
pos += bytes ;
0 commit comments